操作流程

  1. 加载word文档
  2. 替换文档正文中的变量
  3. 替换chart显示的数据内容。
  4. 同步chart数据的excel数据。
  5. 保存更改后的文件

注意

必须在两个地方更改数据。
如果chart中的数据没有设置,那么打开生成的word后,chart显示的数据不正确。之后编辑chart数据之后才会显示正确数据。
如果没有更新excel中的数据,打开word后chart数据显示正确。但此时编辑chart数据,chart的数据会被老数据覆盖。

源码Demo

     WordprocessingMLPackage template = WordprocessingMLPackage.load(wordPath.toFile());MainDocumentPart mainDocumentPart = template.getMainDocumentPart();Map<String, String> params = parseToMap(userTableModel);Map<String, String> keyParams = parseToKeyMap(userTableModel);
//      VariablePrepare.prepare(template);mainDocumentPart.variableReplace(params);Chart chart = (Chart) template.getParts().get(new PartName("/word/charts/chart1.xml"));List<Object> objects = chart.getJaxbElement().getChart().getPlotArea().getAreaChartOrArea3DChartOrLineChart();for (Object object : objects) {if (object instanceof CTBarChart) {List<CTBarSer> ctBarSers = ((CTBarChart) object).getSer();for (int j = 0; j < ctBarSers.size(); j++) {// 列CTBarSer ctBarSer = ctBarSers.get(j);List<CTNumVal> ctNumVals = ctBarSer.getVal().getNumRef().getNumCache().getPt();for (int i = 0; i < ctNumVals.size(); i++) {CTNumVal ctNumVal = ctNumVals.get(i);System.out.println("values :" + ctNumVal.getV());UserStat userStat = userTableModel.getUserStats().get(j);if (i == 0) {ctNumVal.setV(userStat.getUserCount().toString());} else {ctNumVal.setV(userStat.getPer().toString());}System.out.println("new values :" + ctNumVal.getV());}}}}for (Object object : objects) {if (object instanceof CTBarChart) {List<CTBarSer> ctBarSers = ((CTBarChart) object).getSer();for (CTBarSer ctBarSer : ctBarSers) {List<CTStrVal> pts = ctBarSer.getTx().getStrRef().getStrCache().getPt();if (!CollectionUtils.isEmpty(pts)) {for (CTStrVal pt : pts) {String value = pt.getV();if (keyParams.containsKey(value)) {pt.setV(keyParams.get(value));}}}}}}EmbeddedPackagePart epp = (EmbeddedPackagePart) template.getParts().get(new PartName("/word/embeddings/Workbook1.xlsx"));if (epp == null) {throw new Exception("Could find EmbeddedPackagePart: /word/embeddings/Workbook1.xlsx ");}InputStream is = BufferUtil.newInputStream(epp.getBuffer());SpreadsheetMLPackage spreadSheet = (SpreadsheetMLPackage) SpreadsheetMLPackage.load(is);Map<PartName, Part> partsMap = spreadSheet.getParts().getParts();Iterator<Entry<PartName, Part>> it = partsMap.entrySet().iterator();while (it.hasNext()) {Map.Entry<PartName, Part> pairs = it.next();if (partsMap.get(pairs.getKey()) instanceof WorksheetPart) {WorksheetPart wsp = (WorksheetPart) partsMap.get(pairs.getKey());List<Row> rows = wsp.getJaxbElement().getSheetData().getRow();for (int rowNum = 1; rowNum < rows.size(); rowNum++) {Row row = rows.get(rowNum);List<Cell> cells = row.getC();for (int colNum = 1; colNum < cells.size(); colNum++) {Cell cell = cells.get(colNum);UserStat userStat = userTableModel.getUserStats().get(colNum - 1);if (cell.getR().endsWith("2")) {System.out.println(cell.getR() + " CELL VAL: " + cell.getV());cell.setT(STCellType.N);cell.setV(userStat.getUserCount().toString());System.out.println(cell.getR() + " CELL new VAL: " + cell.getV());} else {System.out.println(cell.getR() + " CELL VAL: " + cell.getV());cell.setT(STCellType.N);cell.setV(userStat.getPer().toString());System.out.println(cell.getR() + " CELL new VAL: " + cell.getV());}}}}}ByteArrayOutputStream baos = new ByteArrayOutputStream();Save saver = new Save(spreadSheet);saver.save(baos);epp.setBinaryData(baos.toByteArray());Docx4J.save(template, outPath.toFile());

