poi编辑word中的chart,对图表数据替换,并刷新图表 |
您所在的位置:网站首页 › js操作word图表 › poi编辑word中的chart,对图表数据替换,并刷新图表 |
最近工作需要做报表导出,再次接触poi,上次用poi的时候还是上次(在前司编辑excel的时候)。 而word呢,数据结构上感觉又比excel复杂,至少我处理的时候认为是这样。 首先看一下要处理的word模板: 引入依赖: org.apache.poi poi 5.2.0 org.apache.poi poi-ooxml 5.2.0我们首先将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 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的工具类 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |