一点前置
POI PPT常用组件
在POI中,我们经常使用的几个对象如下:
SlideShow 对应整个PPT文件Slide 对应一页PPTShape 这个可以实现就比较多了。文本域、图片、表格、都归属于这一类。PictureShape 图片对象 没啥说的XSLFTable 表格 也没啥好说的TextShape 文本域对象TextParagraph 当Shape的实现类是TextShape是,我们就可以获取到段落啦。TextRun 这个是最基础的东西了。具体的文字和样式都是由它控制的。
可能存在的坑
虽然TextShape存在setText方法,但是调用的话会导致之前设置的样式全部失败。你认为属于一个TextRun的文本,它还真不一定在同一个里面,尤其里面有特殊符号。目前对于图片的替换还不能控制比例。对于PPT合并,不要通过创建新PPT导入来实现。如果需要合并的PPT中大小有宽屏的,很有可能会变形。
具体操作
首先是依赖
org.apache.poi
poi
4.1.1
org.apache.poi
poi-scratchpad
4.1.1
org.apache.poi
poi-ooxml
4.1.1
替换字符串
个人这边做了一点封装。可以采用${xxx}的占位符方式来进行替换。 示例:
Map textMap = new HashMap();
textMap.put("${xxx}", "文本域");
PoiUtils.replaceText(tmpFileName, textMap);
具体代码:
/**
* 进行文本替换
*
* @param path
* @param textMap
* @throws IOException
*/
public static void replaceText(String path, Map textMap) throws IOException {
FileInputStream fileInput = new FileInputStream(path);
XMLSlideShow ppt = new XMLSlideShow(fileInput);
for (Slide slide : ppt.getSlides()) {
List shapes = slide.getShapes();
for (Shape shape : shapes) {
//文本
if (shape instanceof TextShape) {
List 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 list, Map textMap) {
if (list == null || list.size() |