poi编辑word中的chart,对图表数据替换,并刷新图表
最近工作需要做报表导出,再次接触poi,上次用poi的时候还是上次(在前司编辑excel的时候)。
而word呢,数据结构上感觉又比excel复杂,至少我处理的时候认为是这样。
首先看一下要处理的word模板:
引入依赖:
<dependencies><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.0</version></dependency></dependencies>
我们首先将word文件读入内存中:
final String inputUrl = "D:/testCheck/ReportTemp.docx";final String outputUrl = "D:/testCheck/ReportDemo.docx";InputStream is = new FileInputStream(inputUrl);XWPFDocument doc = new XWPFDocument(is);
然后看一下poi读取word的结构。
XWPFDocument代表一个docx文档,其可以用来读docx文档,也可以用来写docx文档
XWPFParagraph代表文档、表格、标题等种的段落,由多个XWPFRun组成
XWPFRun代表具有同样风格的一段文本
XWPFTable代表一个表格
XWPFTableRow代表表格的一行
XWPFTableCell代表表格的一个单元格
XWPFChart 表示.docx文件中的图表
XWPFHyperlink 表示超链接
XWPFPicture 代表图片
我所用的样例里面没有图片超链接等,所以没有XWPFPicture XWPFHyperlink 这些东西
这篇要讲的主要是处理chart,文本替换和表格等内容留到下篇,所以我们先获取该word文件中的所有图表:
List<XWPFChart> charts= doc.getCharts();
看下poi在内存中获取到的内容:
我们成功的获取到了三个图表。
下一步,对图表内嵌的excel中数据进行替换,首先获取第一个,空心的饼图中的excel。
XWPFChart chart0 = charts.get(0);XSSFWorkbook workbook = chart0.getWorkbook();XSSFSheet sheet0 = workbook.getSheetAt(0);
然后我们观察sheet0对象,可以看到我们已经获取到了内嵌表格的数据。
与模板中的数据对比
发现他们是一样一样的,然后我们依次修改这些数据
int grade = 95;XSSFCell cell01 = sheet0.getRow(1).getCell(1);cell01.setCellValue(grade);XSSFCell cell02 = sheet0.getRow(2).getCell(1);cell02.setCellValue(100-grade);
到此,保存 通过文件流写入磁盘新的文件。打开生成的新文件后发现,该图表依然没变,但是点击图标编辑数据的一瞬间,发现内嵌excel数据是我们写入的了,图表变成了我们想要的样子!为什么会这样呢?查阅很多资料后明白了,修改数据之后还要替换图表中的数据并且重新画图。
//获取横轴纵轴XDDFChartData chartData0 = chart0.getChartSeries().get(0);XDDFChartData.Series s0 = chartData0.getSeries().get(0);//设置图表中的数据,从内嵌的表格sheet0中获取XDDFDataSource cat0 = XDDFDataSourcesFactory.fromStringCellRange(sheet0,new CellRangeAddress(1, 2, 0, 0));XDDFNumericalDataSource val0 = XDDFDataSourcesFactory.fromNumericCellRange(sheet0,new CellRangeAddress(1,2,1,1));//替换原有的数据s0.replaceData(cat0,val0);//设置标题chart0.setTitleText("图1 总分" + grade);//重新绘图chart0.plot(chartData0);
其中CellRangeAddress方法可以从其定义看出,四个参数的含义分别是首行,终行,首列,终列。
CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol)
这样我们就可以得到想要的空心饼图。
柱形图和实心饼图类似,不再赘述,代码如下:
//第二个图表,各科分数XWPFChart chart1 = charts.get(1);XSSFWorkbook workbook1 = chart1.getWorkbook();XSSFSheet sheet1 = workbook1.getSheetAt(0);XSSFCell cell10 = sheet1.getRow(1).getCell(0);cell10.setCellValue("数学");XSSFCell cell11 = sheet1.getRow(1).getCell(1);cell11.setCellValue(80);//因为原模板中 只插入了一行数据,所以这里需要用createCell方法新建一个单元格,直接getCell会报空指针XSSFCell cell20 = sheet1.getRow(2).createCell(0);cell20.setCellValue("英语");XSSFCell cell21 = sheet1.getRow(2).createCell(1);cell21.setCellValue(38);XDDFChartData chartData1 = chart1.getChartSeries().get(0);XDDFChartData.Series s1 = chartData1.getSeries().get(0);XDDFDataSource cat1 = XDDFDataSourcesFactory.fromStringCellRange(sheet1,new CellRangeAddress(1, 6, 0, 0));XDDFNumericalDataSource val1 = XDDFDataSourcesFactory.fromNumericCellRange(sheet1,new CellRangeAddress(1,6,1,1));s1.replaceData(cat1,val1);chart1.setTitleText("图2 各科分数");chart1.plot(chartData1);//修改第三个图XWPFChart chart2 = charts.get(2);XSSFWorkbook workbook2 = chart2.getWorkbook();XSSFSheet sheet2 = workbook2.getSheetAt(0);sheet2.getRow(1).getCell(0).setCellValue("数学");sheet2.getRow(1).getCell(1).setCellValue(80);XSSFCell cell220 = sheet2.getRow(2).createCell(0);cell220.setCellValue("英语");XSSFCell cell221 = sheet2.getRow(2).createCell(1);cell221.setCellValue(38);XDDFChartData chartData2 = chart2.getChartSeries().get(0);XDDFChartData.Series s2 = chartData2.getSeries().get(0);XDDFDataSource cat2 = XDDFDataSourcesFactory.fromStringCellRange(sheet2,new CellRangeAddress(1, 3, 0, 0));XDDFNumericalDataSource val2 = XDDFDataSourcesFactory.fromNumericCellRange(sheet2,new CellRangeAddress(1,3,1,1));s2.replaceData(cat2,val2);chart2.setTitleText("图3 各科占比");chart2.plot(chartData2);
最终结果:
周末更新,修改表格数据,和文本替换。
参考:使用POI导出Word(含表格)的实现方式及操作Word的工具类 - 黄小葱 - 博客园使用POI导出Word(含表格)的实现方式及操作Word的工具类https://www.cnblogs.com/sun-flower1314/p/10128796.htmljava使用poi在word中生成柱状图、折线图、饼图、柱状图+折线图组合图、动态表格、文本替换、图片替换、更新内置Excel数据、更新插入的文本框内容、合并表格单元格;_u014427811的博客-CSDN博客_java word 图表本文参考地址:https://blog.csdn.net/wangxiaoyingWXY/article/details/95377533在参考文章的基础上,增加了扩展。感谢被参考的老哥。代码直接从日记中复制过来的,不方便复制的可以私信发示例代码,不知道怎么上传附件了。代码有的地方写的不合理或者错误的,请原谅没有检查仔细;说明:在poi3.x的版本中,没有对图表的支持,至少目前为止没...https://blog.csdn.net/u014427811/article/details/100771314
poi编辑word中的chart,对图表数据替换,并刷新图表相关推荐
- java使用poi在word中生成柱状图、折线图、饼图、柱状图+折线图组合图、动态表格、文本替换、图片替换、更新内置Excel数据、更新插入的文本框内容、合并表格单元格;
本文参考地址:https://blog.csdn.net/wangxiaoyingWXY/article/details/95377533 在参考文章的基础上,增加了扩展.感谢被参考的妹子.另外该博客 ...
- java使用poi读写word中的图片(二)
文章目录 准备工作 简单读取 复杂读取 查看Word的XML 特别说明:Word中的Svg图片 第一种写入图片到Word中的方式 第二种写入图片到Word中的方式 最后 准备工作 这里就不在复述了,可 ...
- java POI对word中的表格动态插入固定数据,以及插入不确定数量的的数据
java POI对word中的表格动态插入固定数据,以及插入不具体的数据 遇到个项目本来是用Execl导出的,相对简单,客户要求用Word导出,并按照他们给的模板进行导出: 从网上百度了一下,然后自己 ...
- 【Apache Poi】如何使用poi在word中生成复选框
如何使用poi在word中生成复选框 应用场景 解决方式 代码示例 结语 应用场景 我们经常会在开发中遇到需要通过Poi来生成类似下面这样的复选框 解决方式 我们可以通过unicode编码:\u25A ...
- java使用poi在word中生成柱状图、折线图、饼图、柱状图+折线图组合图、动态表格、文本替换、图片替换 springboot项目
本文参考地址:https://blog.csdn.net/u014427811/article/details/100771314 在参考文章的基础上,增加了模板样例 模板样例地址 百度网盘 链接:h ...
- java利用POI在word中绘制折线图
1.poi的简介 Apache POI 简介是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office(Excel.WORD ...
- java poi读取word中附件_java用poi实现对word读取和修改操作
java编程要实现对word的操作没有vb那种编程语言来得容易,得借助一些开源组件,其中就包括jacob.poi等, 而poi应用得最为广泛,对word2003和2007的读和写word操作都十分方便 ...
- POI导出word中cell单元格内换行问题
利用POI导出word时,换行符"\r\n"无法被正常识别,利用以下方式进行了word中cell单元格内的换行问题. 首先在需要换行字符串的对应位置处插入相应标记符,然后在设置wo ...
- java poi读取word中附件_Java POI导入word, 带图片
1.导入文件示例,word中简历表格模板 2.代码示例分两部分,一部分读取图片 /** * 导入word(基本信息,word格式) * @param staffId * @param baseInfo ...
最新文章
- JTable表头排序后,row获取错乱的问题解决
- STM32 电机教程 29 - 无刷无感入门1
- 2008春节长白山哈尔滨雪乡游
- matplotlib包画基本的图
- Hibernate中使用Criteria查询及注解——(hibernate.cfg.xml)
- 简而不漏,300字Java标识符命名规则规范,看一遍就可以记住,包名类名变量名常量名,让命名有迹可循
- php 随机颜色,php生成随机颜色的代码实例
- juyter显示决策树图形_关于决策树可视化的treePlotter(学习笔记)
- 远程办公的破冰行动!
- 大数据时代的语音识别,方言也不怕?
- 如何将python数据输入到excel中_如何使用python将大量数据导出到Excel中的小技巧之一...
- mysql limit报错_mysql limit 附近老是报错,求帮助!
- 基于51单片机220V交流电流检测系统过流阈值报警方案原理图
- 好用又好玩的微信小程序大全
- ftps软件android,透视相机软件ftp
- 问道法宝升级经验统计
- div实现页面划分为左,中,右三栏
- eclipse Helio项目简介
- 其他的一些生活小常识
- 【ES知识】ES基础查询语法一览