一点前置

POI PPT常用组件

在POI中,我们经常使用的几个对象如下:

  • SlideShow 对应整个PPT文件
  • Slide 对应一页PPT
  • Shape 这个可以实现就比较多了。文本域、图片、表格、都归属于这一类。
  • PictureShape 图片对象 没啥说的
  • XSLFTable 表格 也没啥好说的
  • TextShape 文本域对象
  • TextParagraph 当Shape的实现类是TextShape是,我们就可以获取到段落啦。
  • TextRun 这个是最基础的东西了。具体的文字和样式都是由它控制的。

可能存在的坑

  1. 虽然TextShape存在setText方法,但是调用的话会导致之前设置的样式全部失败。
  2. 你认为属于一个TextRun的文本,它还真不一定在同一个里面,尤其里面有特殊符号。
  3. 目前对于图片的替换还不能控制比例。
  4. 对于PPT合并,不要通过创建新PPT导入来实现。如果需要合并的PPT中大小有宽屏的,很有可能会变形。

具体操作

首先是依赖

     <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.1</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.poi/poi-scratchpad --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>4.1.1</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.1</version></dependency>

替换字符串

个人这边做了一点封装。可以采用${xxx}的占位符方式来进行替换。
示例:

Map<String, String> textMap = new HashMap<>();
textMap.put("${xxx}", "文本域");
PoiUtils.replaceText(tmpFileName, textMap);

