基于POI-TL實現動態Word模板的數據填充:【散點圖】特殊處理方案

基于POI-TL實現動態Word模板的數據填充:散點圖特殊處理方案

在使用POI-TL進行Word模板動態數據填充時,圖表生成是一個常見需求。最近在項目中使用POI-TL處理散點圖時遇到了一個特殊問題,經過研究后找到了解決方案,特此記錄分享。

問題背景

POI-TL作為一款優秀的Java Word模板引擎,提供了豐富的圖表渲染功能。然而在使用默認的多系列插件渲染散點圖時,會出現一個奇怪的錯誤:當散點圖的類別是中文時,POI-TL會把這些中文類別當作x軸數據來渲染,而實際上散點圖的x軸需要的是數字索引,這就導致了圖表渲染失敗。報錯截圖:
在這里插入圖片描述

在這里插入圖片描述

問題分析

通過研究Word圖表中散點圖的示例數據,我發現:

  • 散點圖的數據格式與其他圖表(如柱狀圖、折線圖)在結構上是一致的
  • 都可以包含中文類別
  • 關鍵區別在于:散點圖的x軸需要顯示數字索引,而其他圖表可以直接使用文字類別

默認插件的問題在于沒有區分散點圖和其他圖表的這種差異,統一將類別作為x軸數據處理,當類別是中文時就會出現解析錯誤。
在這里插入圖片描述
在這里插入圖片描述

解決方案

POI-TL提供了靈活的插件擴展機制,允許我們通過實現RenderPolicy接口開發自定義插件。我的解決方案是開發一個專門處理散點圖的自定義插件,重寫其數據源處理邏輯。

核心思路是:分離"X軸顯示標簽"和"散點數值坐標"

核心改進說明

  1. 類別→索引映射:通過createCategoryIndexMap方法將中文類別(如"數據分析應用")轉為數值索引(1,2,3…),作為散點圖的實際X坐標。

  2. 數據源分離

    • 散點圖的X軸數據源使用數值索引(避免字符串解析問題)
    • X軸的顯示標簽仍為中文類別(不影響視覺展示)
  3. 兼容原有邏輯:繼承默認插件的大部分邏輯,僅修改散點圖的X軸數據處理,確保與其他圖表類型(柱狀、折線)兼容。

代碼實現

下面是自定義散點圖渲染插件的完整實現:

