欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot集成JasperReports實(shí)現(xiàn)PDF、HTML、XML的一鍵生成

 更新時(shí)間:2025年10月03日 11:01:39   作者:程序員蝸牛  
本文詳解SpringBoot集成JasperReports流程,包含依賴配置、字體處理、模板設(shè)計(jì)、數(shù)據(jù)填充及接口開發(fā),實(shí)現(xiàn)用戶數(shù)據(jù)多格式(PDF/HTML/XML)報(bào)表導(dǎo)出,覆蓋項(xiàng)目結(jié)構(gòu)搭建與測(cè)試訪問地址

JasperReports 是一個(gè)基于 Java 的開源報(bào)表工具,支持多種輸出格式(如 PDF、HTML、XML 等),廣泛應(yīng)用于 Java 開發(fā)中生成動(dòng)態(tài)報(bào)表‌。本文將完整演示如何在 Spring Boot 項(xiàng)目中整合 JasperReports,從環(huán)境配置、模板設(shè)計(jì)到接口開發(fā),逐步實(shí)現(xiàn)用戶數(shù)據(jù)報(bào)表的導(dǎo)出。

核心原理

  • 工作流程

    • JRXML‌:XML 格式的報(bào)表模板文件,通過設(shè)計(jì)器(如 Jaspersoft Studio)創(chuàng)建‌。
    • Jasper‌:編譯 JRXML 生成的二進(jìn)制文件,用于數(shù)據(jù)填充‌。
    • Jrprint‌:填充數(shù)據(jù)后的報(bào)表對(duì)象,最終通過導(dǎo)出器生成目標(biāo)格式文件‌。
  • 技術(shù)特點(diǎn)

    • 支持多種數(shù)據(jù)源(JDBC、JavaBeans、XML 等)‌。
    • 可生成帶水印的報(bào)表和子報(bào)表。

集成JasperReports步驟

實(shí)現(xiàn) PDF、HTML、XML 一鍵生成!_xml_02

項(xiàng)目目錄結(jié)構(gòu)

實(shí)現(xiàn) PDF、HTML、XML 一鍵生成!_java_03

引入依賴

在 pom.xml 中添加 JasperReports 相關(guān)依賴:

<dependencies>
    <!-- JasperReports 核心依賴 -->
    <dependency>
        <groupId>net.sf.jasperreports</groupId>
        <artifactId>jasperreports</artifactId>
        <version>7.0.3</version>
    </dependency>


    <!-- JasperReports PDF 支持 -->
    <dependency>
        <groupId>net.sf.jasperreports</groupId>
        <artifactId>jasperreports-pdf</artifactId>
        <version>7.0.3</version>
    </dependency>


    <!-- Spring Boot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>


    <!-- Lombok 簡(jiǎn)化實(shí)體類代碼 -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

核心代碼實(shí)現(xiàn)

 啟動(dòng)類

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 實(shí)體類

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;
    }
}

報(bào)表生成工具類

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<User> users, String format) throws Exception {
        // 1. 加載并編譯報(bào)表模板
        ClassPathResource resource = new ClassPathResource("templates/user.jrxml");
        JasperReport jasperReport = JasperCompileManager.compileReport(resource.getInputStream());


        // 2. 準(zhǔn)備數(shù)據(jù)源和參數(shù)
        JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(users);
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("title", "用戶列表");


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


        // 3. 導(dǎo)出不同格式
        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<Resource> export(@PathVariable String format) throws Exception {
        // 模擬數(shù)據(jù)
        List<User> users = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            users.add(new User((long) i, "姓名-" + i, new Random().nextInt(100),
                    i + "@qq.com", "地址-" + i));
        }


        // 生成報(bào)表
        byte[] content = ReportGenerator.generate(users, format);
        ByteArrayResource resource = new ByteArrayResource(content);


        return ResponseEntity.ok()
                .contentType(MediaType.APPLICATION_OCTET_STREAM)
                .header(HttpHeaders.CONTENT_DISPOSITION,
                        ContentDisposition.attachment()
                                .filename("user-report." + format)
                                .build().toString())
                .contentLength(resource.contentLength())
                .body(resource);
    }
}

