jasper-report
概述
JasperRepor 的核心技术路线是 excel > iText > JasperReport,点击链接到官网中下载 JasperStudio 。服务器 xdf250 上的路径 \\192.168.0.250\alist\安装程序\cc\devtools\java\jasper 下有 2025年9月17日 下载好的 JasperStudio
安装部署
模板设计工具
解压文件 \\192.168.0.250\alist\安装程序\cc\devtools\java\jasper\js-studiocomm_7.0.3_windows_x86_64.zip 后双击打开 Jaspersoft Studio.exe 就是模板设计工具,打开后要求输入登录账号密码,要到官网注册一个账号。下面针对新手做入门介绍
创建数据源
类似 FineReport 为模板文件创建数据源,这里也需要创建数据源

创建模板文件
上面创建的数据源距离使用还有段时间,接下来要创建一个工程,一般为一个 java 项目创建一个工程,工程内包含该项目中的所有报表,按照下图步骤操作

模板案例
参数模板
模板中不设置数据源,也不从 java 读取数据,模板中设置两个参数,java 调用同时传入参数导出报表,下面是制作模板文件
第一个模板案例
下图是制作第一个模板文件,没有从数据库读取数据,并添加了2个参数,在切换到预览页面时 IDE 会要求填写两个参数,之后会出现打印预览

制作java后台
java后台需要添加相关依赖,然后将模板文件拷贝到项目源码中来解析显示报表
首先添加 POM 依赖
在 pom.xml 添加下面依赖,初次制作在 2025年9月18日 ,从官网下载了最新的 Jaspersoft Studio,所以 java 中的依赖比教程中使用的版本号要新,同时还要添加 pdf 的一样(本次测试只使用到了导出 pdf,如果有其他需求应该也需要下载依赖)
<!-- Jasper Report -->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>7.0.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports-pdf -->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports-pdf</artifactId>
<version>7.0.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports-fonts -->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports-fonts</artifactId>
<version>7.0.3</version>
</dependency>
java 解析报表
首先在模板编辑工具中编译模板文件

将编译后的 delivery.jasper 模板文件拷贝到源码的测试包路径 src/test/java/resources 下,然后创建解析用的源码文件 src/test/java/com/xdf/xzymanagementsystem/First.java,其中的 com/xdf/xzymanagementsystem 是项目包路径,该文件的源码如下。注意该文件 First.java 的路径跟下面代码 First.class.getResourceAsStream("delivery.jasper") 是相关的,如果路径不一致,下面代码会报错 inputStream 空指针异常
import net.sf.jasperreports.engine.*;
import java.io.InputStream;
import java.util.HashMap;
/**
* 2025年9月17日 14:19:46 创建第一个 JasperReport 演示案例
* @author chanchaw
* @create 2025-09-17 14:19
*/
public class First {
public static void main(String[] args) throws JRException {
InputStream inputStream = First.class.getClassLoader().getResourceAsStream("delivery.jasper");
HashMap map = new HashMap<>();
map.put("username","张三");
map.put("email","40922@qq.com");
JasperPrint jasperPrint = JasperFillManager.fillReport(inputStream,map,new JREmptyDataSource());
JasperExportManager.exportReportToPdfFile(jasperPrint,"d:/jasperfirst.pdf");
}
}
设置字体兼容中文
兼容中文
上面的步骤导出后是不支持中文的,还要安装中文字体。在 Jaspersoft Studio 模板编辑器中文可以正常显示,导出为 pdf 不会显示中文。Jasper 只支持 ttf 格式字体(还有一种是 ttc 字体)。下面演示设置 楷体 字体,是文件 C:\Windows\Fonts\simkai.ttf,在源码中创建目录 src/test/resources/fonts 并在其下创建文件 fonts.xml 内容如下
<?xml version="1.0" encoding="utf-8" ?>
<fontFamilies>
<fontFamily name="楷体">
<normal>fonts/simkai.ttf</normal>
<bold>fonts/simkai.ttf</bold>
<italic>fonts/simkai.ttf</italic>
<boldItalic>fonts/simkai.ttf</boldItalic>
<pdfEncoding>Identity-H</pdfEncoding>
<pdfEmbedded>true</pdfEmbedded>
<exportFonts>
<export key="net.sf.jasperreports.html">'楷体',Arial,Helvetica,sans-serif</export>
<export key="net.sf.jasperreports.xhtml">'楷体',Arial,Helvetica,sans-serif</export>
</exportFonts>
</fontFamily>
</fontFamilies>
拷贝字体文件 C:\Windows\Fonts\simkai.ttf 到源码的目录 src/test/resources/fonts 下,创建文件 src/test/resources/jasperreports_extension.properties 内容如下
net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.lobstertwo=fonts/fonts.xml
模板中设置数据源
在模板中设置查询 sql 语句用于查询数据,java 后台解析时只要传入数据库连接即可
模板中查询数据库
类似 FineReport 在模板中可以设置数据源执行 sql 读取数据,首先设置数据源

通过下面步骤新增数据源并创建模板文件

