大数跨境
0
0

Spring Boot + JasperReport 一键生成PDF、HTML 与 XML 报表

Spring Boot + JasperReport 一键生成PDF、HTML 与 XML 报表 Spring全家桶实战案例
2025-08-28
1
导读:Spring Boot + JasperReport 一键生成PDF、HTML 与 XML 报表
Spring Boot 3实战案例锦集PDF电子书已更新至130篇!

🎉🎉《Spring Boot实战案例合集》目前已更新162个案例,我们将持续不断的更新。文末有电子书目录。

💪💪永久更新承诺

我们郑重承诺,所有订阅合集的粉丝都将享受永久免费的后续更新服务

💌💌如何获取
订阅我们的合集点我订阅,并通过私信联系我们,我们将第一时间将电子书发送给您。

→ 现在就订阅合集

环境:SpringBoot3.4.2



1. 简介

Spring Boot 应用中整合 JasperReports,可实现 PDF、HTML、XML 格式报表的一键生成。通过引入 jasperreports 依赖,开发者能够利用其强大的模板引擎快速构建专业级报表。

  • 首先,使用 Jaspersoft Studio 工具设计 .jrxml 格式的报表模板,定义数据字段、布局样式和分组统计等等逻辑;

  • 在 Spring Boot 服务中加载并编译模板文件,结合 JDBC 或 Java 集合构建数据源,通过 JasperFillManager 填充数据生成 .jasper 报告对象;

  • 调用 JasperExportManager 实现 PDF、HTML、XML 格式的导出。

2.实战案例

2.1 准备环境

首先,引入依赖

<dependency>  <groupId>net.sf.jasperreports</groupId>  <artifactId>jasperreports</artifactId>  <version>7.0.3</version></dependency><dependency>  <groupId>net.sf.jasperreports</groupId>  <artifactId>jasperreports-pdf</artifactId>  <version>7.0.3</version></dependency>

配置字体

如果不进行相应的字体配置,那么默认是不支持中文(不报错,只是不显示)。在本篇文章中我们使用到的字体是 "黑体";所以,我们需要从C:\Windows\Fonts目录下将黑体字体复制到项目中,如下:

接下来,还需要定义fonts.xml文件

<?xml version="1.0" encoding="UTF-8"?><fontFamilies>  <fontFamily name="黑体"><!--字体名称-->    <normal>fonts/simhei.ttf</normal><!--字体文件的路径-->    <bold>fonts/simhei.ttf</bold>    <italic>fonts/simhei.ttf</italic>    <boldItalic>fonts/simhei.ttf</boldItalic>    <pdfEncoding>Identity-H</pdfEncoding><!--这里的定义就与上面1.1的图设置相匹配了-->    <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>

最后,还需要如下的配置文件(resources目录下)

net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactorynet.sf.jasperreports.extension.simple.font.families.lobstertwo=fonts/fonts.xml

以上环境就准备完成了,接下来开始设计报表。

2.2 设计报表

首先,我们需要在如下地址下载设计工具:

https://community.jaspersoft.com/download-jaspersoft/community-edition/jaspersoft-studio_windows_7.x

打开工具后,设计如下的报表:

这些字体都设置为 "黑体"。接下来,还需要建立报表参数(如上$P)以及明显字段(如上$F)。

建立完上面的字段后,我们直接可以将其拖入到报表页面中。

最后,我们将设计好的报表user.jrxml放入项目中,如下:

2.3 导出报表

首先,加载报表并填充数据

public byte[] getReportData(List<User> users, String format) throws Exception {  System.err.println(users) ;  // 1.获取报表  ClassPathResource resource = new ClassPathResource("templates/user.jrxml") ;  JasperReport jasperReport = JasperCompileManager.compileReport(resource.getInputStream()) ;  // 2.设置数据 & 报表参数  JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(users) ;  Map<String, Object> parameters = new HashMap<>() ;  parameters.put("title""用户列表") ;  // 3.填充报表  JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource);  byte[] reportContent ;  try {    // 这里也可以直接导出HTML文件    switch (format) {      case "pdf" -> reportContent = JasperExportManager.exportReportToPdf(jasperPrint) ;      case "xml" -> reportContent = JasperExportManager.exportReportToXml(jasperPrint).getBytes() ;      case "html" -> {        String path = "f:/user.html" ;        JasperExportManager.exportReportToHtmlFile(jasperPrint, path) ;        reportContent = Files.readAllBytes(Paths.get(path)) ;      }      default -> throw new RuntimeException("未知报表格式") ;    }  } catch (JRException e) {    throw new RuntimeException(e) ;  }  return reportContent;}

最后,我们定义Controller接口进行导出

@GetMapping("/export/{format}")public ResponseEntity<Resource> getItemReport(@PathVariable String format) throws Exception {  // 1.模拟数据  List<User> list = new ArrayList<>() ;  for (int i = 0; i < 10; i++) {    list.add(new User(i + 0L"姓名 - " + i, new Random().nextInt(100), i + "@qq.com""地址 - " + i)) ;  }  // 2.获取填充后的报表数据  byte[] reportContent = getReportData(list, format) ;  // 3.下载文件  ByteArrayResource resource = new ByteArrayResource(reportContent);  return ResponseEntity.ok()      .contentType(MediaType.APPLICATION_OCTET_STREAM)      .contentLength(resource.contentLength())      .header(HttpHeaders.CONTENT_DISPOSITION,          ContentDisposition.attachment()              .filename("user-report." + format)              .build().toString())      .body(resource);}

2.4 测试

分别通过如下地址进行访问:

http://localhost:8080/users/export/pdf

http://localhost:8080/users/export/xml

http://localhost:8080/users/export/html



以上是本篇文章的全部内容,如对你有帮助帮忙点赞+转发+收藏

推荐文章

优雅!Spring Boot多模块独立开发新玩法

太强了!用SQL实现Excel文件的CRUD操作

优化!Controller 接口设计、性能调优等8大黄金法则

高级开发!Spring Boot自定义注解实现接口动态切换,非常实用

拒绝重复造轮子!Spring Boot 六大核心AOP切面,开发必备

重磅!Spring Cloud Gateway 全面支持 Servlet 技术栈,简单多了

请不要自己封装!Spring 自带24个工具类,让你开发效率飙升

Spring Boot 通过 6 种方式实现开关功能,最后一种直接封神

Spring Boot超大文件上传的正确方式

实体 到 DTO转换!这7种方式性能差距太大,最后一个才是王者

自己动手实现精简版SpringBoot原来如此简单

基于 Spring Boot 解决并发安全更新的5种方案

图片
图片
图片
图片
图片
图片
图片
图片
图片

【声明】内容源于网络
0
0
Spring全家桶实战案例
Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
内容 832
粉丝 0
Spring全家桶实战案例 Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
总阅读195
粉丝0
内容832