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

Java使用POI-TL和JFreeChart動態(tài)生成Word報告

 更新時間:2025年02月09日 09:53:51   作者:Mr-Wanter  
本文介紹了使用POI-TL和JFreeChart生成包含動態(tài)數(shù)據(jù)和圖表的Word報告的方法,并分享了實際開發(fā)中的踩坑經(jīng)驗,通過代碼示例講解的非常詳細,具有一定的參考價值,需要的朋友可以參考下

前言

在開發(fā)過程中,我們經(jīng)常需要生成包含動態(tài)數(shù)據(jù)和圖表的 Word 報告。本文將介紹如何結合 POI-TL 和 JFreeChart,實現(xiàn)動態(tài)生成 Word 報告的功能,并分享一些實際開發(fā)中的踩坑經(jīng)驗。
word生成方案:

  • freemarker+ftl
  • pot-tl模板替換
  • poi硬編碼

一、需求背景

在之前的文章中,我們已經(jīng)介紹了如何使用模板替換、復雜表格和圖片插入等功能。此次的需求是生成一個包含統(tǒng)計圖的 Word 報告,統(tǒng)計圖需要根據(jù)動態(tài)數(shù)據(jù)生成。面臨的主要問題包括:

  • 選擇 Word 生成方案:如何在 Word 中動態(tài)插入數(shù)據(jù)和圖表?
  • 圖片插入方案:如何將生成的統(tǒng)計圖插入到 Word 中?
  • 生成統(tǒng)計圖表方案:如何根據(jù)數(shù)據(jù)動態(tài)生成統(tǒng)計圖?

二、方案分析

  • POI 硬編碼
    直接使用 Apache POI 硬編碼生成 Word 文檔,雖然可行,但代碼復雜且難以維護,因此不推薦。
  • FreeMarker + FTL
    FreeMarker 可以實現(xiàn)文本替換和圖片插入,理論上符合需求。但 FTL 模板的維護較為繁瑣,尤其是在處理復雜表格和圖片時。
  • POI-TL + JFreeChart
    POI-TL 是一個基于 Apache POI 的模板引擎,支持文本替換、圖片插入等功能。結合 JFreeChart 生成統(tǒng)計圖,可以很好地滿足需求。

三、 POI-TL + JFreeChart 實現(xiàn)

關于JFreeChart請移步Java使用JFreeChart創(chuàng)建動態(tài)圖表的代碼示例_java_腳本之家

3.1 Maven 依賴

首先,需要在項目中引入 POI-TL 和 JFreeChart 的依賴。注意 POI 和 POI-TL 的版本需要對應,否則可能會出現(xiàn) NoSuchMethod 等錯誤。

<dependency>
		    <groupId>org.apache.poi</groupId>
		    <artifactId>poi-ooxml</artifactId>
		    <version>4.1.2</version>
		</dependency>
		<dependency>
		    <groupId>org.apache.poi</groupId>
		    <artifactId>poi-scratchpad</artifactId>
		    <version>4.1.2</version>
		</dependency>
		<dependency>
		    <groupId>org.apache.poi</groupId>
		    <artifactId>poi-excelant</artifactId>
		    <version>4.1.2</version>
		</dependency>
		<dependency>
		    <groupId>org.apache.poi</groupId>
		    <artifactId>poi-ooxml-schemas</artifactId>
		    <version>4.1.2</version>
		</dependency>
		<dependency>
			<groupId>org.jfree</groupId>
			<artifactId>jfreechart</artifactId>
			<version>1.5.3</version>
		</dependency>
		<dependency>
			<groupId>com.deepoove</groupId>
			<artifactId>poi-tl</artifactId>
			<version>1.10.0</version>
		</dependency>

3.2 word模板設置

在 Word 模板中,使用占位符標記需要替換的內容。對于圖片,需要在占位符前加 @,例如:

  • 替換文本:時間 -> ${date}
  • 插入圖片:${@dailyOnlinePic}

3.3 實現(xiàn)代碼

