PDF报表-JasperReports

news/2025/11/30 3:35:20/文章来源:https://www.cnblogs.com/ajing2018/p/19287916

PDF报表-JasperReports

一、常见的PDF报表生成方式

在企业开发中,除了常见的Excel形式 报表,还有PDF形式的报表。那么如何导出PDF形式的报表呢?

1. iText

 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。 iText的安装非常方便,下载iText.jar文件后,只需要在系统的CLASSPATH中加入iText.jar的路径,在程序中就可以使用iText类库了。

 maven坐标:

<dependency> <groupId>com.lowagie</groupId> <artifactId>itext</artifactId> <version>2.1.7</version>
</dependency>

 示例代码:

package com.itheima.app;import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;public class ItextDemo {public static void main(String[] args) {try {Document document = new Document();PdfWriter.getInstance(document, new FileOutputStream("C:\\workFiles\\test.pdf"));document.open();document.add(new Paragraph("hello itext"));//hello itext内容输出到test.pdf文档document.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (DocumentException e) {e.printStackTrace();}}
}

2. JasperReports

 JasperReports是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成PDF,HTML,或者XML格式。该库完全由Java写成,可以用于在各种Java应用程序,包括J2EE,Web应用程序中生成动态内容。一般情况下,JasperReports会结合Jaspersoft Studio(模板设计器)使用导出PDF报表

 maven坐标:

<dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>6.8.0</version>
</dependency>

二、JasperReports

1. JasperReports快速体验

  JasperReports的开发过程:

 第一步:创建maven工程,导入JasperReports的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>

 第二步:将提前准备好的jrxml文件复制到maven工程中(后面会详细讲解如何创建jrxml文件)

  image

 第三步:编写单元测试,输出PDF报表

package com.itheima.test;import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class JasperReportsTest {@Testpublic void testJasperReports() throws Exception {String jrxmlPath = "C:\\workFiles\\javaLearn\\code\\itcast_health\\health_parent\\jasperreportsDemo\\src\\main\\resources\\demo.jrxml";String jasperPath = "C:\\workFiles\\javaLearn\\code\\itcast_health\\health_parent\\jasperreportsDemo\\src\\main\\resources\\demo.jasper";//编译模板JasperCompileManager.compileReportToFile(jrxmlPath,jasperPath);//构造数据Map paramters = new HashMap();paramters.put("reportDate","2019-10-10");paramters.put("company","itcast");List<Map> list = new ArrayList();Map map1 = new HashMap();map1.put("name","xiaoming");map1.put("address","beijing");map1.put("email","xiaoming@itcast.cn");Map map2 = new HashMap();map2.put("name","xiaoli");map2.put("address","nanjing");map2.put("email","xiaoli@itcast.cn");list.add(map1);list.add(map2);//填充数据JasperPrint jasperPrint = JasperFillManager.fillReport(jasperPath, paramters, new JRBeanCollectionDataSource(list));//输出文件String pdfPath = "C:\\workFiles\\test.pdf";JasperExportManager.exportReportToPdfFile(jasperPrint,pdfPath);}
}

2. JasperReports原理

 image

  •  JRXML:报表填充模板,本质是一个xml文件
  • Jasper:由JRXML模板编译成的二进制文件,用于代码填充数据
  • Jrprint:当用数据填充完Jasper后生成的对象,用于输出报表
  • Exporter:报表输出的管理类,可以指定要输出的报表为何种格式
  • PDF/HTML/XML:报表形式

3. 开发流程

 使用JasperReports导出pdf报表,开发流程如下:

 1. 制作报表模板

 2. 模板编译

 3. 构造数据

 4. 填充数据

 5. 输出文件

三、模板设计器Jaspersoft Studio

 Jaspersoft Studio是一个图形化的报表设计工具,可以非常方便的设计出PDF报表模板文件(其实就是一 个xml文件),再结合JasperReports使用,就可以渲染出PDF文件。

 下载地址: https://community.jaspersoft.com/community-download

  image

 下载完成后会得到如下安装文件:

  image

  直接双击安装即可。

1. Jaspersoft Studio面板介绍

 image

2. 创建工程和模板文件

 打开Jaspersoft Studio工具,首先需要创建一个工程,创建过程如下:

  image  image

  image  image

 创建完工程后,可以在工程上点击右键,创建模板文件:

   image  image

  image  image

  image  image

 可以看到创建处理的模板文件后缀为jrxml,从设计区面板可以看到如下效果:

  image

  可以看到整个文件是可视化的,分为几大区域(Title、Page Header、Column Header等),如果某些 区域不需要也可以删除。

 在面板左下角可以看到有三种视图方式:Design(设计模式)、Source(源码模式)、Preview(预览 模式):

  • 通过Design视图可以看到模板的直观结构和样式
  • 通过Source视图可以看到文件xml源码
  • 通过Preview视图可以预览PDF文件输出后的效果

 通过右侧Palette窗口可以看到常用的元素:

  image

3. 设计模板文件

 3.1 增减Band

  可以根据情况删除或者增加模板文件中的区域(称为Band),例如在Page Header区域上点击右键, 选择删除菜单:

  image 

  其中Detail区域可以添加多个,其他区域只能有一个。

 3.2 将元素应用到模板中

  3.2.1 Image元素

   从右侧Palette面板中选择Image元素(图片元素),拖动到Title区域:

    image

   弹出如下对话框,有多种创建模式,选择URL模式,并在下面输入框中输入一个网络图片的连接地址:

    image  image

   可以选中图片元素,鼠标拖动调整位置,也可以通过鼠标调整图片的大小。

   调整完成后,可以点击Preview进入预览视图,查看PDF输出效果:

    image

   点击Source进入源码视图,查看xml文件内容:

    image

   其实我们上面创建的demo1.jrxml模板文件,本质上就是一个xml文件,只不过我们不需要自己编写xml文件的内容,而是通过Jaspersoft Studio这个设计器软件进行可视化设计即可。 

   3.2.2 Static Text元素

   Static Text元素就是静态文本元素,用于在PDF文件上展示静态文本信息:

    image

   双击Title面板中的Static Text元素,可以修改文本内容:

    image

   选中元素,也可以调整文本的字体和字号:

    image

   点击Preview进入预览视图,查看效果:

    image

   3.2.3 Current Date元素

   Current Date元素用于在报表中输出当前系统日期,将改元素拖动到Title区域:

    image

   预览输出效果:

    image

   默认日期输出格式如上图所示,可以回到设计视图并选中元素,在Properties面板中的Text Field子标签 中修改日期输出格式:

    image

   修改日期格式:

    image

   保存文件后重新预览:

    image

 3.3 动态数据填充

  上面我们在PDF文件中展示的都是一些静态数据,那么如果需要动态展示一些数据应该如何实现呢?我们可以使用Outline面板中的Parameters和Fields来实现。 

   image

  Parameters通常用来展示单个数据,Fields通常用来展示需要循环的列表数据。

  3.3.1 Parameters 

   在Parameters上点击右键,创建一个Parameter参数:

      image

   可以在右侧的Properties面板中修改刚才创建的参数名称:

     image

   将刚才创建的Parameter参数拖动到面板中:

     image

   进入预览视图,查看效果:

     image

   由于模板中我们使用了Parameter动态元素,所以在预览之前需要为其动态赋值:

     image

   注意:由于我们是在Jaspersoft Studio软件中进行预览,所以需要通过上面的输入框动态为Parameter赋值,在后期项目使用时,需要我们在Java程序中动态为Parameter赋值进行数据填充。

  3.3.2 Fields

   使用Fields方式进行数据填充,既可以使用jdbc数据源方式也可以使用JavaBean数据源方式。

  • jdbc数据源数据填充

   第一步:在Repository Explorer面板中,在Data Adapters点击右键,创建一个数据适配器  

    image

    第二步:选择Database JDBC Connection

    image

   第三步:选择mysql数据库,并完善jdbc连接信息

    image

   为了能够在Jaspersoft Studio中预览到数据库中的数据,需要加入MySQL的驱动包 

    image

   第四步:在Outline视图中,右键点击工程名,选择Database and Query菜单

    image

   第五步:在弹出的对话框中选择刚刚创建的JDBC数据库连接选项

    image

   第六步:在弹出对话框中Language选择sql,在右侧区域输入SQL语句并点击Read Fields按钮

    image

    可以看到通过点击上面的Read Fields按钮,已经读取到了t_setmeal表中的所有字段信息并展示在了下面,这些字段可以根据需要进行删除或者调整位置

   第七步:在Outline视图中的Fields下可以看到t_setmeal表中相关字段信息,拖动某个字段到设计区的Detail区域并调整位置

    image

    可以看到,在拖动Fields到设计区时,同时会产生两个元素,一个是静态文本,一个是动态元素。静态文本相当于表格的表头,可以根据需要修改文本内容。最终设计完的效果如下:

    image

   第八步:使用Preview预览视图进行预览

    image

   通过上图可以看到,虽然列表数据展示出来了,但是展示的还存在问题。在每条数据遍历时表头也跟着遍历了一遍。这是怎么回事呢?这是由于我们设计的表头和动态Fields都在Detail区域。为了能够解决上面的问题,需要将表头放在Column Header区域,将动态Fields放在Detail区域。具体操作如下:

    1、在Outline视图的Column Header点击右键创建出一个区域

     image

    2、将Detail下的静态文本拖动到Column Header下

      image

     拖动完成后如下:

      image

    3、调整静态文本在Column Header区域的位置,最终效果如下

     image

    4、预览查看效果

     image

  • JavaBean数据源数据填充

   第一步:复制上面的demo1.jrxml文件,名称改为demo2.jrxml

    image

    修改Report Name:

     image

   第二步:打开demo2.jrxml文件,将detail区域中的动态Fields元素删除 

    image

   第三步:将Outline面板中Fields下的字段全部删除 

    image

   第四步:清除JDBC数据源和相关SQL语句

    image    image

   第五步:在Fields处点击右键创建新的Field

    image

    创建完成后在Properties属性面板中修改Field的名称

     image  image

   第六步:将创建的Fields拖动到Detail区域并调整好位置

    image

   注意:使用此种JavaBean数据源数据填充方式,无法正常进行预览,因为这些动态Fields需要在Java程序中动态进行数据填充。 

4. 结合JasperReports输出报表

前面我们已经使用Jaspersoft Studio设计了两个模板文件:demo1.jrxml和demo2.jrxml。其中demo1.jrxml的动态列表数据是基于JDBC数据源方式进行数据填充,demo2.jrxml的动态列表数据是基于JavaBean数据源方式进行数据填充。本小节我们就结合JasperReports的Java API来完成pdf报表输出 

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

   image

  第三步:编写单元测试

    //基于JDBC数据源方式填充数据@Testpublic void testReport_JDBC() throws Exception {Class.forName("com.mysql.jdbc.Driver");Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/health","root","root");String jrxmlPath = "C:\\workFiles\\javaLearn\\code\\itcast_health\\health_parent\\jasperreportsDemo\\src\\main\\resources\\demo1.jrxml";String jasperPath = "C:\\workFiles\\javaLearn\\code\\itcast_health\\health_parent\\jasperreportsDemo\\src\\main\\resources\\demo1.jasper";//编译模板JasperCompileManager.compileReportToFile(jrxmlPath,jasperPath);//构造数据Map paramters = new HashMap();paramters.put("company","传智播客");//填充数据---使用JDBC数据源方式填充JasperPrint jasperPrint = JasperFillManager.fillReport(jasperPath, paramters, connection);//输出文件String pdfPath = "C:\\workFiles\\test1.pdf";JasperExportManager.exportReportToPdfFile(jasperPrint,pdfPath);}

   通过上面的操作步骤可以输出pdf文件,但是中文的地方无法正常显示。这是因为JasperReports默认情况下对中文支持并不友好,需要我们自己进行修复。具体操作步骤如下:

    1、在Jaspersoft Studio中打开demo1.jrxml文件,选中中文相关元素,统一将字体设置为“华文宋体”并将修改后的demo1.jrxml重新复制到maven工程中 

    2、将本章资源/解决中文无法显示问题目录下的文件复制到maven工程的resources目录中

    image

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

    image

 4.2 JavaBean数据源方式填充数据

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

   image

  第二步:编写单元测试方法输出PDF文件

    //基于Javabean数据源方式填充数据@Testpublic void testReport_JavaBean() throws Exception {String jrxmlPath = "C:\\workFiles\\javaLearn\\code\\itcast_health\\health_parent\\jasperreportsDemo\\src\\main\\resources\\demo2.jrxml";String jasperPath = "C:\\workFiles\\javaLearn\\code\\itcast_health\\health_parent\\jasperreportsDemo\\src\\main\\resources\\demo2.jasper";//编译模板JasperCompileManager.compileReportToFile(jrxmlPath,jasperPath);//构造数据Map paramters = new HashMap();paramters.put("company","传智播客");//Javabean数据源填充,用于填充列表数据List<Map> list = new ArrayList();Map map1 = new HashMap();map1.put("name","入职体检套餐");map1.put("code","RZTJ");map1.put("age","18-60");map1.put("sex","不限");Map map2 = new HashMap();map2.put("name","阳光爸妈老年健康体检");map2.put("code","YGBM");map2.put("age","55-80");map1.put("sex","男");list.add(map1);list.add(map2);//填充数据JasperPrint jasperPrint = JasperFillManager.fillReport(jasperPath, paramters, new JRBeanCollectionDataSource(list));//输出文件String pdfPath = "C:\\workFiles\\test2.pdf";JasperExportManager.exportReportToPdfFile(jasperPrint,pdfPath);}

   查看输出效果: 

   image

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/981357.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF2161G Editorial

Two language versions are available in order to serve both codeforces and luogu community. English Version HintsWhats the necessary condition for \(a_1^\prime\&a_2^\prime\cdots\&a_n^\prime=X\) …

数组高阶方法:map、filter、reduce实战指南

数组高阶方法:map、filter、reduce实战指南 文章简介 在HarmonyOS应用开发中,数组操作是日常开发的重要组成部分。本文将深入探讨三个核心的数组高阶方法:map、filter和reduce,帮助开发者掌握这些强大的数据处理工…

设备能力检测:自适应不同硬件环境

设备能力检测:自适应不同硬件环境 引言 在 HarmonyOS 应用开发中,设备能力检测是构建自适应应用的关键技术。随着 HarmonyOS 生态的不断扩大,开发者需要确保应用能够在不同硬件配置的设备上提供一致的用户体验。本文…

DuckDB:轻量级 OLAP 数据库的新星

1. 分钟级上手一个像 SQLite 一样简单、却能跑得像 ClickHouse 一样快的分析引擎。而且——你今天就能用上。如果你经常在 Jupyter Notebook 里等 Pandas 加载数据,或者写一堆 Python 循环做聚合,那 DuckDB 很可能就…

跨设备剪贴板数据:实现应用间内容共享

跨设备剪贴板数据:实现应用间内容共享 概述 在 HarmonyOS 生态系统中,跨设备剪贴板功能让用户能够在一台设备上复制内容,然后在同一账号下的其他设备上粘贴使用。这项技术打破了设备边界,为开发者提供了全新的内容…

Text组件高级排版技巧:字体样式与文本布局深度优化

Text 组件高级排版技巧:字体样式与文本布局深度优化 文章简介 本文基于 HarmonyOS Next,深入探讨 Text 组件的高级排版技巧。我们将从基础字体样式设置开始,逐步深入到复杂的文本布局优化,帮助开发者掌握专业级的文…

通知与提醒系统:即时消息与日程管理实现

通知与提醒系统:即时消息与日程管理实现 概述 在HarmonyOS应用开发中,通知与提醒系统是连接用户与应用的重要桥梁。本文将深入探讨如何在HarmonyOS Next(API 10+)中实现高效的通知管理和智能的日程提醒功能。 官方…

try/catch/finally:完善的错误处理策略

try/catch/finally:完善的错误处理策略 概述 在 HarmonyOS 应用开发中,错误处理是保证应用稳定性和用户体验的关键环节。本文将深入探讨 HarmonyOS Next(API 10 及以上版本)中的错误处理机制,帮助开发者构建更加健…

4种XML解析方式详解

详细讲解四种主流的XML解析方式,包括其原理、特点、适用场景和代码示例。 四种方式,可以分为两大类:基于树的解析:将整个XML文档一次性加载到内存,形成一棵树形结构。DOM基于事件的解析:顺序读取XML文档,遇到节…

20232415 2025-2026-1 《网络与系统攻防技术》实验七实验报告

1.实验内容 2.实验目的 3.实验环境 4.实验过程与分析 4.1 使用SET工具建立冒名网站 4.1.1 建立冒名网站 4.1.2 验证欺骗效果 在浏览器中访问伪造的监听地址,发现能够看到一个与天翼快递登录页面相同的页面,说明冒名网…

2025 Launch X431 PRO3 ACE: Online ECU Coding 38+ Services for Euro/Amer Vehicles with CANFD/DoIP

Problem: Outdated Tools Can’t Keep Up with Modern Vehicle Technology Today’s European and American vehicles are more advanced than ever, packed with cutting-edge ECUs, complex protocols like CAN FD a…

QtSingleapplication单实例-源码分析

QtSingleapplication单实例-源码分析 目录QtSingleapplication单实例-源码分析官方案例 QtSingleApplication分析1. 描述2. 类解析QtLocalPeerQtSingleApplication3. 实际案例consoletrivial4. 逻辑流程(AI整理)QtSing…

2025解决VS C# NUGET 安装System.Data.SQLite+SourceGear.SQLite3 不支持 AnyCPU 的系列问题

环境:isual Studio 2022 项目:.NETFramework,Version=v4.8 时间:2025年11月30日 注:此问题在网络上搜到的解决办法比较旧,且部分失效,所以作此解决记录 使用Visual Studio NuGet方式安装System.Data.SQLite后会因为缺少…

102302156 李子贤 数据采集第四次作业

作业1 要求:熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。 使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的股票数据信息。 候选网站:东…

东华萌新挑战赛 密室逃脱

点击查看代码 #include<bits/stdc++.h>using namespace std;bool check(int k,int n,const vector<vector<int> >& pos) {//枚举所有可以作为障碍区的起始位置 for(int r=0;r<=n-k;r++){for(…

第40天(中等题 数据结构)

打卡第四十天 2道简单题+1道中等题题目:思路:哈希表+位运算 代码: class Solution { public:int similarPairs(vector<string>& words) {unordered_map<int,int> cnt;int ans = 0;for(auto &s:…

核心功能详解

Vue3 大屏可视化平台核心功能详解 一、Composables 架构 Vue3 Composables 是该项目的核心架构模式,实现了逻辑复用和关注点分离。 1. usePersonnel - 人员管理 import { usePersonnel } from @/composables/usePerso…

2025-11-30-Nature Genetics | 本周最新文献速递

文章标题: Genetic associations with educational fields 中文标题: 基因与教育:解码教育领域选择背后的遗传驱动力! 关键词: 教育领域、全基因组关联研究、遗传相关性、社会分层、多基因风险评分 摘要总结: 教…

效果-Element 3D

--本篇导航--安装及配置基本操作 导入(给AI文件导入E3D、图片挤出、加载贴图、导入外部模型) 多个图层添加到一个组里安装及配置 可以直接安装Element 3D,也可以安装Videocopilot Optical Flares套件。 安装配置 如…