使用 Java 更新 Word 文档中的图表数据-超详细
使用 Java 更新 Word 文档中的图表数据
在日常的工作中,尤其是在数据分析和报告自动化的场景中,可能会遇到需要定期更新 Word 文档中的图表数据的需求。比如,生成数据报告时,我们需要在图表中更新一些动态的数据值。今天,我将展示如何使用 Java 和 Apache POI 库来实现这一功能:自动读取 Word 文件中的图表,提取 Excel 数据源,修改数据并更新图表。
背景
我们要处理的是 Word 文档中的图表,而这些图表的数据源存储在嵌入的 Excel 文件中。通过操作 Excel 数据,我们可以更新图表中的数据,并且确保图表会根据新的数据重新渲染。
本篇文章的目标是:
- 读取 Word 文件中的图表。
- 提取和修改图表的数据源(嵌入的 Excel 文件)。
- 更新图表数据,并将修改后的数据嵌入回 Word 文件中。
依赖库
本项目使用了 Apache POI 作为核心库,它支持读取和操作 Word 文档(.docx
文件)和 Excel 文件(.xlsx
文件)。你需要在项目中添加以下依赖:
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version>
</dependency>
<dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId><version>5.1.1</version>
</dependency>// 或者 4.0版本<groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.poi/ooxml-schemas --><dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><version>1.4</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.poi/poi-scratchpad --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version></dependency>
步骤解析
-
读取 Word 文件:
使用XWPFDocument
读取 Word 文件并获取其中的图表对象。每个图表都是一个XWPFChart
对象,其中包含了图表的数据源,即嵌入的 Excel 文件。 -
提取 Excel 数据源:
从图表中提取嵌入的 Excel 数据源,并将其转化为XSSFWorkbook
对象。这样我们可以访问 Excel 文件中的工作表,并对其数据进行修改。 -
修改 Excel 数据:
在修改 Excel 数据时,我们需要根据预设的规则来替换 Excel 单元格中的值。例如,在单元格中,某些值可能是动态的,需要替换为来自其他地方的数据。我们通过字符串查找和替换的方式来完成这一任务。 -
更新图表数据:
修改 Excel 数据后,我们需要将其更新回图表中。通过操作图表的底层 XML,我们可以更新图表的数据引用,并让图表基于新的数据重新绘制。 -
保存并覆盖原文件:
最后,我们将修改后的 Word 文件保存,并覆盖原有的文件,以便生成新的报告。
代码实现
以下是实现这个功能的 Java 代码:
import org.apache.poi.xwpf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.xmlbeans.XmlCursor;import java.io.*;
import java.util.List;
import java.util.HashMap;
import java.util.Map;public class WordChartUpdater {static Map<String,Object> cellValueMap = new HashMap<>();static Map<String, Object> tagDataMap = new HashMap<>();static {tagDataMap.put("current_branch_name","测试");tagDataMap.put("ZYJGZB_079","测试x");tagDataMap.put("ZYJGZB_091","11");}public static void updateChartInWord(File wordFile, ChartData chartData) throws IOException {// 1. 读取 Word 文件FileInputStream fis = new FileInputStream(wordFile);XWPFDocument document = new XWPFDocument(fis);// 2. 获取文档中的所有图表List<XWPFChart> charts = document.getCharts();if (charts.isEmpty()) {System.out.println("No charts found in the Word document.");return;}// 3. 获取图表的数据源for (XWPFChart chart : charts) {XSSFWorkbook workbook = getChartDataAsWorkbook(chart);if (workbook == null || workbook.getNumberOfSheets() == 0) {System.out.println("The chart does not have a valid data source.");continue;}// 4. 修改 Excel 数据modifyChartData(workbook, chartData);// 5. 将修改后的 Excel 数据嵌入到 Word 图表中updateChartWithNewData(chart, workbook);}// 6. 保存更新后的 Word 文件(覆盖原文件)FileOutputStream fos = new FileOutputStream(wordFile);document.write(fos);fos.close();fis.close();}private static XSSFWorkbook getChartDataAsWorkbook(XWPFChart chart) throws IOException {try {return chart.getWorkbook();} catch (InvalidFormatException e) {throw new IOException("Failed to extract workbook from chart", e);}}private static void modifyChartData(XSSFWorkbook workbook, ChartData chartData) {XSSFSheet sheetAt = workbook.getSheetAt(0);for (int i = 0; i < 20; i++) { // 20列20行数据XSSFRow row = sheetAt.getRow(i);if (row == null) {break;}for (int j = 0; j < 20; j++) {XSSFCell cell = row.getCell(j);if (cell == null) {break;}if (CellType.NUMERIC != cell.getCellType() && cell.getStringCellValue().contains("$")) {String key = cell.getStringCellValue();String substring = key.substring(key.lastIndexOf("$"), key.lastIndexOf("}") + 1);if (tagDataMap.get(substring) != null) {String s = key.replace(substring, (String) tagDataMap.get(substring));cell.setCellValue(s);cellValueMap.put(cell.getAddress().toString(), s);} else {cell.setCellValue(0);cellValueMap.put(cell.getAddress().toString(), 0);}}}}}private static void updateChartWithNewData(XWPFChart chart, XSSFWorkbook updatedWorkbook) throws IOException {// 图表数据更新的逻辑...// 评论或者私信即可领取}public static void main(String[] args) throws IOException {// 创建一个示例对象,填充数据ChartData chartData = new ChartData("value_079", "Branch A", "value_091");// 修改 Word 文件File wordFile = new File("D:\\Desktop\\GZRC_ceshi.docx"); // 修改为你的 Word 文件路径updateChartInWord(wordFile, chartData);}
}
代码详解
-
读取 Word 文件:首先,我们使用
XWPFDocument
从 Word 文件中读取数据。 -
提取 Excel 数据源:通过
getChartDataAsWorkbook
获取图表数据源,即嵌入在图表中的 Excel 文件。 -
修改数据:
modifyChartData
方法根据需求修改 Excel 中的单元格数据,使用tagDataMap
中的数据进行替换。 -
更新图表:在
updateChartWithNewData
方法中,我们将修改后的数据更新回图表。 -
保存更新的 Word 文件:最后,通过
document.write(fos)
将修改后的文件保存回磁盘。
总结
使用 Apache POI 处理 Word 文件中的图表更新是一项非常有用的技能,尤其是在自动化报告生成的过程中。通过对图表数据源(嵌入的 Excel 文件)进行修改,我们可以实现动态更新图表数据并更新 Word 文档,从而大大提高工作效率。
如果你有任何问题,或者遇到困难,欢迎在评论区留言。希望这篇文章能对你有所帮助!
相关文章:
使用 Java 更新 Word 文档中的图表数据-超详细
使用 Java 更新 Word 文档中的图表数据 在日常的工作中,尤其是在数据分析和报告自动化的场景中,可能会遇到需要定期更新 Word 文档中的图表数据的需求。比如,生成数据报告时,我们需要在图表中更新一些动态的数据值。今天…...

Qt常用控件之下拉框QComboBox
下拉框QComboBox QComboBox 是一个下拉框控件。 1. QComboBox属性 属性说明currentText当前选中的文本。currentIndex当前选中的条目下标(从 0 开始,如果没有条目被选中则该值为 -1)。editable是否允许被修改。为 true 时,QCom…...
Qt 中集成mqtt协议
一,引入qmqtt 库 我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台时 方便,直接编译就行了。 原始仓库路径:https://github.com/emqx/qmqtt/tree/master 二,使用 声明一个单例类,将订阅到…...
2024年第十五届蓝桥杯大赛软件赛省赛Python大学A组真题解析
文章目录 试题A: 拼正方形(本题总分:5 分)解析答案试题B: 召唤数学精灵(本题总分:5 分)解析答案试题C: 数字诗意解析答案试题A: 拼正方形(本题总分:5 分) 【问题描述】 小蓝正在玩拼图游戏,他有7385137888721 个2 2 的方块和10470245 个1 1 的方块,他需要从中挑出一些…...
AI大模型-提示工程学习笔记19-自我反思
目录 1. 自我反思的核心思想 (1) LLM 的局限性 (2) Reflexion 的解决方案 2. Reflexion 的工作流程 (1) 任务输入 (2) 初始生成 (3) 反思 (Reflection) (4) 调整与改进 (5) 迭代 (6) 结果输出 3. Reflexion 的关键组件 (1) 大语言模型 (LLM) (2) 反思者 (Reflector…...
GaussDB 学习实战指南:从部署到高并发优化的全流程解析
引言 GaussDB 作为华为推出的高性能分布式数据库,凭借其 分布式架构、高可用性、云原生支持 等特性,成为企业级应用的核心选择。本文将以 实战操作为核心,覆盖 集群部署、数据分片、性能调优、容灾备份、云上迁移 五大场景,通过真实案例与代码示例,助你快速掌握 GaussDB …...
vue3 Props的使用
Props是什么? 官方地址:Props | Vue.js 在 Vue 中,props 是父组件向子组件传递数据的一种机制。 props 是子组件中定义的自定义属性,父组件通过这些属性向子组件传递数据。 它们是单向数据流的一部分,意味着数据只能…...

Ecode前后端传值
说明 在泛微 E9 系统开发过程中,使用 Ecode 调用后端接口并进行传值是极为常见且关键的操作。在上一篇文章中,我们探讨了 Ecode 调用后端代码的相关内容,本文将深入剖析在 Ecode 中如何向后端传值,以及后端又该如何处理接收这些值…...

【Linux】进程状态(二)
目录 前言: 一、进程状态: 1.运行状态(时间片) 2.阻塞状态 3.阻塞挂起状态 二、Linux进程状态: 1.运行状态(R)和阻塞状态(S) 2.深度睡眠状态(D) 3.停止状态(T) 3.1使进程在后台运行 4.追踪暂停状态(t) 5.死亡状态(X)和僵尸状态…...

domain 网络安全 网络安全域
🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 文章目录 1、域的概述 1.1、工作组与域1.2、域的特点1.3、域的组成1.4、域的部署概述1.5、活动目录1.6、组策略GPO 2、域的部署实验 2.1、建立局域网…...
链表和STL —— list 【复习笔记】
1. 链表 1.1 链表的定义和类型 和顺序表一样,链表也是一种线性表,线性表存储结构为链式存储就是链表 链式存储不仅要保存数据元素,还要保存数据元素间的关系,这两个部分信息形成了结点。结点有两个域:数据域&#x…...
Java Map实现类面试题
Java Map实现类面试题 HashMap Q1: HashMap的实现原理是什么? HashMap基于哈希表实现,使用数组链表红黑树(Java 8)的数据结构。 public class HashMapPrincipleExample {// 模拟HashMap的基本结构public class SimpleHashMap&…...
技术架构和工程架构区别
技术架构 技术架构是对某一技术问题解决方案的结构化描述,包括组件结构及其交互关系。它涵盖部署方案、存储方案、缓存方案、日志方案等多个方面,旨在通过组织人员和技术,以最低的成本满足需求和应对变化,保障软件的稳定高效运…...

简单介绍JVM
1.什么是JVM? JVM就是Java虚拟机【Java Virtual Machine】,简称JVM。主要部分包括类加载子系统,运行时数据区,执行引擎,本地方法库等,接下来我们一一介绍 2.类加载子系统 JVM中运行的就是我们日常写的JA…...

纷析云:赋能企业财务数字化转型的开源解决方案
在企业数字化转型的浪潮中,财务管理的高效与安全成为关键。纷析云凭借其开源、安全、灵活的财务软件解决方案,为企业提供了一条理想的转型路径。 一、开源的力量:自主、安全、高效 纷析云的核心优势在于其100%开源的财务软件源码。这意味着…...
DeepSeek开源周第二弹:DeepEP如何用RDMA+FP8让MoE模型飞起来?
一、引言:MoE模型的通信瓶颈与DeepEP的诞生 在混合专家(MoE)模型训练中,专家间的全对全(All-to-All)通信成为性能瓶颈。传统方案在跨节点传输时带宽利用率不足50%,延迟高达300μs以上。DeepSee…...

NLP学习记录十:多头注意力
一、单头注意力 单头注意力的大致流程如下: ① 查询编码向量、键编码向量和值编码向量分别经过自己的全连接层(Wq、Wk、Wv)后得到查询Q、键K和值V; ② 查询Q和键K经过注意力评分函数(如:缩放点积运算&am…...

【MySql】EXPLAIN执行计划全解析:15个字段深度解读与调优指南
文章目录 一、执行计划核心字段总览二、关键字段深度拆解1. type(访问类型)——查询性能的晴雨表典型场景分析: 2. key_len(索引使用长度)——索引利用率的检测仪计算示例: 3. Extra(附加信息&a…...

论文笔记(七十二)Reward Centering(五)
Reward Centering(五) 文章概括摘要附录B 理论细节C 实验细节D 相关方法的联系 文章概括 引用: article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan, Yi and Tomar, Manan and Sutton, Richard S},journal{arX…...
Linux内核自定义协议族开发指南:理解net_device_ops、proto_ops与net_proto_family
在Linux内核中开发自定义协议族需要深入理解网络协议栈的分层模型。net_device_ops、proto_ops和net_proto_family是三个关键结构体,分别作用于不同的层次。本文将详细解析它们的作用、交互关系及实现方法,并提供一个完整的开发框架。 一、核心结构体的作用与层级关系 struct…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...