最近工作需要做报表导出,再次接触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,对图表数据替换,并刷新图表相关推荐

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

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

  2. java使用poi读写word中的图片(二)

    文章目录 准备工作 简单读取 复杂读取 查看Word的XML 特别说明:Word中的Svg图片 第一种写入图片到Word中的方式 第二种写入图片到Word中的方式 最后 准备工作 这里就不在复述了,可 ...

  3. java POI对word中的表格动态插入固定数据,以及插入不确定数量的的数据

    java POI对word中的表格动态插入固定数据,以及插入不具体的数据 遇到个项目本来是用Execl导出的,相对简单,客户要求用Word导出,并按照他们给的模板进行导出: 从网上百度了一下,然后自己 ...

  4. 【Apache Poi】如何使用poi在word中生成复选框

    如何使用poi在word中生成复选框 应用场景 解决方式 代码示例 结语 应用场景 我们经常会在开发中遇到需要通过Poi来生成类似下面这样的复选框 解决方式 我们可以通过unicode编码:\u25A ...

  5. java使用poi在word中生成柱状图、折线图、饼图、柱状图+折线图组合图、动态表格、文本替换、图片替换 springboot项目

    本文参考地址:https://blog.csdn.net/u014427811/article/details/100771314 在参考文章的基础上,增加了模板样例 模板样例地址 百度网盘 链接:h ...

  6. java利用POI在word中绘制折线图

    1.poi的简介 Apache POI 简介是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office(Excel.WORD ...

  7. java poi读取word中附件_java用poi实现对word读取和修改操作

    java编程要实现对word的操作没有vb那种编程语言来得容易,得借助一些开源组件,其中就包括jacob.poi等, 而poi应用得最为广泛,对word2003和2007的读和写word操作都十分方便 ...

  8. POI导出word中cell单元格内换行问题

    利用POI导出word时,换行符"\r\n"无法被正常识别,利用以下方式进行了word中cell单元格内的换行问题. 首先在需要换行字符串的对应位置处插入相应标记符,然后在设置wo ...

  9. java poi读取word中附件_Java POI导入word, 带图片

    1.导入文件示例,word中简历表格模板 2.代码示例分两部分,一部分读取图片 /** * 导入word(基本信息,word格式) * @param staffId * @param baseInfo ...

最新文章

  1. JTable表头排序后,row获取错乱的问题解决
  2. STM32 电机教程 29 - 无刷无感入门1
  3. 2008春节长白山哈尔滨雪乡游
  4. matplotlib包画基本的图
  5. Hibernate中使用Criteria查询及注解——(hibernate.cfg.xml)
  6. 简而不漏,300字Java标识符命名规则规范,看一遍就可以记住,包名类名变量名常量名,让命名有迹可循
  7. php 随机颜色,php生成随机颜色的代码实例
  8. juyter显示决策树图形_关于决策树可视化的treePlotter(学习笔记)
  9. 远程办公的破冰行动!
  10. 大数据时代的语音识别,方言也不怕?
  11. 如何将python数据输入到excel中_如何使用python将大量数据导出到Excel中的小技巧之一...
  12. mysql limit报错_mysql limit 附近老是报错,求帮助!
  13. 基于51单片机220V交流电流检测系统过流阈值报警方案原理图
  14. 好用又好玩的微信小程序大全
  15. ftps软件android,透视相机软件ftp
  16. 问道法宝升级经验统计
  17. div实现页面划分为左,中,右三栏
  18. eclipse Helio项目简介
  19. 其他的一些生活小常识
  20. 【ES知识】ES基础查询语法一览

热门文章

  1. Linux文件查找的4个命令
  2. 如何在论文中表格和图片变成引用格式,实现ctrl访问
  3. Android开发自学教程,安卓面试题及答案2022
  4. 初始化git仓库(已存在项目)
  5. 使用iCheck插件,如何创建chenge事件
  6. ROS2 第一个C++程序(talker和listener为例)
  7. LaTex: 多种方法实现图片复杂排列
  8. java程序员培训学习需要多长时间
  9. java+OpenCV3 +百度OCR(或tesseract) 识别表格数据
  10. 原生Js导出Excel文件