docx4j 操作word中的chart
操作流程
- 加载word文档
- 替换文档正文中的变量
- 替换chart显示的数据内容。
- 同步chart数据的excel数据。
- 保存更改后的文件
注意
必须在两个地方更改数据。
如果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相关推荐
- docx4j操作word文档之生成页码、合并多个文档
docx4j操作word文档: 动态生成表格行数并填充数据 单元格内填充图片 合并多个word文档(包含页码,纸张方向等等) 1.动态生成表格行数并填充数据 首先创建模板文件.docx,如图: 代码如 ...
- poi实现操作生成word表格和操作word中的图表数据
poi实现操作生成word表格和操作word中的图表数据 写入word表格 1.1首先要将写入的数据整理好,将其封装在一个类中: 1.2 其次将数据写入word,写成表格 2 在word表格中动态修改 ...
- poi编辑word中的chart,对图表数据替换,并刷新图表
最近工作需要做报表导出,再次接触poi,上次用poi的时候还是上次(在前司编辑excel的时候). 而word呢,数据结构上感觉又比excel复杂,至少我处理的时候认为是这样. 首先看一下要处理的wo ...
- c# 操作word中在右下角插入图片
需求:需要对现有文档在右下角插入图片 /// <summary> /// 将图片插入到word中 /// </summary> /// <param name=" ...
- POI操作Word中的表格XWPFTable,在指定位置插入行
最近由于客户使用Word文档展示表格中的数据,我TM...Excel它不香嘛,为什么要用Word去展示表格呢??? 但是呢.客户就是上帝,上帝让我们干嘛我们就要干嘛. 1:有这样一个需求,在已有的Wo ...
- java 操作word中表格_Java 使用Spire.Cloud.Word给Word文档添加表格
在编辑Word文档时,很多时候需要用到表格,以便能够清晰整洁地表达和归类数据.本文就将介绍如何使用Spire.Cloud.Word给Word文档添加表格.Spire.Cloud.Word提供了Tabl ...
- 使用poi操作word
导入依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifa ...
- 【JAVA - POI 合集】之 POI 操作word 图表,柱状图,折线图,雷达图,条形图 poi4.1.2
1.前言 关于poi 操作word 的吐槽: 山路崎岖, 一言难尽啊!!! 原本项目中的poi 版本是3.17的版本,但是3.17对于在word 中操作图表是有问题的.所以对项目的jar 包进行了升级 ...
- java使用poi在word中生成柱状图、折线图、饼图、柱状图+折线图组合图、动态表格、文本替换、图片替换、更新内置Excel数据、更新插入的文本框内容、合并表格单元格;
本文参考地址:https://blog.csdn.net/wangxiaoyingWXY/article/details/95377533 在参考文章的基础上,增加了扩展.感谢被参考的妹子.另外该博客 ...
- java word表格_java操作word的表格
java操作word的表格 最近项目中需要把提交的页面表单的数据动态写在word模板中,简单的写了个工具类.里面有怎眼操作word 中表格的内容,可以在word中已有的表格后面添加行并且可以增加内容. ...
最新文章
- cocos2d-x 2x 菜鸟编塔防 02 添加敌人
- python饼形图_Python | 饼形图
- Python文件操作2
- python123测验答案第二周温度转换二_python123练习题
- jQuery学习(十二)—jQuery中对象的查找方法总结
- script中的event和for的意思
- 搭乘百度语音识别技术,录音啦识别率最高可达95%
- 在lamp上简单部署应用程序
- IDEA中Debug的使用
- Redis Gossip广播通信 1.gossip原理概述
- 大一java计算圆面积_Java练习题——计算圆的面积
- SpringBoot入门项目——holleWorld
- 模拟数字接口及调制解调器
- 基于面板数据的熵值法介绍与实现
- linux桌面鼠标可动 但点其他,电脑鼠标能动但点不了的两种解决方法
- 根据经纬度查询地理位置
- DeFi:数字银行的下一站?
- 用HTML CSS JS 实现一个工作招聘平台展示响应式网站
- 苹果手机微信怎样设置网络连接服务器地址,微信小程序的网络设置,及网络请求:wx.request(OBJECT)...
- 钢管的订购与运输matlab,钢管订购和运输优化模型