package com.hdxm.server.sample.utils;import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.data.ChartMultiSeriesRenderData;
import com.deepoove.poi.data.SeriesRenderData;
import com.deepoove.poi.exception.RenderException;
import com.deepoove.poi.policy.reference.MultiSeriesChartTemplateRenderPolicy;
import com.deepoove.poi.template.ChartTemplate;
import com.deepoove.poi.util.ReflectionUtils;
import org.apache.poi.xddf.usermodel.chart.XDDFAreaChartData;
import org.apache.poi.xddf.usermodel.chart.XDDFBarChartData;
import org.apache.poi.xddf.usermodel.chart.XDDFChart;
import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
import org.apache.poi.xddf.usermodel.chart.XDDFDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFLineChartData;
import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFScatterChartData;
import org.apache.poi.xwpf.usermodel.XWPFChart;import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Predicate;
import java.util.stream.Collectors;/*** poi-tl在用默認的多系列插件渲染散點圖時會報錯,它會把類別當做x軸來渲染數據,* 而實際的散點圖類別是中文,但圖上的x軸是數字索引,這樣就會報錯,因此要自定義一個插件用來渲染散點圖* @author: Hanweihu* @date: 2025/9/12 9:53*/
public class ScatterChartRenderPolicy extends MultiSeriesChartTemplateRenderPolicy {private void validate(List<XDDFChartData> chartSeries, ChartMultiSeriesRenderData data) {// 驗證組合圖表if (chartSeries.size() >= 2) {long nullCount = data.getSeriesDatas().stream().filter(d -> null == d.getComboType()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/98011.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/98011.shtml
英文地址,請注明出處:http://en.pswp.cn/web/98011.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用node-Express框架寫一個學校宿舍管理系統練習項目-前后端分離

今天繼續分享一個新的練習項目&#xff0c;是使用node做為后端語言&#xff0c;來寫的一個前后端分離項目&#xff1a;學校宿舍管理系統。我們如果想掌握一門編程語言&#xff0c;就是需要大量的練習。所以當我們學習到了一些知識&#xff0c;自己想一下 可以拿學到的知識&…

Kafka 運維實戰基本操作含命令與最佳實踐

1. 基礎概覽與工具入口 Kafka 發行包的所有 CLI 工具均在 bin/ 目錄下。任何工具不帶參數運行都會顯示所有可用選項。本文命令默認&#xff1a;--bootstrap-server localhost:9092&#xff1b;生產請替換為你的控制面或內網 VIP。 2. 主題管理&#xff08;創建 / 修改 / 刪除 /…

貪心算法應用:航班起降問題詳解

Java中的貪心算法應用&#xff1a;航班起降問題詳解 貪心算法是一種在每一步選擇中都采取當前狀態下最優的選擇&#xff0c;從而希望導致全局最優解的算法策略。在航班起降問題中&#xff0c;貪心算法可以有效地解決機場跑道調度問題&#xff0c;即如何安排航班的起降順序以最大…

uniapp scroll-view 設置scrollTop無效

當我們使用 scroll-view的scroll-top的時候 默認想讓它回到頂部&#xff0c;當我們設置值為0的時候會不生效&#xff0c;在實際運用過程中&#xff0c;發現設置了scroll-top無效&#xff0c;滾動條位置并沒有發生變化&#xff0c;是因為微信小程序的官方框架處于性能考慮&#…

網絡與通信

1.TCP協議與UDP協議TCP&#xff08;Transmission Control Protocol&#xff0c;傳輸控制協議&#xff09;和 UDP&#xff08;User Datagram Protocol&#xff0c;用戶數據報協議&#xff09;是 TCP/IP 協議族中兩種核心的傳輸層協議&#xff0c;它們在數據傳輸方式、可靠性、適…

Node.js中package.json詳解

1. name&#xff08;名稱&#xff09; 如果你計劃發布你的包&#xff0c;package.json 中最重要的字段是 name 和 version&#xff0c;因為它們是必需的。name 和 version 共同組成一個假定完全唯一的標識符。包的更改應伴隨版本號的更新。如果你不打算發布包&#xff0c;那么…

代碼隨想錄第14天| 翻轉、對稱與深度

226.翻轉二叉樹 &#xff08;優先掌握遞歸&#xff09; 題目鏈接/文章講解/視頻講解&#xff1a;翻轉二叉樹 交換的是指針&#xff0c;而不是數值&#xff0c;如果用數值做交換&#xff0c;需要交換的節點下面無法很好的操作。 使用遞歸來實現&#xff0c;但要提前清除是什么順…

DNS-Windows上使用DNS

DNS-Windows上使用DNS一、查看與修改DNS配置1.1、查看當前DNS服務器設置1.2、臨時修改 DNS 服務器&#xff08;命令行&#xff09;二、DNS緩存相關操作2.1、查看DNS緩存內容2.2、 刷新 DNS 緩存&#xff08;清除過期記錄&#xff09;三、測試域名解析&#xff08;nslookup 工具…

3dsMax 2026 .NET Core 8 轉型下的Maxscript腳本開發:動態編譯模塊的重構策略與兼容性升級路徑

3ds Max 長期以來一直提供出色的 .NET 集成,使 Maxscript 能夠無縫利用任何 .NET 庫的強大功能。部分開發者在工具中廣泛使用了 .NET 功能。 之前,3ds Max 依賴于 .NET Framework 4.8 并且最近更新到了 4.8.1,用于 2025 版本的發布。然而,隨著 3ds Max 2026 的推出,Autod…

golang 做webrtc開發核心

在Golang中進行WebRTC開發&#xff0c;核心在于理解WebRTC協議的工作原理以及如何利用Go生態中的庫來實現關鍵功能。以下是Golang WebRTC開發的核心要點&#xff1a; WebRTC基礎概念 了解ICE&#xff08;Interactive Connectivity Establishment&#xff09;協議用于NAT穿越掌握…

RabbitMQ 異步化抗洪實戰

說明&#xff1a;本文僅展示架構思路與安全片段&#xff0c;所有敏感字段已用占位符&#xff1b;不含可直接復刻的生產細節。數據與接口均為演示/虛擬。0. 背景與目標長耗時/不確定接口&#xff08;如對接第三方機器人平臺&#xff09;的同步阻塞&#xff0c;容易造成請求堆積與…

接口返回 2 萬條數據,easy-trans導致多了20s耗時排查過程

內網訪問排版核料詳情功能&#xff0c;用戶反饋要等十幾秒排查 sql&#xff1a;sql 比較簡單排查內存計算&#xff1a;arthus trace 類名 方法名 總耗時2s排查頁面渲染是否緩慢&#xff1a;F12 查看接口 等待服務器響應 20s 下載時間 30s, 故不考慮渲染問題排查請求響應日志打…

AIGC入門,手搓大模型客戶端與MCP交互

概述 在現代應用開發中&#xff0c;將大語言模型&#xff08;LLM&#xff09;與專用工具服務相結合&#xff0c;可以構建出既能理解自然語言&#xff0c;又能準確執行專業任務的智能代理。本文介紹一個基于 MCP&#xff08;Model Context Protocol&#xff09;協議和 Ollama 本…

深度學習:從預備知識到未來展望

在當今數字化時代&#xff0c;深度學習正以前所未有的速度改變著我們的生活和工作方式。從智能語音助手到自動駕駛汽車&#xff0c;從精準醫療到個性化推薦系統&#xff0c;深度學習的應用無處不在。本文將從深度學習的預備知識入手&#xff0c;探討其發展歷程、關鍵技術和未來…

軟考高級系統架構設計師之構件與中間件技術篇

一、構件的定義 定義1:軟件構件是一種組裝單元&#xff0c;它具有規范的接口規約和顯式的語境依賴。軟件構件可以被獨立地部署并由第三方任意地組裝。 定義2:構件是某系統中有價值的、幾乎獨立的并可替換的一個部分&#xff0c;它在良好定義的體系結構語境內滿足某清晰的功能。…

Node.js 文件上傳中文文件名亂碼問題,為什么只有Node會有亂碼問題,其他后端框架少見?

問題現象當用戶上傳包含中文字符的文件時&#xff0c;在服務器端獲取到的文件名可能變成類似 ????.txt 這樣的亂碼&#xff0c;而不是預期的中文文件名。為什么只有Node會亂碼&#xff1f;很多后端框架&#xff08;如 Java Spring Boot、Python Django、PHP Laravel&#x…

學習英語音標 (從漢語角度看英語音標發音差異)

僅供參考, 跟著教學視頻看不懂時再來看以下引導 以下只寫容易出錯的音標 發音視頻: https://www.jiwake.com/yinbiaofayin/ 音標規則單詞??類似漢語e, 餓~urge?類似漢語e, 餓go??類似漢語o, 哦~walk?類似漢語o, 哦wash?/i?/的短語, 不止發聲短,舌頭不用隆起it?類似漢…

論文筆記(九十一)GWM: Towards Scalable Gaussian World Models for Robotic Manipulation

GWM: Towards Scalable Gaussian World Models for Robotic Manipulation文章概括摘要1. 引言2. 相關工作3. 高斯世界模型&#xff08;Gaussian World Model&#xff09;3.1. 世界狀態編碼&#xff08;World State Encoding&#xff09;3.2. 基于擴散的動態建模&#xff08;Dif…

apache phoenix sql 命令大全詳解

這是一份非常詳細的 Apache Phoenix SQL 命令大全和詳解。Phoenix 作為 HBase 上的 SQL 層&#xff0c;其語法大部分與標準 SQL 兼容&#xff0c;但也有許多針對 HBase 的特性擴展。核心概念 在開始之前&#xff0c;請記住 Phoenix 的兩個核心概念&#xff1a; 主鍵&#xff08…

【代碼講解】SO-ARM100 雙場景演示:手柄驅動 Mujoco 仿真 + 實機控制

視頻講解&#xff1a; 【代碼講解】SO-ARM100 雙場景演示&#xff1a;手柄驅動 Mujoco 仿真 實機控制今天介紹下使用使用北通手柄通過控制 Mujoco 中的 SO-ARM100 機械臂&#xff0c;然后將關節數據通過 zmq 通信轉發控制實際機械臂。 本期中會涉及如下點&#xff0c;需要注意…