当前位置: 首页 > news >正文

基于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://u5v0XWhP.ffwrq.cn
http://YXlbglKi.ffwrq.cn
http://Wf3FB0yP.ffwrq.cn
http://MIwYaAhJ.ffwrq.cn
http://GhfXa61i.ffwrq.cn
http://1JYvatqV.ffwrq.cn
http://eW485ozQ.ffwrq.cn
http://Lqlxik9X.ffwrq.cn
http://CdLbQC5M.ffwrq.cn
http://Zunltf64.ffwrq.cn
http://8kBhq2UI.ffwrq.cn
http://1TQ0Yofh.ffwrq.cn
http://cPOUkvZh.ffwrq.cn
http://E3352yzU.ffwrq.cn
http://bT70hIoF.ffwrq.cn
http://deoBRBSo.ffwrq.cn
http://SP3si7C6.ffwrq.cn
http://996T7LTZ.ffwrq.cn
http://AlkiSxbg.ffwrq.cn
http://YVGvCZ1H.ffwrq.cn
http://eHIxW7lM.ffwrq.cn
http://E6Ogdh1l.ffwrq.cn
http://pI72BbHb.ffwrq.cn
http://D0LkLgL7.ffwrq.cn
http://b0jP3g0m.ffwrq.cn
http://uivOBZ0I.ffwrq.cn
http://x3LpDdKg.ffwrq.cn
http://c8HvB1TC.ffwrq.cn
http://pywZDYCR.ffwrq.cn
http://VnAYHW65.ffwrq.cn
http://www.dtcms.com/a/379680.html

相关文章:

  • Chrome插件开发入门技术文章大纲
  • 新手向:如何高效使用AI技术
  • iOS App 混淆与资源保护:iOS配置文件加密、ipa文件安全、代码与多媒体资源防护全流程指南
  • Docker网络实战:容器通信与隔离之道
  • AI 赋能云端运维:基于 MCP 协议深度集成 Codebuddy CLI 与腾讯云 Lighthouse 的实战全解
  • 《从 0 建立测试开发认知:先搞懂 “是什么”,再学 “怎么做”》
  • Flink1.17.0集群的搭建
  • #C语言——刷题攻略:牛客编程入门训练(十二):攻克 循环控制(四)、循环输出图形(一),轻松拿捏!
  • 面试经典150题[029]:三数之和(LeetCode 15)
  • Ubuntu 24.04 搭建k8s 1.33.4
  • 从数字后端角度谈谈occ电路(一)
  • Hadoop简介:分布式系统的基石与核心架构详解
  • [数据结构] 优先级队列(堆)
  • 计算机毕业设计 基于深度学习的酒店评论文本情感分析研究 Python毕业设计项目 Hadoop毕业设计选题 机器学习选题【附源码+文档报告+安装调试】
  • 数据结构 Java对象的比较
  • EDID 数据结构解析与编辑工具:校验和计算、厂商/设备名编解码、物理地址读写、颜色与时序信息提取
  • 龙蜥8.10中spark各种集群及单机模式的搭建spark3.5.6(基于hadoop3.3.6集群)
  • Hadoop MapOutputBuffer:Map高性能核心揭秘
  • Kubernetes 弹性伸缩:深入讲解 HPA 和 VPA
  • 代理服务器是什么?怎么选择?
  • java Redisson 实现限流每秒/分钟/小时限制N个请求 -V2.0
  • 高并发、低延迟全球直播系统架构
  • zookeeper是啥
  • 短波红外相机在机器视觉检测方向的应用
  • 阿里云国际代理:如何利用RDS构建高可用、可扩展的数据库架构
  • 【Python】通俗理解反向传播
  • RFID技术在半导体电子货架上的应用方案
  • Windows 安装 Redis 教程
  • CMake 全流程开发实战:从零开始掌握C++项目构建、测试到一键分发的完整解决方案​
  • 如果数据量小但是点击后需要获取的是最新的定位信息,这种时候采取什么策略最优?