springboot项目中需要生成PPT,网上生成PPT的代码要么需要付费要么功能不够强大,于是我决定使用原生的POI来生成PPT,虽然不是很难,但是对于第一次使用的人查询文档难免有些麻烦,于是将我使用过程中的经验和解决问题的过程拿出来和大家分享,以下是关于我使用PPT的过程。
由于需要导出的PPT过于复杂,所以选择了先设计模板,再根据模板导入数据的方案
代码如下(示例):
该幻灯片中包含了文本框,图表,组合图(组合图里包含折线图和柱状图),甜甜圈即空心饼图,项目符号列表
想要获取指定的对象可以通过标识来,例如,如果有多个表格可以通过获取表格第一行第一列数据判断是不是拿到了对应的表格,如果一个元素只有一个,那就不需要考虑了
ppt的本质是XML 通过解析并组装XML来完成构建ppt,chart的图表会解析为XSLFTable chart数据包含在table对象里面,如果ppt的元素是包含关系,就需要在解析完的对象下面接着找,所以建议元素不要过多的堆叠,否则找起来很麻烦,最好只放在第一级
2.1 解析文本框
XSLFTextShape对象中有一个setText的方法,但是不建议使用,因为如果使用这个方法会导致模板里的样式发生变化,需要重新调整样式,如果用下面的方法去执行 则可以保留样式,至于为什么要处理多个TextRuns,由于ppt某些扯淡的解析 会导致{{test}} 解析到多个TextRun里,所以我们只替换第一个,其它的设置为空字符串
2.2 解析PPT自带的表格
ppt的表格如下图所示,做过ppt的都知道 它和Excel的表格不同,所以单独拿出来解析
获取到table以后 这个table的处理就比较简单了,这些方法都比较通俗易懂,这里就不多赘述了
2.3 解析Chart
接下来是重头戏,解析chart
2.3.1 解析折线图和柱状图
由以上注释可知XSLFGraphicFrame里包含了ppt表格,柱状图,折线图等对象,所以取折线图和柱状图都是从这个对象里取,由于ppt坑爹的特性,在处理完ppt关联的excel表格后不会刷新图表,所以我们需要分两步进行,一个是处理图表,一个是处理图表关联的Excel,这个地方有很多坑,我一一来说
由于我的图表是组合图 里面包含了折线图和饼图,所以代码放在了一起
先放一串代码
序列即下图的test1 test2
从代码和图片可知图的数据都存放在CTPlotArea对象中,可以通过判断有没有值来确定图表是否存在,通过不同的图来获取图表的对象,通过getCat方法可以获取序列,getVal方法获取数据
然后开始处理数据:
我们一般会把序列设置为字符串 但是根据代码可知,它是可以设置数字型序列的,这个时候要注意 设置ppt模板的时候一定要将序列那一列设置为字符串,或者默认个初始值,要不然序列默认会解析为数字。。坑爹的ppt
获取到Cat和Val之后设置数据
如果不用模板来做的话,以上的代码还需要关联对应的excel表格如果缺少了某个参数,比如count或者idx 就会导致生成报错,走过的坑。。
在设置完图表之后,还需要处理图表对应的Excel表格,因为修改了图表的数据不会同步到表格里,修改表格的数据也不会同步到图表中,坑爹的逻辑。。
处理表格就比较简单了(如果你经常使用excel的表格的话)
没想到吧,它和我们的老朋友Exel的处理一模一样这里就不多说了
最后,我写了一个两个工具类 用于获取ppt和Excel的对象,因为直接获取一不小心就会空指针 ,按需拿吧,
以上就是生成ppt的方法 强烈建议用模板去生成,会好处理很多,虽然也很麻烦,处理过程如果出现问题,可以通过debug看对应的对象,特别是看xml ,看多了就明白它的结构了
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/5535.html