具体代码:

    /*** 进行文本替换** @param path* @param textMap* @throws IOException*/public static void replaceText(String path, Map<String, String> textMap) throws IOException {FileInputStream fileInput = new FileInputStream(path);XMLSlideShow ppt = new XMLSlideShow(fileInput);for (Slide slide : ppt.getSlides()) {List<Shape> shapes = slide.getShapes();for (Shape shape : shapes) {//文本if (shape instanceof TextShape) {List<TextParagraph> list = ((TextShape) shape).getTextParagraphs();replaceData(list, textMap);}}}FileOutputStream out = new FileOutputStream(path);ppt.write(out);out.close();ppt.close();}/*** 替换文本** @param list* @param textMap*/private static void replaceData(List<TextParagraph> list, Map<String, String> textMap) {if (list == null || list.size() <= 0){return;}StringBuffer target = new StringBuffer();TextRun targetRun = null;for (TextParagraph textParagraph : list) {if (textParagraph == null) {continue;}List<TextRun> textRuns = textParagraph.getTextRuns();if (textRuns == null || textRuns.size() <= 0 || textRuns.isEmpty()) {continue;}for (int i = 0; i < textRuns.size(); i++) {TextRun textRun = textRuns.get(i);if (textRun == null) {continue;}String text = textRun.getRawText();if (StringUtils.isBlank(text)) {continue;}//检测开始标记if (text.contains("${")) {targetRun = textRun;}else if ("}".equals(text)) {if(null == targetRun){continue;}String finalText = target.append("}").toString();for(String key : textMap.keySet()){if(finalText.contains(key)){finalText = finalText.replace(key,textMap.get(key));}}target.delete(0,target.length());targetRun.setText(finalText);targetRun =null;textRun.setText("");}if(null != targetRun){target.append(textRun.getRawText().trim());textRun.setText("");}}}}

替换图片

目前还无法改变图片大小,那位大佬知道的话还请不吝赐教。

    /*** 替换图片信息* * @param ppt* @param pictureData* @param index*/public static void feedImageData(XMLSlideShow ppt, byte[] pictureData,int index) throws IOException {int num = 0;for (XSLFSlide slide : ppt.getSlides()) {// 获取每一张幻灯片中的shapefor (XSLFShape shape : slide.getShapes()) {if (shape instanceof PictureShape) {if(num == index){XSLFPictureShape pictureShape = (XSLFPictureShape) shape;pictureShape.getPictureData().setData(pictureData);break;}num++;}}}}

进行表格数据填充

个人建议目标表格最少两行。表头这个就不说了。PPT创建新行的话会默认使用上一行的样式。所以如果你的数据行和表头行不一致的话,请保证起码存在一行空的数据行。

    /*** 进行表格填充 仅处理获取到的第一个表格** @param path* @param data*/public static void dealTable(String path, List<List<String>> data) throws IOException {FileInputStream fileInput = new FileInputStream(path);XMLSlideShow ppt = new XMLSlideShow(fileInput);for (XSLFSlide slide : ppt.getSlides()) {// 获取每一张幻灯片中的shapefor (XSLFShape shape : slide.getShapes()) {if (shape instanceof XSLFTable) {XSLFTable table = (XSLFTable) shape;for (int i = 0; i < data.size() - 1; i++) {XSLFTableRow row = table.getRows().get(i + 1);if(null == row){row = table.addRow();}List<String> cellsData = data.get(i);for (int j = 0; j < cellsData.size(); j++) {String dataStr = cellsData.get(j);XSLFTableCell cell = row.getCells().get(j);if (null == cell) {cell = row.addCell();}cell.setHorizontalCentered(true);cell.setVerticalAlignment(VerticalAlignment.MIDDLE);XSLFTextParagraph paragraph = cell.getTextParagraphs().get(0);if (null == paragraph) {paragraph = cell.addNewTextParagraph();}XSLFTextRun run = paragraph.addNewTextRun();run.setText(dataStr);run.setFontFamily("微软雅黑");run.setFontSize(9D);}}break;}}}FileOutputStream out = new FileOutputStream(path);ppt.write(out);out.close();ppt.close();}

合并PPT

注意:如果你的PPT存在大小不一样的情况,那么拼接完会出现变形,切记!

 /*** 合并ppt** @param file1* @param file2* @throws IOException*/public static void merge(String file1, String file2) throws IOException {Assert.hasLength(file1);Assert.hasLength(file2);FileInputStream is = new FileInputStream(file1);XMLSlideShow src = new XMLSlideShow(is);FileInputStream is2 = new FileInputStream(file2);XMLSlideShow src2 = new XMLSlideShow(is2);is2.close();for (XSLFSlide slide : src2.getSlides()) {XSLFSlide slide1 = src.createSlide();slide1.importContent(slide);}FileOutputStream out = new FileOutputStream(file1);src.write(out);out.close();is.close();}

Apache POI操作PPT: 文字替换 图片替换 表格填充 PPT合并相关推荐

  1. java操作word文档(文字,图片,表格添加以及替换操作)

    注:本文由于个人工作需要,有对多个他人博文进行借鉴,但是多数博文都只是讲到了小部分,例如图片/表格的操作,都只有根据书签进行替换,比较片面,本人有总结到根据文字进行图片/表格的替换,希望可以帮到更多有 ...

  2. 关于用隐藏文字(图片替换文字)的更好的可用性方法

    有些文字或者效果很难用文字表示出来时我一般都是用图片或者css3来实现,关于css隐藏文字的方法很多,以前一般都用text-indent隐藏文字实现图片替换文字的方法,因为这种方法不影响机器或者搜索引 ...

  3. 利用Spire实现对Word模板的指定文字替换(文字、图片、表格)

    1.安装Spire.Office word文件内对要替换的地方用   [=xxx] 做标记 2.WordUtil.cs using Spire.DataExport.XLS; using Spire. ...

  4. java word apache poi 操作word模板。

    apache poi 操作word模板. 操作方式: 1.对于固定格,可以遍历格子然后替换其中指定的值例如在要替换的cell写入${example} 这样格式,遍历到之后替换. 2.对于需要增长的表格 ...

  5. Apache POI操作Excel导出JAVABEAN对象方法

    2019独角兽企业重金招聘Python工程师标准>>> Apache POI操作Excel导出方法说明 Apache的POI组件是Java操作Microsoft Office办公套件 ...

  6. Apache POI操作Excel的坑

    本文记录一下用Apache POI操作Excel时可能遇到一些坑. excel版本错误 首先是excel版本问题,由于office excel 03版和07版的区别,在读取文件时如果版本不匹配会报以下 ...

  7. C++操作word:插入文字、图片、表格,设置样式字体

    想要控制word文档,向word写入文字,图片,表格等并控制其格式,可以引入第三方库,#include "msword.h",网上的资料很多,在此不再赘述.下面封装好的代码,,很简 ...

  8. PPT使用技巧 二 调整PPT文字和图片的层级关系

    调整PPT文字和图片的层级关系 选择图片或者文字等,右键"置于顶层"等可以调整层级关系

  9. word表格图片自动适应表格大小_几招教你快速解决word文字、图片、表格排版问题,你肯定遇到过...

    在word日常办公中,很多小伙伴是不是总会遇到文字.图片及表格排版的某些问题呢?今天我们来分享一些在办公中经常会遇到几个常见问题的解决方法. 1.写文档的时候出现"吃字"现象. 在 ...

  10. poi操作word文档(替换,插入图片)

    前段时间项目上要用到一个替换word中的字符以及插入图片并导出的功能,google了一番发现别人的代码跑起来多多少少有些问题,所以就自己照着poi的api写了一个工具类,在此记录下来,如果有需要的朋友 ...

最新文章

  1. 【NLP】Google T5速读
  2. 分布式 ID的 9 种生成方式
  3. 这个统一了238个机器学习模型R包的参考手册推荐给你
  4. Typecho浅色三栏主题
  5. 2019牛客多校第三场F Planting Trees(单调队列)题解
  6. jsonp 获取图片文件流_【国际IT专场】Laravel Media Library多媒体文件的上传与管理...
  7. Visio绘制网络拓扑图
  8. USB 重定向库usbredir的移植到Android下使用的方法总结
  9. 高德地图通过经纬度获取位置信息
  10. 使用网络协议分析仪Wireshark
  11. 安服工程师的岗位职责
  12. (干货)备战2021年软考中级网络工程师-03-计算机系统开发基础
  13. c++面试常见问题2019-10-03
  14. word转换为图片格式的几种方式
  15. 工作中常用工具推荐及资源分享
  16. 忽尔今夏,SpringSide 3.0
  17. 直播平台搭建iOS 版本打包上架
  18. 《如果……》拉迪亚德·吉卜林
  19. GridView 自动排序
  20. android allow usb debugging,远程调试Android设备 - Chrome 开发者工具中文文档

热门文章

  1. 『论文笔记』目标追踪结合相关滤波器资料收集+机器学习基础知识补充!
  2. python flask web_Python Web开发之Flask
  3. 最伟大的IT人物10强(转)
  4. 3Dmax导出插件制作
  5. html表格内数据填充颜色,点击数据,自动为整行表格填充颜色,再也不用担心看错数据了...
  6. 镜像文件iso有什么用
  7. Flume+Kafka+Storm+Redis流计算实现wordcount示例
  8. 机器学习笔记之概率图模型(八)信念传播(Belief Propagation,BP)(基于树结构)
  9. 周杰伦何以成青少年偶像
  10. 手机新建相册之后把照片文件放哪