上一篇博客写的是增删查改
本篇介绍,将html的表格数据以报表的方式导出(以PDF格式为例)
一个主要数据源,两个次要数据源
报表工具:Jasperreport工具
- 导入相关的jar包
<dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>5.6.0</version> </dependency> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>2.2.2</version> </dependency> <!-- JFreeChart --> <dependency> <groupId>org.jfree</groupId> <artifactId>jfreechart</artifactId> <version>1.0.19</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-pdfa</artifactId> <version>5.5.0</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.3.1</version> </dependency> <dependency> <groupId>com.itextpdf.tool</groupId> <artifactId>xmlworker</artifactId> <version>5.5.9</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency>
一个数据源建立一个类,使用javaBean做另外两个数据源,并构造方法
将两个次数据源,也用List集合保存。
List<JavaBeanColor> javaBeanColors=new ArrayList<JavaBeanColor>();
javaBeanColors.add(new JavaBeanColor("数据名",字段));
javaBeanColors.add(new JavaBeanColor("数据名",字段));
javaBeanColors.add(new JavaBeanColor("数据名",字段));
javaBeanColors.add(new JavaBeanColor("数据名",字段));
List<JavaBeanFruit> javaBeanFruits=new ArrayList<JavaBeanFruit>();
javaBeanFruits.add(new JavaBeanFruit("数据名",字段));
javaBeanFruits.add(new JavaBeanFruit("数据名",字段));
javaBeanFruits.add(new JavaBeanFruit("数据名",字段));
将数据链接到报表
先构建一个方法类,将数据源封装
package com.byd.cloud.rail.afc.lc.model;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRAbstractBeanDataSourceProvider;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import java.util.List;
/**
* iReport数据源封装
* @author yy
* @Create 2015-1-15 15:42:52
*/
public class IReportDataSourceProvider extends JRAbstractBeanDataSourceProvider {
private List<?> dataList;
public IReportDataSourceProvider(Class<?> beanClass) {
super(beanClass);
}
public IReportDataSourceProvider(Class<?> beanClass, List<?> dataSourceList) {
super(beanClass);
this.dataList = dataSourceList;
}
public JRDataSource create(JasperReport report) throws JRException {
return new JRBeanCollectionDataSource(this.dataList);
}
public void dispose(JRDataSource dataSource) throws JRException {
this.dataList = null;
}
}
再将数据源和报表链接
// 报表数据源
JRDataSource jrDataSourceMain_Person = null;
JRDataSource jrDataSourceSub_Color = null;
JRDataSource jrDataSourceSub_Fruit = null;
try {
IReportDataSourceProvider dataSourcePerson = new IReportDataSourceProvider(LcHistoryPassengerFlowCount.class, lcHistoryPassengerFlowCountList1);
jrDataSourceMain_Person = dataSourcePerson.create(null);
IReportDataSourceProvider dataSourceColor = new IReportDataSourceProvider(JavaBeanColor.class, javaBeanColors);
jrDataSourceSub_Color = dataSourceColor.create(null);
IReportDataSourceProvider dataSourceFruit = new IReportDataSourceProvider(JavaBeanFruit.class, javaBeanFruits);
jrDataSourceSub_Fruit = dataSourceFruit.create(null);
} catch (JRException e) {
e.printStackTrace();
}
- 报表模板的制作
先做主要数据源,注意Field字段要和代码里面的实体类一致
然后添加子数据源
然后命名为jrColorDataSource
接下来需要设置该报表参数的两个属性:
◆ Parameter Class(参数类):net.sf.jasperreports.engine.data.JRBeanCollectionDataSource
◆ Use as a prompt(是否弹出窗口以输入报表参数):去掉勾勾,即不弹出窗口
至此,报表参数jrColorDataSource创建完成。另一个参数jrFruitDataSource的创建过程亦与此相同。
为报表创建两个空的DataSet,分别重命名为subColorDataSet和subFruitDataSet。
给DataSet创建字段,字段名分别对应Java实体模型JavaBeanColor.java、JavaBeanFruit.java中的字段,注意字段数据类型的一致性。
设计报表模板的Band
然后使用不同的组件,staticField,textField,Chart图表放在Summary
然后将数据关联进去:
1、主数据源关联
蓝色区域的V代表
利用主数据源的字段进行有关的运算(加减乘除)。
2、子数据源关联
要把参数资源关联进去
回顾下报表模板的设计过程:
■ 创建了两个报表“Parameters(参数)”:jrColorDataSource和jrFruitDataSource,并且指定它们的“Parameter Class”为net.sf.jasperreports.engine.data.JRBeanCollectionDataSource。
■ 创建了两个空的“DataSet(数据集)”:subColorDataSet和subFruitDataSet,其中,
subColorDataSet对应Java实体模型JavaBeanColor.java,两者字段保持一致;
subFruitDataSet对应Java实体模型JavaBeanFruit.java,两者字段保持一致。
■ 创建了一个柱状图图表,指定使用的DataSet为“subColorDataSet”。
■ 创建了一个饼图图表,指定使用的DataSet为“subFruitDataSet”。
至此,报表模板的设计似乎已经完成,非也!如果此时编译报表模板,将得到的.jasper文件放入/WEB-INF/jasper/目录中,并不能得到想要的报表,原因是:创建了两个空的“DataSet(数据集)”。
我们一开始就创建了两个报表“Parameters(参数)”,那么接下来要做的就是:把报表“Parameters(参数)”赋值给两个空的“DataSet(数据集)”。
选中一个图表对象,右键菜单中点击“Chart Data”。
关键操作步骤为:
◆ 选择“Sub dataSet”为:subColorDataSet;
◆ 选择“Connection / DataSet Expression”为:Use datasource expression;
◆ 选择或设置上述表达式的值为:$P{jrColorDataSource},即其中一个报表“Parameters(参数)”。
这样就完成了报表“Parameters(参数)”到报表“DataSet(数据集)”的数据关联转换。饼图同样要如此设置。
编译报表模板,将得到的.jasper文件放入/WEB-INF/jasper/目录中,通过浏览器访问地址。
难点升级,实现模板的单元格合并。
以station字段为例,先取消勾,去掉重复
只保留右边Borders的上边线,然后画左边线即可。html的单元格合并上一篇博客。
最终效果图如下: