|
本帖最后由 Maybe 于 2024-6-21 17:38 编辑
两种方式: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.模板处理
- 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;
- }
- }
复制代码
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();
- }
- }
复制代码
|
上一篇: JAVA接入讯虎支付接口调用下一篇: Host '***' is blocked because of many connection errors; unblock wi...
|