java使用poi操作ppt(导入,导出,读取,添加,拼接,替换文本,页面排序)

POI操作PPT文档(导入,导出,读取,添加,拼接,替换文本,页面排序)

注意:直接读取.pptx文件时不能使用${user}这样的作为替换标识,在读取.pptx文件时会解析成三段文本"${","user"和“}”。此文档方法一操作.pptx文件,使用{user}作为替换标识;方法二操作ppt的.xml文件,使用${user}作为替换标识。此文档使用poi-3.17,使用其他版本方法会有差异。

需要访问网址http://poi.apache.org/download.html,载Apache POI软件包。这里下载:poi-bin-3.17-20170915.tar.gz解压并全部导入 。


方法一:将三个ppt拼接成一个并重新排序,更改其中的文本内容,不会保留其原来的样式,需要在代码里设置。

public static void main(String[] args) throws IOException {
Calendar cale = Calendar.getInstance();  
        int year = cale.get(Calendar.YEAR);  
        int month = cale.get(Calendar.MONTH);//月份从0开始 
        
        //导入待拼接的.pptx文件
InputStream coveris = new FileInputStream(new File("C:\\Users\\12456\\Desktop\\cover.pptx"));
InputStream datais = new FileInputStream(new File("C:\\Users\\12456\\Desktop\\201807.pptx"));

XMLSlideShow coverppt = new XMLSlideShow(coveris);//待拼接PPT1
XMLSlideShow datappt = new XMLSlideShow(datais);//待拼接PPT2
XMLSlideShow headppt = getPPT();   //此方法返回待拼接PPT3

//将PPT3依次插入到PPT2的末尾,createSlide()是在末尾创建
for (XSLFSlide srcSlide : headppt.getSlides()) {
datappt.createSlide().importContent(srcSlide);
        }
//下面代码 是将当前月份的数值所对应ppt中的第几张 插入到PPT2的末尾
List<XSLFSlide> coverlist=coverppt.getSlides();
for (int i = 0; i < coverlist.size(); i++) {
if (i==month) {
datappt.createSlide().importContent(coverlist.get(i));
}
}
//此时PPT1,PPT3都已插入到PPT2中,现在进行重新排序,  setSlideOrder(第几张PPT(slide), 要去的位置(int));
datappt.setSlideOrder(datappt.getSlides().get(7), 0);
datappt.setSlideOrder(datappt.getSlides().get(5), 1);
datappt.setSlideOrder(datappt.getSlides().get(6), 2);

//以下为导出PPT的操作
String filePath = "C:\\Users\\12456\\Desktop\\pptresult";
filePath = filePath.replace("\\", "\\\\");

File dir = new File(filePath);
if(!dir.exists()){
dir.mkdirs();
}
String path = dir.getPath();
path = path.replace("\\", "\\\\");

FileOutputStream out = new FileOutputStream(path+"\\天气会商制作.pptx");
datappt.write(out);
out.close();
}

public static XMLSlideShow getPPT() throws IOException {
//导入要修改的PPT
InputStream is = new FileInputStream(new File("C:\\Users\\12456\\Desktop\\服务简报内容\\模板.pptx"));
XMLSlideShow ppt = new XMLSlideShow(is);
List<XSLFSlide> Slides = ppt.getSlides();
for (XSLFSlide slide : Slides) {
List<XSLFShape> shapes = slide.getShapes();
for (XSLFShape shape : shapes) {
if (shape != null) {
if (shape instanceof AutoShape) {
try {
if (((AutoShape) shape).getText().contains("{ye}")) {
// 替换文字内容.用TextRun获取替换的文本来设置样式

TextRun rt=((AutoShape) shape).setText(((AutoShape) shape).getText().replace("{ye}", "2018"));

rt.setFontColor(Color.red);
rt.setFontSize(13.5);
rt.setFontFamily("微软雅黑");

} else if (((AutoShape) shape).getText().contains("{mo}")) {
((AutoShape) shape).setText(((AutoShape) shape).getText().replace("{mo}", "7"));
}
// System.out.println(((AutoShape)shape).getText());
} catch (Exception ex) {


ex.printStackTrace();
}
// }else {
// System.out.println("Process me: " +
// shape.getClass());
}
}
}
}
return ppt;

}



方法二:操作ppt的.xml文件,.xml文件中使用${user}作为替换标识,保留原来的样式

public static void main(String[] args) throws IOException {
Map<String, String> datamap=new HashMap<String,String>();
datamap.put("year", "2018-7");
datamap.put("company", "**有限公司");
datamap.put("plan", "123");
datamap.put("actr", "456");
datamap.put("bias", "78");
datamap.put("cha", "123");
datamap.put("jing", "456");
datamap.put("bao", "789");
datamap.put("month", "4");
datamap.put("pric", "789");
datamap.put("one", " 123456789");
datamap.put("two", " 876555378");

//设置模板格式和路径
Configuration configuration =new Configuration();
configuration.setDefaultEncoding("utf-8");
configuration.setDirectoryForTemplateLoading(new File("D:\\JavaWorkSource"));
//读取模板路径下的PPT的.xml模板文件
Template template=configuration.getTemplate("ppttemp.xml","utf-8");
//设置导出路径
File outfile=new File("C:\\Users\\12456\\Desktop\\result.xml");
Writer out=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outfile)), 10240);

try {
//将数据替换并导出PPT
template.process(datamap, out);
} catch (TemplateException e) {
e.printStackTrace();
}finally {
out.close();
}
}

猜你喜欢

转载自blog.csdn.net/csdnfeiguo/article/details/80944793