最近由于工作中需要使用poi生成对应的pptx文件,就对照api文档进行研究了一下,api文档也是英文版的,很多东西感觉描述的不是那么清晰,比较耗费精力。在此分享一下生成方法以及一点问题的解决。其实在生成pptx文件的时候可以直接生成pptx文件,也可以设置模版,继承模版的一些设置,图片以及表格等信息进行文档生成,比较快捷,本次主要介绍在模版基础上生成文件的方式。
poi
poi
3.11
poi
geronimo-stax-api_1.0_spec
3.7.0
poi
poi-examples
3.11
poi
poi-ooxml
3.11
poi
poi-ooxml-schemas
3.11
poi
poi-scratchpad
3.11
poi
xmlbeans
2.6.0
本次引入的poi包为3.11版本
String path = request.getSession().getServletContext().getRealPath("/");
//创建一个ppt文件
String filmDress1=propertiesBean.getFilePath()+"temp//ppp.pptx";
File file=new File(filmDress1);
if(!file.exists()) {
file.createNewFile();
}
String filmDress=path+"//xxx.pptx";
FileInputStream inputstream =new FileInputStream(new File(filmDress));
XMLSlideShow ppt = new XMLSlideShow(inputstream);
XMLSlideShow tmpppt = new XMLSlideShow();
XMLSlideShow endppt = new XMLSlideShow();
XSLFSlide[] arr = ppt.getSlides();
//第一张幻灯片
{
tmpppt.createSlide().importContent(arr[0]);
XSLFSlide[] arr1 =tmpppt.getSlides();
XSLFShape[] runs=arr1[0].getShapes();
XSLFTextBox txtbox = (XSLFTextBox) runs[2];
List paragraph = txtbox.getTextParagraphs();
if(paragraph!=null && paragraph.size()>0){
XSLFTextRun run = paragraph.get(0).addNewTextRun();
run.setText("XXXXX");
run.setFontColor(java.awt.Color.black);
run.setFontFamily("经典综艺体简");
run.setFontSize(66);
run.setBold(true);
}
endppt.createSlide().importContent(tmpppt.getSlides()[0]);
tmpppt.removeSlide(0);
}
如此就会文件就会创建一个一个幻灯片的文件,幻灯片中的字体,内容已经字体代谢奥,颜色都可以进行设置
生成表格:
{
tmpppt.createSlide().importContent(arr[1]);
//查询生产周报信息
//table的表头
//通过pid查询当前周所跨越的时间
XSLFSlide[] arr2 =tmpppt.getSlides();
XSLFShape[] runs2=arr2[0].getShapes();
XSLFTable table = (XSLFTable) runs2[2];
List rows = table.getRows();
{
String biaotou ="表头";
XSLFTextBox txtbox = (XSLFTextBox) runs2[4];
List paragraph2 = txtbox.getTextParagraphs();
if(paragraph2!=null && paragraph2.size()>0){
paragraph2.get(0).setTextAlign(TextAlign.CENTER);
XSLFTextRun run = paragraph2.get(0).addNewTextRun();
run.setText(biaotou);
run.setFontColor(java.awt.Color.black);
run.setFontFamily("宋体");
run.setFontSize(28);
run.setBold(true);
}
}
int i=0;
List list = 数据list;
if(list!=null && list.size()>0){
for(Object tmplist:list){
//if(i!=0){
table.addRow();
rows = table.getRows();
for(int k=0;k<8;k++){
rows.get(2+i).addCell();
}
//}
Object[] tmpobj = (Object[]) tmplist;
Object[] obj = new Object[8];
obj[0]=tmpobj[0];
obj[1]=tmpobj[1]!=null?tmpobj[1].toString():"";
obj[2]=tmpobj[2]!=null?tmpobj[2].toString():"";
obj[3]=new BigDecimal(tmpobj[2]!=null?tmpobj[2].toString():"0").subtract(new BigDecimal(tmpobj[1]!=null?tmpobj[1].toString():"0"));
obj[4]=tmpobj[3]!=null?tmpobj[3].toString():"";
obj[5]=tmpobj[4]!=null?tmpobj[4].toString():"";
obj[6]=new BigDecimal(tmpobj[4]!=null?tmpobj[4].toString():"0").subtract(new BigDecimal(tmpobj[3]!=null?tmpobj[3].toString():"0"));
obj[7]=tmpobj[5]!=null?tmpobj[5].toString():"";
rows.get(2+i).setHeight(44.15);
List cells = rows.get(2+i).getCells();
int j=0;
for(XSLFTableCell tmpcell:cells){
tmpcell.setBorderBottom(2);
tmpcell.setBorderBottomColor(java.awt.Color.white);
tmpcell.setBorderLeft(2);
tmpcell.setBorderLeftColor(java.awt.Color.white);
tmpcell.setBorderRight(2);
tmpcell.setBorderRightColor(java.awt.Color.white);
tmpcell.setVerticalAlignment(VerticalAlignment.MIDDLE);
if(i%2==0){
tmpcell.setFillColor(new Color(233, 237, 244));
}else{
tmpcell.setFillColor(new Color(208, 216, 232));
}
XSLFTableCell txt = tmpcell;
txt.addNewTextParagraph();
List paragraph2 = txt.getTextParagraphs();
if(paragraph2!=null && paragraph2.size()>0){
paragraph2.get(0).setTextAlign(TextAlign.CENTER);
XSLFTextRun run = paragraph2.get(0).addNewTextRun();
run.setText(obj[j]!=null?obj[j].toString():"");
run.setFontColor(java.awt.Color.black);
run.setFontFamily("宋体");
run.setFontSize(16);
}
j++;
}
i++;
}
}
}
endppt.createSlide().importContent(tmpppt.getSlides()[0]);
tmpppt.removeSlide(0);
}
XSLFTable table = (XSLFTable) runs2[2];获取不同的table
List
List
这样就会生成对应的表,表头是继承与原模版的,只需要在对应的位置增加行列填入数据即可,其他还有图片的生成方法,在这里就不介绍了,每张幻灯片都是可以加入图片,表格以及文字等的。
遇到的最大的问题就是生成的幻灯片的背景都是白色的,尝试了几种方式都有问题:
第一种:设置背景颜色:
XSLFShape.getBackground().setFillColor(Color.red );
但是这样会报错,在setFillColor方法中调用CTShapeProperties初始化的方法报错,好像是缺失社么shape,但是具体的也没找到原因,网络上也有遇到这样的问题的,但是没有解决方案参考,由于时间彼表赶就放弃了
第二种:在模版中设置背景颜色和背景图片填充颜色
这种方式不是在新的pptx中继承,所以还是白色的背景
第三种:引入图片在幻灯片中做背景图片
这种方式会将图片置于最上端,覆盖幻灯片的东西
解决:
最终我在模版中设置引入图片,然后将图片置底看似背景,然后生成的pptx 文件中有引入这个图片控件,就可以使用。