以下是核心實現(xiàn)代碼:

    private static final String TEMPLATE_PATH = "classpath:template/report.docx";
    private static final String OUTPUT_DIR = "D:/data/upload/analysis/";
    private static final String PIC_DIR = OUTPUT_DIR + "pic/";

    public void getWord(String curDistCode) {
        try {
            // 獲取模板文件
            File file = ResourceUtils.getFile(TEMPLATE_PATH);

            // 構建模板替換的數(shù)據(jù)
            Map<String, Object> dataMap = buildTemplateData(curDistCode);

            // 生成最終文件路徑
            String fileName = UUIDUtil.genUUID32() + ".docx";
            String filePath = OUTPUT_DIR + fileName;

            // 使用 POI-TL 渲染模板并保存
            try (XWPFTemplate template = XWPFTemplate.compile(file, Configure.newBuilder().buildGramer("${", "}").build())
                    .render(dataMap)) {
                template.writeToFile(filePath);
            }
            //上傳文件返回附件id
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private Map<String, Object> buildTemplateData(String curDistCode) throws IOException {
        Map<String, Object> dataMap = new HashMap<>();

        // 設置日期和在線總數(shù)
        dataMap.put("date", LocalDate.now());
        // 查詢設備數(shù)據(jù)
        dataMap.put("onlineTotal", 100);
        // 生成每日在線圖表
        DefaultCategoryDataset dailyData = buildDailyDataset(stationByTime);
        String dailyPicFile = generateChart(dailyData, "監(jiān)測站總在線數(shù)", "小時", "數(shù)量", dailyOnlineTxtEnum);
        dataMap.put("dailyOnlinePic", Pictures.ofStream(new FileInputStream(dailyPicFile), PictureType.JPEG).size(600, 200).create());
        return dataMap;
    }
    // 構建每日在線圖表的數(shù)據(jù)集
    private DefaultCategoryDataset buildDailyDataset(List<FireStationByTimeDTO> stationByTime) {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        stationByTime.forEach(t -> dataset.addValue(t.getOnlineNum(), "", t.getTime()));
        return dataset;
    }
    // 生成圖表并保存為圖片
    private String generateChart(DefaultCategoryDataset dataset, String title, String xAxisLabel, String yAxisLabel, DailyOnlineTxtEnum style) throws IOException {
        // 設置全局字體(支持中文)
        StandardChartTheme chartTheme = new StandardChartTheme("CN");
        chartTheme.setExtraLargeFont(new Font("宋體", Font.PLAIN, 14)); // 標題字體
        chartTheme.setLargeFont(new Font("宋體", Font.PLAIN, 14));     // 圖例字體
        chartTheme.setRegularFont(new Font("宋體", Font.PLAIN, 12));   // 軸標簽字體
        ChartFactory.setChartTheme(chartTheme);

        // 創(chuàng)建圖表
        JFreeChart chart = ChartFactory.createLineChart(title, xAxisLabel, yAxisLabel, dataset);
        setChartStyle(chart, style);

        // 保存圖表為圖片
        String picFile = PIC_DIR + UUIDUtil.genUUID32() + ".png";
        //int numberOfCategories = dataset.getColumnCount();
        //int width = Math.max(800, numberOfCategories * 50); // 每個類別寬度為50,最小寬度為800
        ChartUtils.saveChartAsPNG(new File(picFile), chart, 1200, 400);
        return picFile;
    }

    // 設置圖表樣式
    private void setChartStyle(JFreeChart chart) {
        CategoryPlot plot = chart.getCategoryPlot();
        chart.setBackgroundPaint(Color.WHITE);
        plot.setBackgroundPaint(Color.WHITE);
        plot.setDomainGridlinePaint(Color.LIGHT_GRAY);
        plot.setRangeGridlinePaint(Color.LIGHT_GRAY);
        // 設置第一條折線的粗細
        plot.getRenderer().setSeriesStroke(0, new BasicStroke(5.0f));
         // 根據(jù)樣式設置折線顏色
        plot.getRenderer().setSeriesPaint(0, Color.RED);
    }

效果

在這里插入圖片描述

踩坑

  • 插入圖片如何占位
    與常規(guī)文本替換不同,圖片插入需要在占位符前加 @,例如 ${@dailyOnlinePic}{{@pic}}
  • 統(tǒng)計圖中文亂碼
    JFreeChart 默認不支持中文,需要通過設置全局字體解決:
       // 設置全局字體(支持中文)
        StandardChartTheme chartTheme = new StandardChartTheme("CN");
        chartTheme.setExtraLargeFont(new Font("宋體", Font.PLAIN, 14)); // 標題字體
        chartTheme.setLargeFont(new Font("宋體", Font.PLAIN, 14));     // 圖例字體
        chartTheme.setRegularFont(new Font("宋體", Font.PLAIN, 12));   // 軸標簽字體
        ChartFactory.setChartTheme(chartTheme);
  • 統(tǒng)計圖橫坐標…
    如果生成的圖片寬度不夠,橫坐標可能會顯示不全??梢酝ㄟ^增加圖片寬度解決,插入時等比例縮放:
ChartUtils.saveChartAsPNG(new File(picFile), chart, 1200, 400);
dataMap.put("dailyOnlinePic", 
Pictures.ofStream(new FileInputStream(dailyPicFile), PictureType.JPEG).size(600, 200).create());

或動態(tài)計算需要生成的圖片寬度:

int numberOfCategories = dataset.getColumnCount();
int width = Math.max(800, numberOfCategories * 50); // 每個類別寬度為50,最小寬度為800

到此這篇關于Java使用POI-TL和JFreeChart動態(tài)生成Word報告的文章就介紹到這了,更多相關Java POI-TL JFreeChart生成Word報告t內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 新版POI獲取日期類型cell值過程圖解

    新版POI獲取日期類型cell值過程圖解

    這篇文章主要介紹了新版POI獲取日期類型cell值過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • 這一次搞懂Spring代理創(chuàng)建及AOP鏈式調用過程操作

    這一次搞懂Spring代理創(chuàng)建及AOP鏈式調用過程操作

    這篇文章主要介紹了這一次搞懂Spring代理創(chuàng)建及AOP鏈式調用過程操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • SpringBoot2.X Kotlin系列之數(shù)據(jù)校驗和異常處理詳解

    SpringBoot2.X Kotlin系列之數(shù)據(jù)校驗和異常處理詳解

    這篇文章主要介紹了SpringBoot 2.X Kotlin系列之數(shù)據(jù)校驗和異常處理詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04
  • Java實現(xiàn)CORS跨域請求的實現(xiàn)方法

    Java實現(xiàn)CORS跨域請求的實現(xiàn)方法

    本篇文章主要介紹了Java實現(xiàn)CORS跨域請求的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Java中String類常用方法總結詳解

    Java中String類常用方法總結詳解

    String類是一個很常用的類,是Java語言的核心類,用來保存代碼中的字符串常量的,并且封裝了很多操作字符串的方法。本文為大家總結了一些String類常用方法的使用,感興趣的可以了解一下
    2022-08-08
  • Java 中的抽象介紹

    Java 中的抽象介紹

    這篇文章主要介紹了Java 中的抽象,數(shù)據(jù)抽象是一種僅向用戶顯示基本細節(jié)的屬性。不向用戶顯示瑣碎或非必需的單元,下面文章Java抽象詳細內容,需要的朋友可以參考一下
    2021-12-12
  • Spring?Boot2.6.0新特性之默認禁止循環(huán)引用

    Spring?Boot2.6.0新特性之默認禁止循環(huán)引用

    Spring?Boot2.6.0為我們帶來很多好用的新特性/改進,這篇文章主要給大家介紹了關于Spring?Boot2.6.0新特性之默認禁止循環(huán)引用的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-02-02
  • SpringDataElasticsearch與SpEL表達式實現(xiàn)ES動態(tài)索引

    SpringDataElasticsearch與SpEL表達式實現(xiàn)ES動態(tài)索引

    這篇文章主要介紹了SpringDataElasticsearch與SpEL表達式實現(xiàn)ES動態(tài)索引,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-09-09
  • Maven優(yōu)雅的添加第三方Jar包的方法

    Maven優(yōu)雅的添加第三方Jar包的方法

    下面小編就為大家?guī)硪黄狹aven優(yōu)雅的添加第三方Jar包的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Java實現(xiàn)EasyCaptcha圖形驗證碼的具體使用

    Java實現(xiàn)EasyCaptcha圖形驗證碼的具體使用

    Java圖形驗證碼,支持gif、中文、算術等類型,可用于Java Web、JavaSE等項目,下面就跟隨小編一起來了解一下
    2021-08-08

最新評論

白山市| 东丽区| 藁城市| 义马市| 丰都县| 福泉市| 望城县| 南陵县| 芜湖市| 安国市| 两当县| 公安县| 长春市| 澄江县| 江油市| 临泉县| 酉阳| 贺兰县| 衡山县| 庆元县| 宜兰县| 红安县| 香河县| 芦山县| 原平市| 衡山县| 柏乡县| 河南省| 拜城县| 东山县| 丁青县| 闸北区| 施甸县| 温泉县| 大余县| 武鸣县| 巩留县| 北安市| 罗江县| 谢通门县| 临邑县|