JAVA结合JasperReports输出报表
JasperReport是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成PDF,HTML,或者XML格式。该库完全由Java写成,可以用于在各种Java应用程序,包括J2EE,Web应用程序中生成动态内容。
下载JasperReports的JAR包和iReport设计器,并将其添加到项目中。接着,创建JasperReport报表模板和数据源,编写JRXML文件。在文件中定义数据源、Query语句、数据列和其他相关信息。
然后,使用iReport设计器来修改和设置报表模板。在iReport中,可以添加图像、文本、表格和其他控件,并对其进行格式化和布局。同时,可以设置条件格式、样式和表格特性等。
接下来,编写Java代码来调用并生成报表。要使用JasperReports内置的工具,只需几行代码即可完成报表的生成、导出和打印。例如,可以使用JasperPrint进行数据填充,并使用JasperExportManager导出PDF、Excel、HTML或其他格式。
进行测试和调试。调试时,应该特别注意数据源、参数和生成结果是否符合预期。如果出现错误,可以查看错误日志并逐一排除错误。
结合JasperReports输出报表
前面我们已经使用Jaspersoft Studio设计了两个模板文件:demo1.jrxml和demo2.jrxml。其中demo1.jrxml的动态列表数据是基于JDBC数据源方式进行数据填充,demo2.jrxml的动态列表数据是基于JavaBean数据源方式进行数据填充。本小节我们就结合JasperReports的Java API来完成pdf报表输出。
一、JDBC数据源方式填充数据
第一步:创建maven工程,导入相关maven坐标
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.8.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
第二步:将设计好的demo1.jrxml文件复制到当前工程的resources目录下

第三步:编写单元测试
@Test
public void testReport_JDBC() throws Exception{
Class.forName("com.mysql.jdbc.Driver");
Connection connection =
DriverManager.getConnection("jdbc:mysql://localhost:3306/health",
"root",
"root");
String jrxmlPath = "D:\\ideaProjects\\projects111\\jasperreports_test\\src\\main\\resources\\demo1.jrxml";
String jasperPath = "D:\\ideaProjects\\projects111\\jasperreports_test\\src\\main\\resources\\demo1.jasper";
//编译模板
JasperCompileManager.compileReportToFile(jrxmlPath,jasperPath);
//构造数据
Map paramters = new HashMap();
paramters.put("company","xx公司");
//填充数据---使用JDBC数据源方式填充
JasperPrint jasperPrint =
JasperFillManager.fillReport(jasperPath,
paramters,
connection);
//输出文件
String pdfPath = "D:\\test.pdf";
JasperExportManager.exportReportToPdfFile(jasperPrint,pdfPath);
}
通过上面的操作步骤可以输出pdf文件,但是中文的地方无法正常显示。这是因为JasperReports默认情况下对中文支持并不友好,需要我们自己进行修复。具体操作步骤如下:
1、在Jaspersoft Studio中打开demo1.jrxml文件,选中中文相关元素,统一将字体设置为“华文宋体”并将修改后的demo1.jrxml重新复制到maven工程中
2、将本章资源/解决中文无法显示问题目录下的文件复制到maven工程的resources目录中

按照上面步骤操作后重新执行单元测试导出PDF文件:

二、 JavaBean数据源方式填充数据
第一步:为了能够避免中文无法显示问题,首先需要将demo2.jrxml文件相关元素字体改为“华文宋体”并将demo2.jrxml文件复制到maven工程的resources目录下

第二步:编写单元测试方法输出PDF文件
@Test
public void testReport_JavaBean() throws Exception{
String jrxmlPath = "D:\\ideaProjects\\projects111\\jasperreports_test\\src\\main\\resources\\demo2.jrxml";
String jasperPath = "D:\\ideaProjects\\projects111\\jasperreports_test\\src\\main\\resources\\demo2.jasper";
//编译模板
JasperCompileManager.compileReportToFile(jrxmlPath,jasperPath);
//构造数据
Map paramters = new HashMap();
paramters.put("company","xx公司");
List<Map> list = new ArrayList();
Map map1 = new HashMap();
map1.put("tName","入职体检套餐");
map1.put("tCode","RZTJ");
map1.put("tAge","18-60");
map1.put("tPrice","500");
Map map2 = new HashMap();
map2.put("tName","阳光爸妈老年健康体检");
map2.put("tCode","YGBM");
map2.put("tAge","55-60");
map2.put("tPrice","500");
list.add(map1);
list.add(map2);
//填充数据---使用JavaBean数据源方式填充
JasperPrint jasperPrint =
JasperFillManager.fillReport(jasperPath,
paramters,
new JRBeanCollectionDataSource(list));
//输出文件
String pdfPath = "D:\\test.pdf";
JasperExportManager.exportReportToPdfFile(jasperPrint,pdfPath);
}
查看输出效果:

三、 在项目中输出运营数据PDF报表
本小节我们将在项目中实现运营数据的PDF报表导出功能。
3.1 设计PDF模板文件
使用Jaspersoft Studio设计运营数据PDF报表模板文件health_business3.jrxml,设计后的效果如下:

在资源中已经提供好了此文件,直接使用即可。
3.2 搭建环境
第一步:在health_common工程的pom.xml中导入JasperReports的maven坐标
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.8.0</version>
</dependency>
第二步:将资源中提供的模板文件health_business3.jrxml复制到health_backend工程的template目录下

第三步:将解决中问题的相关资源文件复制到项目中

3.3 修改页面
修改health_backend工程的report_business.html页面,添加导出PDF的按钮并绑定事件


3.4 Java代码实现
在health_backend工程的ReportController中提供exportBusinessReport4PDF方法
//导出运营数据到pdf并提供客户端下载
@RequestMapping("/exportBusinessReport4PDF")
public Result exportBusinessReport4PDF(HttpServletRequest request, HttpServletResponse response) {
try {
Map<String, Object> result = reportService.getBusinessReportData();
//取出返回结果数据,准备将报表数据写入到PDF文件中
List<Map> hotSetmeal = (List<Map>) result.get("hotSetmeal");
//动态获取模板文件绝对磁盘路径
String jrxmlPath =
request.getSession().getServletContext().getRealPath("template") + File.separator + "health_business3.jrxml";
String jasperPath =
request.getSession().getServletContext().getRealPath("template") + File.separator + "health_business3.jasper";
//编译模板
JasperCompileManager.compileReportToFile(jrxmlPath, jasperPath);
//填充数据---使用JavaBean数据源方式填充
JasperPrint jasperPrint =
JasperFillManager.fillReport(jasperPath,result,
new JRBeanCollectionDataSource(hotSetmeal));
ServletOutputStream out = response.getOutputStream();
response.setContentType("application/pdf");
response.setHeader("content-Disposition", "attachment;filename=report.pdf");
//输出文件
JasperExportManager.exportReportToPdfStream(jasperPrint,out);
return null;
} catch (Exception e) {
e.printStackTrace();
return new Result(false, MessageConstant.GET_BUSINESS_REPORT_FAIL);
}
}
- 点赞
- 收藏
- 关注作者
评论(0)