该类型模板编译后的文件 contact.jasper 拷贝到 java 后台后,调用时传参要带有数据库连接,模板文件执行时使用该数据库连接查询数据并填充
public static void jasperDS() throws JRException, ClassNotFoundException, SQLException {
InputStream inputStream = First.class.getClassLoader().getResourceAsStream("contact.jasper");
HashMap map = new HashMap<>();
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/pademisaccount?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&allowMultiQueries=true", "root", "chanchaw");
// 即使没有参数,要传递一个空的 map 对象给第二个参数
JasperPrint jasperPrint = JasperFillManager.fillReport(inputStream,map,connection);
JasperExportManager.exportReportToPdfFile(jasperPrint,"d:/jasperDS.pdf");
}
java传递报表数据
模板文件中不设置数据源 sql,java 后台在解析报表时传入数据。由于模板文件中不设置数据源,需要手动在模板文件中添加字段。这种方法使源数据可以灵活改变结构形式后再传递给报表,例如实现成品发货细码单的样式
详情

后台 java 解析报表时要传入数据,不可传入 map 集合,只能传入实体类集合
public static void javaData() throws JRException {
InputStream inputStream = First.class.getClassLoader().getResourceAsStream("javadata.jasper");
HashMap map = new HashMap<>();
// 模拟是查询出的实体类对象集合
ArrayList<BillorderMain> data = new ArrayList<>();
BillorderMain data01 = new BillorderMain();
data01.setBillCode("JH250213001");
data01.setAlias("白玉兰");
BillorderMain data02 = new BillorderMain();
data02.setBillCode("JH250213401");
data02.setAlias("新盛针纺");
data.add(data01);
data.add(data02);
JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(data);
JasperPrint jasperPrint = JasperFillManager.fillReport(inputStream,map,ds);
JasperExportManager.exportReportToPdfFile(jasperPrint,"d:/javadata.pdf");
}
注意模板文件中的字段名称要保证和 java 实体类的属性名成员一致,模板实际是通过实体类对象的 get 方法获取数据,所以不可传递 map 对象的集合,只能传递实体类对象的集合,在 java 内部可以通过 get 方法格式化数据,就不需要在模板文件中对数据的显示格式化。
按字段分组
查询获取数据后按照指定字段排序,报表模板中使用该字段做分组显示并统计,如果数据源中没有按照分组的字段排序,则打印中就会出现属于同一个分组的会分散出现在报表中
详情

父子报表
创建父报表
父报表就是创建普通模板的步骤

创建子报表

父报表关联子报表
注意下图步骤11中由于被上层对话框遮挡,步骤11右边有个按钮点击后弹出步骤13所在对话框

Table组件
使用 table 组件可以实现类似父子报表的效果
详情
由于报表中要用到传入参数,创建模板文件时使用了最简单的步骤(创建时就使用参数会提示没有该参数)

创建模板后按照顺序创建:参数、数据源

参照下图拖拽 table 组件到模板中

由于上面创建 table 组件时使用了硬编码的参数,下面要创建参数映射关系

之后就可以预览了
设计案例
使用条码
详情

格式化数据
不显示null
双击字段弹出的对话框中使用下面表达式,createDate 是双击的字段名称
$F{createDate} == null ? "" : new SimpleDateFormat("yyyy-MM-dd").format($F{createDate})
格式化日期
双击 section 中日期类型的字段会弹出一个新的对话框,在其中填写如下的格式化代码

边框线

band与溢出
与 ActiveReport 不同,每个 section 的边线不可手动拖拽到高度小于其中内容的高度,否则会报错
Description Resource Path Location Type
Warning : Element bottom reaches outside band area : y=0 height=30 band-height=27 --- net.sf.jasperreports.engine.design.JRDesignTextField@6eec56d4 contact.jrxml /pademisaccount line 1 JRXML Problem
可通过双击 section 空白区域使编辑器自动调整高度来适应其中内容的高度

错误与提示
无法预览
模板编辑器在中间绘制区域的右下角显示红字 Edge browser engin is not setup,HTML Preview will not work fine ,需要到微软官网下载 edge webview2,在服务器 xdf250 的路径 \\192.168.0.250\alist\安装程序\cc\devtools\java\jasper 下有两个文件:MicrosoftEdgeWebView2RuntimeInstallerX64.exe 和 MicrosoftEdgeWebView2RuntimeInstallerX86.exe,根据自己系统是否 x64 选择安装。安装后在控制面板的程序和功能中并不会显示,查看路径 C:\Program Files (x86)\Microsoft\EdgeWebView\Application 下是否有类似版本号数字 140.0.3485.66 的目录,如果有则表示安装成功,此后设置 Jaspersoft Studio 的配置文件 Jaspersoft Studio.ini 中设置两个参数
-Dorg.eclipse.swt.browser.DefaultType=edge
-Dorg.eclipse.swt.browser.EdgeDir=C:\\Program Files (x86)\\Microsoft\\EdgeWebView\\Application
该文件在模板编辑器可执行文件的目录下,即 exe 文件 Jaspersoft Studio.exe 有个兄弟文件 Jaspersoft Studio.ini
保存后关闭 Jaspersoft Studio 通过右键菜单使用管理员身份重新打开,此时仍然会显示该红字报错,可以不用理会,在模板编辑器中间绘制区域的标签页 Preview 能打开预览即可。
