两种方式:1.自定义样式导出 2.根据模板导出
1.自定义设置样式导出PPT
public static void main(String[] args) throws IOException {
XMLSlideShow ppt = new XMLSlideShow();
// 创建幻灯片
XSLFSlide slide = ppt.createSlide();
// 创建文本框
XSLFTextBox textBox = slide.createTextBox();
// x y设置距离 w h 设置大小
textBox.setAnchor(new Rectangle2D.Double(30,0, 600, 50));
// 设置文本框的内容
textBox.addNewTextParagraph().addNewTextRun().setText("姓名");
// 创建文本框
XSLFTextBox textBox1 = slide.createTextBox();
// x y设置距离 w h 设置大小
textBox1.setAnchor(new Rectangle2D.Double(30,50, 600, 50));
// 设置文本框的内容
textBox1.addNewTextParagraph().addNewTextRun().setText("年龄");
// 创建文本框
XSLFTextBox textBox11 = slide.createTextBox();
// x y设置距离 w h 设置大小
textBox11.setAnchor(new Rectangle2D.Double(250,50, 600, 50));
// 设置文本框的内容
textBox11.addNewTextParagraph().addNewTextRun().setText("性别");
// 创建文本框
XSLFTextBox textBox2 = slide.createTextBox();
// x y设置距离 w h 设置大小
textBox2.setAnchor(new Rectangle2D.Double(30,100, 600, 50));
// 设置文本框的内容
textBox2.addNewTextParagraph().addNewTextRun().setText("时间");
// 创建文本框
XSLFTextBox textBox22 = slide.createTextBox();
// x y设置距离 w h 设置大小
textBox22.setAnchor(new Rectangle2D.Double(250,100, 600, 50));
// 设置文本框的内容
textBox22.addNewTextParagraph().addNewTextRun().setText("地点");
// 创建文本框
XSLFTextBox textBox3 = slide.createTextBox();
// x y设置距离 w h 设置大小
textBox3.setAnchor(new Rectangle2D.Double(30,150, 600, 50));
// 设置文本框的内容
textBox3.addNewTextParagraph().addNewTextRun().setText("事件"
// 创建文本框
XSLFTextBox textBox33 = slide.createTextBox();
// x y设置距离 w h 设置大小
textBox33.setAnchor(new Rectangle2D.Double(250,150, 600, 50));
// 设置文本框的内容
textBox33.addNewTextParagraph().addNewTextRun().setText("备注");
// 插入图片
// 获取图片的file对象
File file = new File("C:\\图片.png");
// 获取字节流
byte[] bt = FileUtils.readFileToByteArray(file);
XSLFPictureData idx = ppt.addPicture(bt, PictureData.PictureType.PNG);
// 插入图片
XSLFPictureShape pic = slide.createPicture(idx);
pic.setAnchor(new Rectangle2D.Double(30,200,350,150));
// 写入ppt中
ppt.write(new FileOutputStream("输出PPT"+".pptx"));
}
2.根据模板,创建PPT内容
utils:
import com.oppo.ipd.plm.mechanical.web.structure.PPTExport.bean.WeekAnalyseModel;
import org.apache.commons.io.FileUtils;
import org.apache.poi.sl.usermodel.Shape;
import org.apache.poi.sl.usermodel.*;
import org.apache.poi.xslf.usermodel.XSLFTextRun;
import org.apache.poi.xslf.usermodel.XSLFTextShape;
import java.awt.*;
import java.io.*;
import java.net.URL;
import java.util.Iterator;
/**
* <p>PowerPoint文件工具基类
* <p>
* <p>通用的PowerPoint文件工具基类,可用于从PowerPoint文档中抽取文本信息
*/
public class BasePowerPointFileUtil {
/**
* 渲染、绘制文本框
*
* @param shape
* @param data
*/
public static void renderShapeAndPicture(Shape shape, WeekAnalyseModel data, String rankType) {
//判断是否是文本框
if (shape instanceof TextShape) {
BasePowerPointFileUtil.replace(shape, data,rankType);
} else if (shape instanceof GroupShape) {
Iterator groupShapes = ((GroupShape) shape).iterator();
while (groupShapes.hasNext()) {
Shape groupShape = (Shape) groupShapes.next();
BasePowerPointFileUtil.renderShapeAndPicture(groupShape, data,rankType);
}
} else if (shape instanceof TableShape) {
TableShape tableShape = ((TableShape) shape);
int column = tableShape.getNumberOfColumns();
int row = tableShape.getNumberOfRows();
for (int r = 0; r < row; r++) {
for (int c = 0; c < column; c++) {
BasePowerPointFileUtil.replace(tableShape.getCell(r, c), data,rankType);
}
}
} else if (shape instanceof PictureShape) {
//判断是否是图片框
PictureShape pictureShape = (PictureShape) shape;
PictureData pictureData = pictureShape.getPictureData();
byte[] bytes = BufferStreamForByte(URLToFile(data.getPictureURL()), 1024);
try {
pictureData.setData(bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 替换模板PPT中的值
*
* @param shape
* @param weekAnalyseModel
*/
public static void replace(Shape shape, WeekAnalyseModel weekAnalyseModel,String rankType) {
//List<WeekAnalyseModel>是我们项目自己定义的model,可改成其他业务的model
if (shape instanceof TextShape) {
String replaceText = ((XSLFTextShape) shape).getText();
XSLFTextRun xslfTextRun = null;
//替换数据的业务逻辑,待优化
switch (replaceText) {
case "{name}":
xslfTextRun = ((XSLFTextShape) shape).setText(weekAnalyseModel.getName());
break;
case "{person}":
xslfTextRun = ((XSLFTextShape) shape).setText(weekAnalyseModel.getPerson());
break;
}
//空值过滤,设置样式
if (xslfTextRun != null) {
if (rankType.equals("未定义")||rankType.equals("未定义")){
setTextStyle(xslfTextRun);
}else if (rankType.equals("未定义")||rankType.equals("未定义")){
setTextStyleCertificate(xslfTextRun);
}
}
}
}
/**
* 设置字体样式
*
* @param xslfTextRun
*/
private static void setTextStyle(XSLFTextRun xslfTextRun) {
xslfTextRun.setFontFamily("等线(正文)");
Color color = new Color(255, 255, 255);
xslfTextRun.setFontColor(color);
xslfTextRun.setFontSize(40.0);
xslfTextRun.setBold(true);
}
/**
* 设置证书字体样式
*
* @param xslfTextRun
*/
private static void setTextStyleCertificate(XSLFTextRun xslfTextRun) {
xslfTextRun.setFontFamily("宋体");
Color color = new Color(0, 0, 0);
xslfTextRun.setFontColor(color);
xslfTextRun.setFontSize(32.0);
xslfTextRun.setBold(true);
}
/**
* 将文件转为字节数组
* @param file
* @param size
* @return
*/
public static byte[] BufferStreamForByte(File file, int size) {
byte[] content = null;
try {
BufferedInputStream bis = null;
ByteArrayOutputStream out = null;
try {
FileInputStream input = new FileInputStream(file);
bis = new BufferedInputStream(input, size);
byte[] bytes = new byte[1024];
int len;
out = new ByteArrayOutputStream();
while ((len = bis.read(bytes)) > 0) {
out.write(bytes, 0, len);
}
bis.close();
content = out.toByteArray();
} finally {
if (bis != null) {
bis.close();
}
if (out != null) {
out.close();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return content;
}
/**
* 读取网络中的图片
* @param url https://www.kziyue.com/wp-content/uploads/2019/06/5bca-hxyuaph9825616.jpg
* @return
*/
public static File URLToFile(String url){
File file1 = new File("replace.png");
try {
URL url1 = new URL(url);
FileUtils.copyURLToFile(url1,file1);
} catch (IOException e) {
e.printStackTrace();
}
File absoluteFile = file1.getAbsoluteFile();
return file1;
}
}
2.模板处理
import com.oppo.ipd.plm.mechanical.web.structure.PPTExport.bean.WeekAnalyseModel;
import org.apache.poi.sl.usermodel.Shape;
import org.apache.poi.sl.usermodel.Slide;
import org.apache.poi.xslf.usermodel.*;
import java.io.*;
import java.util.*;
/**
* 读取模板PPT生成新的PPT文件
*
* @author yilurong
* @version 1.0.0
* @since 2022/3/10 - 15:37
*/
public class RenderPowerPointTemplate extends BasePowerPointFileUtil {
/**
* 读取PPT模板
* @param powerPoint
* @param
* @throws IOException
*/
public static void renderPowerPointTemplateOfCertificate(InputStream powerPoint, List<WeekAnalyseModel> lists, String rankType) throws IOException, IllegalAccessException {
//List<WeekAnalyseModel>是我们项目自己定义的model,可改成其他业务的model
if(powerPoint == null) {
return;
}
//创建一个幻灯片
XMLSlideShow slideShow = new XMLSlideShow(powerPoint);
//从幻灯片中获取每个页
List slides = slideShow.getSlides();
//获取第一页数据
XSLFSlide slide = slideShow.getSlides().get(0);
//创建指定数量的模板页面
for (int i = 1; i < lists.size(); i++) {
copyPptPage(slide,slideShow,i);
slideShow.write(new FileOutputStream("model-copy.pptx"));
}
//遍历每一页PPT
for (int i = 0 ; i < slides.size() ; i++) {
//幻灯片布局,文本框,矩形框之类的,遍历一页PPT中的所有控件
List shapes = ((Slide)slides.get(i)).getShapes();
for (int j = 0 ; j < shapes.size() ; j++) {
Shape shape = (Shape) shapes.get(j);
RenderPowerPointTemplate.renderShapeAndPicture(shape, lists.get(i),rankType);
}
}
//新PPT的位置,file就是新的PPT文件
File file=new File(rankType+".pptx");
OutputStream outputStreams = new FileOutputStream(file);
slideShow.write(outputStreams);
// FileUpLoadUtil.T_THREAD_LOCAL.set(file.getAbsolutePath());
System.out.println("新文件的路径:"+file.getAbsolutePath());
}
public static XSLFSlide copyPptPage(XSLFSlide slide, XMLSlideShow ppt, int index) throws IOException {
List<XSLFShape> shapes = slide.getShapes();
//创建新的一页PPT
XSLFSlide slides = ppt.createSlide();
if (shapes.size() > 0) {
for (XSLFShape shape : shapes) {
slides.importContent(shape.getSheet());
}
}
//排序(在PPT中的第几页)
ppt.setSlideOrder(slides, index);
return slides;
}
}
3.内容实体类
import lombok.Data;
@Data
public class WeekAnalyseModel {
private String name;
private String pictureURL;
private String person;
}
4.测试代码:
public static void main(String[] args) throws Exception {
//载入数据
WeekAnalyseModel weekAnalyseModel=new WeekAnalyseModel();
weekAnalyseModel.setName("数据来源1");
weekAnalyseModel.setPerson("数据来源1");
weekAnalyseModel.setPictureURL("http://dev.itqu.net/1.jpg");
WeekAnalyseModel weekAnalyseModel2=new WeekAnalyseModel();
weekAnalyseModel2.setName("数据来源2");
weekAnalyseModel2.setPerson("数据来源2");
weekAnalyseModel2.setPictureURL("http://dev.itqu.net/2.jpg");
WeekAnalyseModel weekAnalyseModel3=new WeekAnalyseModel();
weekAnalyseModel3.setName("数据来源3");
weekAnalyseModel3.setPerson("数据来源3");
weekAnalyseModel3.setPictureURL("http://dev.itqu.net/3.jpg");
ArrayList arrayList=new ArrayList();
arrayList.add(weekAnalyseModel);
arrayList.add(weekAnalyseModel2);
arrayList.add(weekAnalyseModel3);
//载入模板ppt,创建模板副本
InputStream inputStream = new FileInputStream("model.pptx");
copyFile("model.pptx","model-copy.pptx");
InputStream inputStreamCopy = new FileInputStream("model-copy.pptx");
RenderPowerPointTemplate.renderPowerPointTemplateOfCertificate(inputStreamCopy,arrayList,"out");
}
private static void copyFile(String source, String copy) {
Path sourcePath = Paths.get(source);
Path destinationPath = Paths.get(copy);
try {
Files.copy(sourcePath, destinationPath,StandardCopyOption.REPLACE_EXISTING);
} catch (FileAlreadyExistsException e) {
// 目标文件已经存在
} catch (IOException e) {
// 发生了其他错误
e.printStackTrace();
}
}
全部评论