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就能顺利启动了。
运行后界面是这样的:
2.开始使用
点击文件-new-report-Blank A4-Open this template新建一张空白报表,输入报表名称,路径,点击完成。
报表编辑界面如图
最左一栏是报表的元素列表,包含
样式Styles
参数parameters
字段fields
变量variables
脚本scriptlets
报表的主体Title-Background
中间栏是编辑器,可选designer可视化编辑 xml源文件编辑。Preview是报表浏览视图。
最右是可视化编辑组件列表,包含了各种报表组件。如果找不到了可以在窗口-组件面板中重新打开它。
坑点:工具-组件面板中也有个组件面板。这个组件面板是空的,找组件面板的时候要注意不要找错。
3.生成报表
现在我们可以从最右组件面板中拖一个static text组件到编辑器的title区域中,输入内容调整一下位置和样式
点击preview浏览报表
点击保存按钮,选择保存的格式
保存成功。
到这里,我们的报表就生成完毕了,教程结束——
是不可能的。
为了制作报表我们有必要了解报表的主体部分,
接下来开始,进入java代码环节。
可能会用到的依赖库
4.报表组成
在前面的介绍中,我们已经用ireport生成了一份jrxml模板文件,就在第二步选择的路径中。我们加载这个jrxml文件,可以获得一个JasperDesign 对象。
这个JasperDesign对象是我们之后制作报表的基础。
JasperDesign jasperDesign = JRXmlLoader.load("D:/report1.jrxml");
从这个JasperDesign对象中,我们可以得到之前提到的最左的元素列表,如:
List
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作为报表数据源
添加一个field name
在detail中添加一个text field,值为$F{name}
点击preview
可以看到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})
像这样就可以轻松的为每个图、表设置各自的数据源。
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工程。
修改fonts.xml文件
例如需要添加字体仿宋
增加下面一段代码
把仿宋用到的字体文件simfang.ttf放到dejavu文件夹内。
把这个项目导出成jar包并添加到你的项目中。