poi生成pptx文件以及背景颜色或者背景图片的设置

1 篇文章 0 订阅

最近由于工作中需要使用poi生成对应的pptx文件,就对照api文档进行研究了一下,api文档也是英文版的,很多东西感觉描述的不是那么清晰,比较耗费精力。在此分享一下生成方法以及一点问题的解决。其实在生成pptx文件的时候可以直接生成pptx文件,也可以设置模版,继承模版的一些设置,图片以及表格等信息进行文档生成,比较快捷,本次主要介绍在模版基础上生成文件的方式。

一:引入jar包

<!-- 以下是poi导入包  开始-->
<dependency>
			<groupId>poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.11</version>
		</dependency>
		<dependency>
			<groupId>poi</groupId>
			<artifactId>geronimo-stax-api_1.0_spec</artifactId>
			<version>3.7.0</version>
		</dependency>
		<dependency>
			<groupId>poi</groupId>
			<artifactId>poi-examples</artifactId>
			<version>3.11</version>
		</dependency>		
		<dependency>
			<groupId>poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>3.11</version>
		</dependency>		
		<dependency>
			<groupId>poi</groupId>
			<artifactId>poi-ooxml-schemas</artifactId>
			<version>3.11</version>
		</dependency>		
		<dependency>
			<groupId>poi</groupId>
			<artifactId>poi-scratchpad</artifactId>
			<version>3.11</version>
		</dependency>		
		<dependency>
			<groupId>poi</groupId>
			<artifactId>xmlbeans</artifactId>
			<version>2.6.0</version>
		</dependency>	
		<!-- poi 导入包  结束-->	

本次引入的poi包为3.11版本

二:继承文件模版

1.首先创建一个模版文件放在项目的下

2.其次读取模版文件生成最终需要的pptx文件

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);

三.生成ppt

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<XSLFTextParagraph> 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<XSLFTableRow> rows = table.getRows();
        		{
        			String biaotou ="表头";
        			XSLFTextBox txtbox = (XSLFTextBox) runs2[4];
        			List<XSLFTextParagraph> 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<XSLFTableCell> 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<XSLFTextParagraph> 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<XSLFTableRow> rows = table.getRows();取得table的行集合

List<XSLFTableCell> cells = rows.get(0).getCells();取得行的每一个列,也就是单元格

这样就会生成对应的表,表头是继承与原模版的,只需要在对应的位置增加行列填入数据即可,其他还有图片的生成方法,在这里就不介绍了,每张幻灯片都是可以加入图片,表格以及文字等的。

四:问题以及解决

遇到的最大的问题就是生成的幻灯片的背景都是白色的,尝试了几种方式都有问题:

第一种:设置背景颜色:

XSLFShape.getBackground().setFillColor(Color.red );

但是这样会报错,在setFillColor方法中调用CTShapeProperties初始化的方法报错,好像是缺失社么shape,但是具体的也没找到原因,网络上也有遇到这样的问题的,但是没有解决方案参考,由于时间彼表赶就放弃了

第二种:在模版中设置背景颜色和背景图片填充颜色

这种方式不是在新的pptx中继承,所以还是白色的背景

第三种:引入图片在幻灯片中做背景图片

这种方式会将图片置于最上端,覆盖幻灯片的东西

解决:

最终我在模版中设置引入图片,然后将图片置底看似背景,然后生成的pptx 文件中有引入这个图片控件,就可以使用。

 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值