最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

核心原理

  • 工作流程

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

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

集成JasperReports步驟

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

項目目錄結構

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

引入依賴

在 pom.xml 中添加 JasperReports 相關依賴:

<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 簡化實體類代碼 -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

核心代碼實現(xiàn)

 啟動類

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<User> 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<String, Object> 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<Resource> export(@PathVariable String format) throws Exception {
        // 模擬數據
        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));
        }


        // 生成報表
        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 拷貝到項目目錄:

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"?>
<!-- 用戶列表報表模板 -->
<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">


    <!-- 報表參數 -->
    <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"/>


    <!-- 報表標題 -->
    <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>


    <!-- 數據體 -->
    <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>

測試接口

啟動服務后,分別訪問以下地址即可獲取不同格式的報表:

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

結論

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

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

相關文章

  • 如何理解PHP核心特性命名空間

    如何理解PHP核心特性命名空間

    在命名空間提出之前,不同的組件很容易碰到命名的沖突,例如Request、Response等常見的命名。本文將帶你理解PHP的核心特性命名空間。
    2021-05-05
  • PHP直接修改表內容DataGrid功能實現(xiàn)代碼

    PHP直接修改表內容DataGrid功能實現(xiàn)代碼

    最近想做一個通過PHP實現(xiàn)DataGrid功能的東西,這樣可以直接修改數據庫中表的內容,而不用開發(fā)【新增數據頁面】和【編輯頁面】,本篇首先介紹基于MySQL的使用方法,再簡單介紹對于Oracle連接(基于sqlrelay)的二次開發(fā)。
    2015-09-09
  • PHP實現(xiàn)SQL語句格式化功能的方法

    PHP實現(xiàn)SQL語句格式化功能的方法

    這篇文章主要介紹了PHP實現(xiàn)SQL語句格式化功能的方法,基于github上開源代碼實現(xiàn)的SQL語句格式化功能,非常簡單實用,需要的朋友可以參考下
    2017-07-07
  • 基于PHP實現(xiàn)解密或加密Cloudflar郵箱保護

    基于PHP實現(xiàn)解密或加密Cloudflar郵箱保護

    這篇文章主要介紹了基于PHP實現(xiàn)解密Cloudflar郵箱保護,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • php+ajax實現(xiàn)無刷新分頁的方法

    php+ajax實現(xiàn)無刷新分頁的方法

    這篇文章主要介紹了php+ajax實現(xiàn)無刷新分頁的方法,詳細講述了數據庫的創(chuàng)建、Ajax文件的實現(xiàn)及PHP調用方法,需要的朋友可以參考下
    2014-11-11
  • PHP 驗證碼的實現(xiàn)代碼

    PHP 驗證碼的實現(xiàn)代碼

    PHP 驗證碼的實現(xiàn)代碼,需要的朋友可以參考下。
    2011-07-07
  • 通過實例解析PHP數據類型轉換方法

    通過實例解析PHP數據類型轉換方法

    這篇文章主要介紹了通過實例解析PHP數據類型轉換方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • PHP浮點數的一個常見問題

    PHP浮點數的一個常見問題

    本文主要給大家詳細介紹了下php的浮點數,以及在應用中關于浮點數的一個小問題,有需要的小伙伴可以參考下
    2016-03-03
  • PHP單文件上傳原理及上傳函數的封裝操作示例

    PHP單文件上傳原理及上傳函數的封裝操作示例

    這篇文章主要介紹了PHP單文件上傳原理及上傳函數的封裝操作,結合實例形式詳細分析了php文件上傳的原理、步驟及相關函數封裝操作技巧,需要的朋友可以參考下
    2019-09-09
  • PHP實現(xiàn)無限極分類的兩種方式示例【遞歸和引用方式】

    PHP實現(xiàn)無限極分類的兩種方式示例【遞歸和引用方式】

    這篇文章主要介紹了PHP實現(xiàn)無限極分類的兩種方式,結合實例形式分析了php基于遞歸和引用方式進行數組遍歷的相關操作技巧,需要的朋友可以參考下
    2019-03-03

最新評論

越西县| 左云县| 泾阳县| 永泰县| 文昌市| 孝义市| 信宜市| 青铜峡市| 固原市| 金乡县| 达尔| 巨野县| 儋州市| 克拉玛依市| 汾西县| 木兰县| 乌审旗| 城步| 行唐县| 湟源县| 华坪县| 南通市| 军事| 班戈县| 田林县| 砚山县| 龙南县| 岳普湖县| 陇南市| 崇明县| 徐闻县| 邵东县| 富民县| 藁城市| 房山区| 东乌珠穆沁旗| 永年县| 宜宾县| 双桥区| 余庆县| 毕节市|