配置文件

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 系統(tǒng)中,將 Windows 的 黑體字體文件 simhei.ttf 拷貝到項(xiàng)目目錄:

src/main/resources/fonts/simhei.ttf
fonts/fonts.xml
<?xml versinotallow="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>
    <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>

 user.jrxml 示例模板

<?xml versinotallow="1.0" encoding="UTF-8"?>
<!-- 用戶列表報(bào)表模板 -->
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports
                                  http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
              name="user_report"
              pageWidth="595" pageHeight="842"
              columnWidth="555" leftMargin="20" rightMargin="20"
              topMargin="20" bottomMargin="20" uuid="123e4567-e89b-12d3-a456-426614174000">


    <!-- 報(bào)表參數(shù) -->
    <parameter name="title" class="java.lang.String"/>


    <!-- 字段定義 -->
    <field name="id" class="java.lang.Long"/>
    <field name="name" class="java.lang.String"/>
    <field name="age" class="java.lang.Integer"/>
    <field name="email" class="java.lang.String"/>
    <field name="address" class="java.lang.String"/>


    <!-- 報(bào)表標(biāo)題 -->
    <title>
        <band height="50">
            <staticText>
                <reportElement x="0" y="10" width="555" height="30"/>
                <textElement textAlignment="Center">
                    <font fontName="黑體" size="16" isBold="true"/>
                </textElement>
                <text><![CDATA[$P{title}]]></text>
            </staticText>
        </band>
    </title>


    <!-- 表頭 -->
    <columnHeader>
        <band height="20">
            <staticText><reportElement x="0" y="0" width="50" height="20"/><text><![CDATA[ID]]></text></staticText>
            <staticText><reportElement x="50" y="0" width="100" height="20"/><text><![CDATA[姓名]]></text></staticText>
            <staticText><reportElement x="150" y="0" width="50" height="20"/><text><![CDATA[年齡]]></text></staticText>
            <staticText><reportElement x="200" y="0" width="150" height="20"/><text><![CDATA[郵箱]]></text></staticText>
            <staticText><reportElement x="350" y="0" width="205" height="20"/><text><![CDATA[地址]]></text></staticText>
        </band>
    </columnHeader>


    <!-- 數(shù)據(jù)體 -->
    <detail>
        <band height="20">
            <textField><reportElement x="0" y="0" width="50" height="20"/><textFieldExpression><![CDATA[$F{id}]]></textFieldExpression></textField>
            <textField><reportElement x="50" y="0" width="100" height="20"/><textFieldExpression><![CDATA[$F{name}]]></textFieldExpression></textField>
            <textField><reportElement x="150" y="0" width="50" height="20"/><textFieldExpression><![CDATA[$F{age}]]></textFieldExpression></textField>
            <textField><reportElement x="200" y="0" width="150" height="20"/><textFieldExpression><![CDATA[$F{email}]]></textFieldExpression></textField>
            <textField><reportElement x="350" y="0" width="205" height="20"/><textFieldExpression><![CDATA[$F{address}]]></textFieldExpression></textField>
        </band>
    </detail>
</jasperReport>

測(cè)試接口

啟動(dòng)服務(wù)后,分別訪問以下地址即可獲取不同格式的報(bào)表:

  • PDF 報(bào)表:http://localhost:8080/users/export/pdf
  • XML 報(bào)表:http://localhost:8080/users/export/xml
  • HTML 報(bào)表:http://localhost:8080/users/export/html

結(jié)論

通過本文的實(shí)踐,我們基于 Spring Boot + JasperReports 搭建了一套完整的報(bào)表生成解決方案,實(shí)現(xiàn)了 PDF、HTML、XML 的多格式一鍵導(dǎo)出。整個(gè)過程涵蓋了 依賴引入、字體配置、模板設(shè)計(jì)、數(shù)據(jù)填充、接口實(shí)現(xiàn) 等關(guān)鍵環(huán)節(jié)。

到此這篇關(guān)于SpringBoot集成JasperReports實(shí)現(xiàn)PDF、HTML、XML的一鍵生成的文章就介紹到這了,更多相關(guān)Java實(shí)現(xiàn)PDF、HTML、XML一鍵生成內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論