JAVA结合JasperReports输出报表

举报
tea_year 发表于 2025/10/27 17:51:01 2025/10/27
【摘要】 JasperReport是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成PDF,HTML,或者XML格式。该库完全由Java写成,可以用于在各种Java应用程序,包括J2EE,Web应用程序中生成动态内容。下载JasperReports的JAR包和iReport设计器,并将其添加到项目中。接着,创建JasperReport报表模板和数据源,编写JRXML文件。在文件中定义...

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目录下

65.png

第三步:编写单元测试

@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目录中

66.png

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

67.png

二、 JavaBean数据源方式填充数据

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

68.png

第二步:编写单元测试方法输出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);
}

查看输出效果:

69.png

三、 在项目中输出运营数据PDF报表

本小节我们将在项目中实现运营数据的PDF报表导出功能。

3.1 设计PDF模板文件

使用Jaspersoft Studio设计运营数据PDF报表模板文件health_business3.jrxml,设计后的效果如下:

70.png

在资源中已经提供好了此文件,直接使用即可。

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目录下

71.png

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

72.png

3.3 修改页面

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

73.png

74.png

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);
  }
}
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。