Ireport + java 动态开发从零开始全步骤详解 + 踩坑记录

1. 下载与安装

可以在https://community.jaspersoft.com/community-download下载程序的安装包,一般推荐下载Jaspersoft Studio,Ireport已经好多年没有更新了。

当然,这两个编辑器作用上来说是相同的。Jaspersoft Studio的界面更好看,使用友好。而ireport可以设置的参数更多更细,不过有不少参数已经被废弃,加入了新的值。对动态报表来说编辑器不再是主要的开发内容,选用喜欢的即可。本文就以ireport为例。

安装过程不再赘述。

Ireport安装完成后,如果你的JDK版本是1.8或以上的,会碰到第一个问题,ireport启动闪退。原因是ireport不支持JDK1.8。

解决:安装JDK7.1,修改安装目录

Jaspersoft\iReport-5.5.1\etc\ireport.conf 文件

新增一行

jdkhome="C:/Program Files/Java/jdk1.7.0_79"

这里的"C:/Program Files/Java/jdk1.7.0_79"是我本地JDK7的路径,请修改成自己的。

之后ireport就能顺利启动了。

运行后界面是这样的:


Ireport + java 动态开发从零开始全步骤详解 + 踩坑记录_第1张图片

2.开始使用

点击文件-new-report-Blank A4-Open this template新建一张空白报表,输入报表名称,路径,点击完成。

报表编辑界面如图


Ireport + java 动态开发从零开始全步骤详解 + 踩坑记录_第2张图片

最左一栏是报表的元素列表,包含

样式Styles

参数parameters

字段fields

变量variables

脚本scriptlets

报表的主体Title-Background

中间栏是编辑器,可选designer可视化编辑 xml源文件编辑。Preview是报表浏览视图。

最右是可视化编辑组件列表,包含了各种报表组件。如果找不到了可以在窗口-组件面板中重新打开它。


坑点:工具-组件面板中也有个组件面板。这个组件面板是空的,找组件面板的时候要注意不要找错。


3.生成报表

现在我们可以从最右组件面板中拖一个static text组件到编辑器的title区域中,输入内容调整一下位置和样式

Ireport + java 动态开发从零开始全步骤详解 + 踩坑记录_第3张图片

点击preview浏览报表

点击保存按钮,选择保存的格式

保存成功。

到这里,我们的报表就生成完毕了,教程结束——

是不可能的。

为了制作报表我们有必要了解报表的主体部分,

接下来开始,进入java代码环节。

可能会用到的依赖库

net.sf.jasperreports

jasperreports

6.9.0

com.lowagie

itext

2.1.7

4.报表组成

在前面的介绍中,我们已经用ireport生成了一份jrxml模板文件,就在第二步选择的路径中。我们加载这个jrxml文件,可以获得一个JasperDesign 对象。

这个JasperDesign对象是我们之后制作报表的基础。

JasperDesign jasperDesign = JRXmlLoader.load("D:/report1.jrxml");

从这个JasperDesign对象中,我们可以得到之前提到的最左的元素列表,如:

List jRParameterList = jasperDesign.getParametersList();

JRBand jRTitle = jasperDesign.getTitle();

JRBand jRPageHeader = jasperDesign.getPageHeader();

JRBand jRDetail[] = jasperDesign.getDetailSection().getBands();


可以看到,在可视化编辑器中的一个矩形区域对应一个JRBand,因为可以有多个Detail区域,所以所有Detail区域放在一个JRBand数组中。

获取到JRBand之后我们就可以轻松的往报表里面塞入各种各样的组件了。比方说,在title里面放入一个Text Field组件,Text Field组件的位置x,y,并设置值为参数TITLE

JRBand jRTitle = jasperDesign.getTitle();

JRDesignExpression expression = new JRDesignExpression("$P{TITLE}");

JRDesignTextField textField = new JRDesignTextField();

textField.setExpression(expression);

textField.setX(x);

textField.setY(y);

textField.setWidth(width);

textField.setHeight(height);

