跳至主要內容

jasper-report

chanchaw大约 8 分钟languagejava

概述

JasperRepor 的核心技术路线是 excel > iText > JasperReport,点击链接到官网中下载 JasperStudioopen in new window 。服务器 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传递报表数据


模板文件中不设置数据源 sqljava 后台在解析报表时传入数据。由于模板文件中不设置数据源,需要手动在模板文件中添加字段。这种方法使源数据可以灵活改变结构形式后再传递给报表,例如实现成品发货细码单的样式

详情

后台 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.exeMicrosoftEdgeWebView2RuntimeInstallerX86.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 能打开预览即可。