IT俱乐部 PHP SpringBoot集成JasperReports实现PDF、HTML、XML的一键生成

SpringBoot集成JasperReports实现PDF、HTML、XML的一键生成

JasperReports 是一个基于 Java 的开源报表工具,支持多种输出格式(如 PDF、HTML、XML 等),广泛应用于 Java 开发中生成动态报表‌。本文将完整演示如何在 Spring Boot 项目中整合 JasperReports,从环境配置、模板设计到接口开发,逐步实现用户数据报表的导出。

核心原理

  • 工作流程

    • JRXML‌:XML 格式的报表模板文件,通过设计器(如 Jaspersoft Studio)创建‌。
    • Jasper‌:编译 JRXML 生成的二进制文件,用于数据填充‌。
    • Jrprint‌:填充数据后的报表对象,最终通过导出器生成目标格式文件‌。
  • 技术特点

    • 支持多种数据源(JDBC、JavaBeans、XML 等)‌。
    • 可生成带水印的报表和子报表。

集成JasperReports步骤

项目目录结构

引入依赖

在 pom.xml 中添加 JasperReports 相关依赖:

net.sf.jasperreportsjasperreports7.0.3net.sf.jasperreportsjasperreports-pdf7.0.3org.springframework.bootspring-boot-starter-weborg.projectlomboklomboktrue

核心代码实现

 启动类

package com.icoderoad;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class SpringbootJasperreportApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootJasperreportApplication.class, args);
    }
}

User 实体类

package com.icoderoad.entity;


public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
    private String address;


    public User(Long id, String name, Integer age, String email, String address) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.email = email;
        this.address = address;
    }


    public User() {}


    // Getter 和 Setter
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }


    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }


    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }


    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }


    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
}

报表生成工具类

package com.icoderoad.report;


import com.icoderoad.entity.User;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.springframework.core.io.ClassPathResource;


import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;


public class ReportGenerator {


    public static byte[] generate(List users, String format) throws Exception {
        // 1. 加载并编译报表模板
        ClassPathResource resource = new ClassPathResource("templates/user.jrxml");
        JasperReport jasperReport = JasperCompileManager.compileReport(resource.getInputStream());


        // 2. 准备数据源和参数
        JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(users);
        Map parameters = new HashMap();
        parameters.put("title", "用户列表");


        JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource);


        // 3. 导出不同格式
        return switch (format) {
            case "pdf" -> JasperExportManager.exportReportToPdf(jasperPrint);
            case "xml" -> JasperExportManager.exportReportToXml(jasperPrint).getBytes();
            case "html" -> {
                String path = "/tmp/user.html";
                JasperExportManager.exportReportToHtmlFile(jasperPrint, path);
                yield Files.readAllBytes(Paths.get(path));
            }
            default -> throw new IllegalArgumentException("不支持的格式: " + format);
        };
    }
}

控制层

package com.icoderoad.controller;


import com.icoderoad.entity.User;
import com.icoderoad.report.ReportGenerator;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.Resource;
import org.springframework.http.*;
import org.springframework.web.bind.annotation.*;


import java.util.*;


@RestController
@RequestMapping("/users")
public class ReportController {


    @GetMapping("/export/{format}")
    public ResponseEntity export(@PathVariable String format) throws Exception {
        // 模拟数据
        List users = new ArrayList();
        for (int i = 0; i 

配置文件

server:
  port: 8080
spring:
  application:
    name: springboot-jasperreport-demo

jasperreports.properties

net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.simhei=fonts/fonts.xml

首先,在 Linux 系统中,将 Windows 的 黑体字体文件 simhei.ttf 拷贝到项目目录:

src/main/resources/fonts/simhei.ttf
fonts/fonts.xml
fonts/simhei.ttffonts/simhei.ttffonts/simhei.ttffonts/simhei.ttfIdentity-Htrue'黑体', Arial, Helvetica, sans-serif'黑体', Arial, Helvetica, sans-serif

 user.jrxml 示例模板

<font size="16"></font>
                

测试接口

启动服务后,分别访问以下地址即可获取不同格式的报表:

  • PDF 报表:http://localhost:8080/users/export/pdf
  • XML 报表:http://localhost:8080/users/export/xml
  • HTML 报表:http://localhost:8080/users/export/html

结论

通过本文的实践,我们基于 Spring Boot + JasperReports 搭建了一套完整的报表生成解决方案,实现了 PDF、HTML、XML 的多格式一键导出。整个过程涵盖了 依赖引入、字体配置、模板设计、数据填充、接口实现 等关键环节。

到此这篇关于SpringBoot集成JasperReports实现PDF、HTML、XML的一键生成的文章就介绍到这了,更多相关Java实现PDF、HTML、XML一键生成内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!

本文收集自网络,不代表IT俱乐部立场,转载请注明出处。https://www.2it.club/code/php/17192.html
下一篇
联系我们

联系我们

在线咨询: QQ交谈

邮箱: 1120393934@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部