docx4j 操作word中的chart相关推荐

  1. docx4j操作word文档之生成页码、合并多个文档

    docx4j操作word文档: 动态生成表格行数并填充数据 单元格内填充图片 合并多个word文档(包含页码,纸张方向等等) 1.动态生成表格行数并填充数据 首先创建模板文件.docx,如图: 代码如 ...

  2. poi实现操作生成word表格和操作word中的图表数据

    poi实现操作生成word表格和操作word中的图表数据 写入word表格 1.1首先要将写入的数据整理好,将其封装在一个类中: 1.2 其次将数据写入word,写成表格 2 在word表格中动态修改 ...

  3. poi编辑word中的chart,对图表数据替换,并刷新图表

    最近工作需要做报表导出,再次接触poi,上次用poi的时候还是上次(在前司编辑excel的时候). 而word呢,数据结构上感觉又比excel复杂,至少我处理的时候认为是这样. 首先看一下要处理的wo ...

  4. c# 操作word中在右下角插入图片

    需求:需要对现有文档在右下角插入图片 /// <summary> /// 将图片插入到word中 /// </summary> /// <param name=" ...

  5. POI操作Word中的表格XWPFTable,在指定位置插入行

    最近由于客户使用Word文档展示表格中的数据,我TM...Excel它不香嘛,为什么要用Word去展示表格呢??? 但是呢.客户就是上帝,上帝让我们干嘛我们就要干嘛. 1:有这样一个需求,在已有的Wo ...

  6. java 操作word中表格_Java 使用Spire.Cloud.Word给Word文档添加表格

    在编辑Word文档时,很多时候需要用到表格,以便能够清晰整洁地表达和归类数据.本文就将介绍如何使用Spire.Cloud.Word给Word文档添加表格.Spire.Cloud.Word提供了Tabl ...

  7. 使用poi操作word

    导入依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifa ...

  8. 【JAVA - POI 合集】之 POI 操作word 图表,柱状图,折线图,雷达图,条形图 poi4.1.2

    1.前言 关于poi 操作word 的吐槽: 山路崎岖, 一言难尽啊!!! 原本项目中的poi 版本是3.17的版本,但是3.17对于在word 中操作图表是有问题的.所以对项目的jar 包进行了升级 ...

  9. java使用poi在word中生成柱状图、折线图、饼图、柱状图+折线图组合图、动态表格、文本替换、图片替换、更新内置Excel数据、更新插入的文本框内容、合并表格单元格;

    本文参考地址:https://blog.csdn.net/wangxiaoyingWXY/article/details/95377533 在参考文章的基础上,增加了扩展.感谢被参考的妹子.另外该博客 ...

  10. java word表格_java操作word的表格

    java操作word的表格 最近项目中需要把提交的页面表单的数据动态写在word模板中,简单的写了个工具类.里面有怎眼操作word 中表格的内容,可以在word中已有的表格后面添加行并且可以增加内容. ...

最新文章

  1. cocos2d-x 2x 菜鸟编塔防 02 添加敌人
  2. python饼形图_Python | 饼形图
  3. Python文件操作2
  4. python123测验答案第二周温度转换二_python123练习题
  5. jQuery学习(十二)—jQuery中对象的查找方法总结
  6. script中的event和for的意思
  7. 搭乘百度语音识别技术,录音啦识别率最高可达95%
  8. 在lamp上简单部署应用程序
  9. IDEA中Debug的使用
  10. Redis Gossip广播通信 1.gossip原理概述
  11. 大一java计算圆面积_Java练习题——计算圆的面积
  12. SpringBoot入门项目——holleWorld
  13. 模拟数字接口及调制解调器
  14. 基于面板数据的熵值法介绍与实现
  15. linux桌面鼠标可动 但点其他,电脑鼠标能动但点不了的两种解决方法
  16. 根据经纬度查询地理位置
  17. DeFi:数字银行的下一站?
  18. 用HTML CSS JS 实现一个工作招聘平台展示响应式网站
  19. 苹果手机微信怎样设置网络连接服务器地址,微信小程序的网络设置,及网络请求:wx.request(OBJECT)...
  20. 钢管的订购与运输matlab,钢管订购和运输优化模型

热门文章

  1. HFSS----微带天线设计实例之模型分析优化
  2. Android一键清空内存,教你一键深度清理手机垃圾,瞬间释放几个G,再也不怕内存不够了...
  3. 如何在MFC界面使用OCX控件
  4. 为什么Word打印预览的跟实际的不一样呢
  5. 计算机代码画玫瑰,turtle画玫瑰花(示例代码)
  6. 电蚊拍GB4706检测及安规测试设备
  7. 1.通俗地理解贝叶斯公式(定理)
  8. Centos7 64位镜像下载
  9. 前后端api参考手册
  10. 3D MAX 中 CR 渲染较慢?Corona渲染器优化建议来了