专业财税服务推荐

精选优质财税服务,为企业提供专业、可靠的财税解决方案,助力企业健康发展

零报税代理记账
零申报代理记账
报税做账算帐财务报表老会计做账
代理记账
咨询微信:lhy_happyday
工商营业执照年度年报年检公示
全国个体、企业、公司、合作社工商年审年报服务!
个体/10元/次 企业/20元/次
咨询微信:lhy_happyday
财税咨询服务
一对一专业财税咨询,解决企业财税难题,提供定制方案
咨询微信:lhy_happyday
财务分析服务
小规模个体报税0申报税务年报工商年报月报季报报税代理记账
咨询微信:lhy_happyday
立即咨询专业财税顾问
微信号: lhy_happyday
会计从业9年,管理多家个体工商、小规模、一般纳税人等企业的财务、税务等相关工作!。
扫码或搜索添加微信,备注"财税咨询"获取专属优惠
知方号 知方号

POI操作PowerPoint自动生成报表 报表生成ppt

POI操作PowerPoint自动生成报表

1、需求

接到一个很蛋疼的需求:每天自动查询前一天的运营数据,生成power point图表,发送给相关领导。

ppt有固定模板,只需要变更每张报表的数据源即可。

2、初步思路

操作office组件,第一个能想到的肯定是POI。

但实际上POI对于power point的操作封装的还是很差的,毕竟没谁闲的蛋疼用代码来操作ppt。

POI操作power point更像是在操作XML的每个节点,逐个取值、写入(pptx文件格式本身就是xml)。

POI的maven依赖如下:

org.apache.poi poi 5.0.0 org.apache.poi poi-ooxml 5.0.0

注意要用5.0版本,网上大多数资料里提到的3.17版本,无法读取到图表关联的数据源。

3、Java实现3-1、获取图表对象 // 读PPT模板 File fileIn = new File(PPT_TEMPLATE); FileInputStream fin = new FileInputStream(fileIn); XMLSlideShow ppt = new XMLSlideShow(fin); fin.close(); // 幻灯片对象 XSLFSlide slide = ppt.getSlides().get(0); // ============================================== // 处理下部图表(下idx=4) XSLFChart chart = slide.getRelationParts().get(4).getDocumentPart(); CTPlotArea plot = chart.getCTChart().getPlotArea(); CTBarChart barChart = plot.getBarChartArray(0);

至于为什么是slide.getRelationParts().get(4)?呵呵,我特么也不知道我要操作的这个图表的index是几!

方法是debug一下,看slide.getRelationParts()对象的内容,看它下面每一个item的documentPart的Name,是不是“/ppt/charts/chartn.xml”,这对应的是图表。

至于plot、barChart都是啥对象,鬼才知道,反正xml里面节点就是这样的,就一层一层往下找吧,后面要用到。

3-2、更新图表关联的Excel数据源

要修改power point中报表的内容,本质上是修改跟报表绑定的Excel表的数据。

// 更新图表关联的Excel数据源 XSSFWorkbook workbook = chart.getWorkbook(); // "sheet1" XSSFSheet sheet = workbook.getSheetAt(0); for (int i = 0; i < 10; i++) { sheet.getRow(i + 2).getCell(0).setCellValue(mapChartTitle.get(i)); sheet.getRow(i + 2).getCell(1).setCellValue(mapChartData.get(i)); } workbook.write(chart.getPackagePart().getOutputStream());3-3、更新ppt缓存

power point这玩意,最x蛋的就是只变更数据源没用,它自己有缓存!幻灯片上展示的数据从缓存来读,如果只改变Excel数据源中的数据,必须点“编辑数据”以后才能触发页面刷新。

// 更新chart缓存数据 CTBarSer ser = barChart.getSerList().get(0); // 变更坐标轴标题 for (int i = 0; i < 10; i++) { CTStrVal cat = ser.getCat().getStrRef().getStrCache().getPtArray(i); cat.setIdx(i); cat.setV(mapChartBTitle.get(i)); } // 变更数据 for (int i = 0; i < 10; i++) { CTNumVal val = ser.getVal().getNumRef().getNumCache().getPtArray(i); val.setIdx(i); val.setV(mapChartBData.get(i).toString()); }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。