jRTitle.addElement(textField);

插入一张柱状图

JRDesignChart barChart = new JRDesignChart((JRDefaultStyleProvider) jasperDesign.getDefaultStyle(), JRChart.CHART_TYPE_BAR);

jRDetail[0].addElement(barChart);

插入一张表

JRDesignComponentElement componentElement = new JRDesignComponentElement((JRDefaultStyleProvider) jasperDesign.getDefaultStyle());

componentElement .setComponent(new StandardTable());

jRDetail[0].addElement(componentElement);


5.数据源

在填充报表数据之前,先来了解一下报表数据源。

一个数据源大致就是一个数据的集合。

在java中可以认为是一个对象的集合

报表数据源大致有报表的数据源(Datasource)和报表内部的数据集合(Dataset)两种,两者作用域有所不同。

被使用的数据源中的字段均需要在fields中添加

报表的数据源(Datasource)用于填充报表detail区域。

对数据源的每一条数据会生成一份detail。

比如使用了这个json作为报表数据源

Ireport + java 动态开发从零开始全步骤详解 + 踩坑记录_第4张图片

添加一个field name

在detail中添加一个text field,值为$F{name}

Ireport + java 动态开发从零开始全步骤详解 + 踩坑记录_第5张图片

点击preview

Ireport + java 动态开发从零开始全步骤详解 + 踩坑记录_第6张图片


可以看到detail区域被显示了两次,因为DataSource中有两条数据。

数据集合(Dataset)可以用于填充图、表的数据。

使用举例如下:

Parameters中添加一个collection变量DATA_SOURCE

新建一个叫New Dataset 1的Dataset

添加字段name

新增一张表格

右键-edit table datasoucre

Sub dataset选择New Dataset 1

Connection / Datesource Exception选择 Use datasource expression

内容填入

new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{DATA_SOURCE})


Ireport + java 动态开发从零开始全步骤详解 + 踩坑记录_第7张图片

像这样就可以轻松的为每个图、表设置各自的数据源。


6.填充数据

给图表,表格填充数据。

给图表,表格填充数据是需要知道它们数据的基本单元。

可以通过debug来找到。

举个例子,添加一张饼图的数据

//detail1的第0个元素是一张饼图

JRDesignChart chart = (JRDesignChart) detail1.getElements()[0];

JRDesignPieDataset ds = (JRDesignPieDataset)chart.getDataset();

JRDesignPieSeries jdps = new JRDesignPieSeries();

jdps.setKeyExpression(Expression);

jdps.setLabelExpression(Expression);

jdps.setValueExpression(Expression);

ds.addPieSeries(jdps);

chart.setDataset(ds);


//detail2的第0个元素是一张表

StandardTable table = (StandardTable) ((JRDesignComponentElement) detail2.getElements()[0]).getComponent();

StandardColumn column = new StandardColumn();//一列

//表头

DesignCell header = new DesignCell();

column.setColumnHeader(header);

//表身

DesignCell detail = new DesignCell();

column.setDetailCell(detail);

column.setWidth(width);

table.addColumn(column);

//设置表头表身的内容

detail.addElement(Element);

header.addElement(Element);7.编译报表

做好报表模板之后需要编译报表

使用软件编译报表十分简单,只需要点击一下preview边上的小锤子键即可

编译成功后会生成一个xxx.jasper文件

使用代码编译报表

JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);



7.导出报表

我们可以通过编译后得到的jasperReport对象或是jasper文件进行导出报表的操作。首先获取JasperPrint 对象

JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, map, new JRBeanCollectionDataSource(dbs));

JasperPrint jasperPrint = JasperFillManager.fillReport(inputFileName, map, new JRBeanCollectionDataSource(dbs));

注:这里用到两个参数,map是一个Map,会被追加到报表的parameters中。

另一个JRBeanCollectionDataSource是报表数据源(Datasource)。

然后调用JasperExportManager的export方法即可导出报表到指定目录

JasperExportManager.exportReportToHtmlFile(jasperPrint, outPutFile);


HTML:

JasperExportManager.exportReportToHtmlFile(jasperPrint, outPutFile);


PDF:

JasperExportManager.exportReportToPdfFile(jasperPrint, outPutFile);


DOC:

JRDocxExporter exporter = new JRDocxExporter();

ExporterInput exporterInput = new SimpleExporterInput(jasperPrint);

exporter.setExporterInput(exporterInput);

OutputStreamExporterOutput exporterOutput = new SimpleOutputStreamExporterOutput(outPutFile);

exporter.setExporterOutput(exporterOutput);

exporter.exportReport();


EXCEL:

JRXlsxExporter exporter = new JRXlsxExporter();

ExporterInput exporterInput = new SimpleExporterInput(jasperPrint);

exporter.setExporterInput(exporterInput);

OutputStreamExporterOutput exporterOutput = new SimpleOutputStreamExporterOutput(outPutFile);

exporter.setExporterOutput(exporterOutput);

exporter.exportReport();

更多格式的导出可以在jasperreport源码demo中找到


8.坑点整理

PDF不显示中文:

设置PDF字体,编码

pdfStyle.setPdfFontName("STSong-Light");

pdfStyle.setPdfEncoding("UniGB-UCS2-H");


使用Datasource与detail生成一张表格,想在表格前插入一张图表,图表得不到数据。在表格之后放入图表可以:

(推测)Datasource作用域在detail区域之后,对于之前的区域无效。

解决:为图表设置自己的dataset(参照5.数据源)。


导出PDF格式时,有部分报表超出页面后被遮挡:

原因:PDF格式一页宽度高度是A4纸的大小(595*842),报表宽高度需要小于等于该值,这样超出部分会被自动分页到下一页。


导出时提示找不到字体:

原因:如果window操作系统,大部分字体都会有,基本不会出现此问题。如果是linux系统,系统中没有生成报表所需的字体文件。

解决:参见制作字体包。


统计图在没有数据时,Y轴坐标显示E-1,E-2...等数值。

解决:设置RangeAxisMaxValue的值

说明:RangeAxisMaxValue这个参数是Y轴的最大刻度。统计图在默认情况下最大刻度是按你的数据中的最大值自适应的,一旦设置了之后就不管你的数据,最大刻度始终是设置的值。


Word设置fontsize无效:

这个问题只在导出word时会出现。当我给报表元素设置了StyleNameReference之后,不论我怎么设置fontsize的值,导出后的fontsize值始终为10.5。暂时没有找到解决方法,只能在需要导出word的情况下不使用style


9.制作字体包

Windows系统里已经自带了大部分的常用字体,所以很少会出现问题,而linux系统不像windows系统自带很多字体,把windows上写好的代码拿到linux机器上跑结果因为找不到字体而出现各种异常,如果要把用到的字体一个个安装也十分麻烦。而制作字体包则可以有效的解决这一问题,使其不再依赖系统字体包。


步骤:

先去github上下载一份jasperreports-code

https://github.com/dubrousky/jasperreports-code.git

进入jasperreports\ext\fonts文件夹下

把fonts下的文件拷贝到一个新目录,并导入该目录到一个新的java工程。

Ireport + java 动态开发从零开始全步骤详解 + 踩坑记录_第8张图片

修改fonts.xml文件

例如需要添加字体仿宋

增加下面一段代码

"仿宋">

net/sf/jasperreports/fonts/dejavu/simfang.ttf

net/sf/jasperreports/fonts/dejavu/simfang.ttf

net/sf/jasperreports/fonts/dejavu/simfang.ttf

net/sf/jasperreports/fonts/dejavu/simfang.ttf

Identity-H

true

"net.sf.jasperreports.html">'仿宋', Arial, Helvetica, sans-serif

把仿宋用到的字体文件simfang.ttf放到dejavu文件夹内。

把这个项目导出成jar包并添加到你的项目中。

你可能感兴趣的:(Ireport + java 动态开发从零开始全步骤详解 + 踩坑记录)