在Java中对PPT文件进行操作的话,我使用的是Apache的开源项目POI。该项目的功能主要是使用Java开发或生成微软办公文件,比如:Word、Excel、PPT、Visio等。其中实现对PPT文件进行操作的类包主要是HSLF(.ppt)和XSLF(.pptx),在本文中,会以XSLF为主。
package com.jointstarc.test;
import java.io.FileOutputStream; import java.io.IOException;
import org.apache.poi.xslf.usermodel.XMLSlideShow; import org.apache.poi.xslf.usermodel.XSLFSlide;
public class Demo1 { public static void main(String[] args) { // 创建一个空白PPT XMLSlideShow ppt = new XMLSlideShow(); // 在空白的PPT中创建一个空白的幻灯片 XSLFSlide slide = ppt.createSlide(); try { // 对新建的PPT保存到硬盘里 ppt.write(new FileOutputStream("D://test3.pptx")); } catch (Exception e) { e.printStackTrace(); } finally { if (ppt != null) { try { // 保存完之后要对PPT进行关闭操作 ppt.close(); } catch (IOException e) { e.printStackTrace(); } } } } } |
/* * 在空幻灯片中插入一个文本框,然后在文本框中写入文字, * 并给文字添加一个超链接 */ // 在幻灯片中插入一个文本框 XSLFTextShape ts = slide.createTextBox(); // 设置文本框的位置和文本框大小 ts.setAnchor(new Rectangle(150, 150, 200, 50)); // 设置文本框里面的文字 XSLFTextRun tr = ts.addNewTextParagraph().addNewTextRun(); tr.setText("测试一下"); // 给文本添加颜色 tr.setFontColor(Color.RED); // 给文本添加超链接 XSLFHyperlink link = tr.createHyperlink(); link.setAddress("http://www.baidu.com"); |
/* * 在幻灯片中添加表格 */ // 在幻灯片中插入一个表格 XSLFTable table = slide1.createTable(); // 设置表格的位置和表格大小 table.setAnchor(new Rectangle(50, 100, 100, 100)); for (int i = 0; i < 5; i++) { // 在表格中添加一行 XSLFTableRow row = table.addRow(); for (int j = 0; j < 5; j++) { // 在行中添加一个单元格 XSLFTableCell cell = row.addCell(); // 设置单元格中的内容和样式 XSLFTextParagraph p = cell.addNewTextParagraph(); p.setTextAlign(TextAlign.CENTER); XSLFTextRun tr1 = p.addNewTextRun(); tr1.setFontColor(Color.RED); tr1.setText("测试" + i + j); // 设置单元格边框的粗细 cell.setBorderWidth(BorderEdge.bottom, 2.0); cell.setBorderWidth(BorderEdge.left, 2.0); cell.setBorderWidth(BorderEdge.right, 2.0); cell.setBorderWidth(BorderEdge.top, 2.0); // 设置单元格边框的颜色 cell.setBorderColor(BorderEdge.bottom, Color.black); cell.setBorderColor(BorderEdge.left, Color.black); cell.setBorderColor(BorderEdge.right, Color.black); cell.setBorderColor(BorderEdge.top, Color.black); } } |
/* * 在幻灯片中插入一张图片 */ // 图片文件 File image = new File("D://111.jpg"); // 图片文件输入流 FileInputStream imageFis = new FileInputStream(image); // 获取图片大小 int len = (int) image.length(); // 创建一个字节数组,数组大小与图片文件大小一致 byte[] imageData = new byte[len]; // 将图片数据读进字节数组中 imageFis.read(imageData); // 将图片添加到PPT中 XSLFPictureData pd = ppt.addPicture(imageData, PictureData.PictureType.JPEG); // 将图片放到指定的幻灯片中 XSLFPictureShape pic = slide2.createPicture(pd); // 设置图片框的放置的位置和大小 pic.setAnchor(new Rectangle(50, 100, 200, 200)); |
package com.jointstarc.test;
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException;
import org.apache.poi.xslf.usermodel.XMLSlideShow; import org.apache.poi.xslf.usermodel.XSLFSlide;
public class Demo2 { public static void main(String[] args) { XMLSlideShow ppt = null; try { // 通过输入流读取一个现有的PPT文件,生成PPT类 ppt = new XMLSlideShow(new FileInputStream("D://test.pptx")); // 在现有的PPT文件后面新建一个空白幻灯片 XSLFSlide slide = ppt.createSlide(); // 将修改后的PPT文件回写到硬盘 ppt.write(new FileOutputStream("D://test3.pptx")); } catch (Exception e) { e.printStackTrace(); } finally { if (ppt != null) { try { // 保存完之后要对PPT进行关闭操作 ppt.close(); } catch (IOException e) { e.printStackTrace(); } } } } } |
/* * 获取PPT的所有文本框里的文字,并进行更改 */ // 获取PPT中的所有幻灯片 List // 遍历幻灯片 for (XSLFSlide slide : slides) { // 获取幻灯片中的所有图形(文本框、表格、图形...) List // 遍历图形 for (XSLFShape shape : shapes) { // 判断该图形类是否是文本框类 if (shape instanceof XSLFTextShape) { // 将图像类强制装换成文本框类 XSLFTextShape ts = (XSLFTextShape) shape; // 获取文本框内的文字 String str = ts.getText(); System.out.println(str);
// 若想对文本框内的文字进行更改,还需要进行如下步骤 List for (XSLFTextParagraph tp : textParagraphs) { List for (XSLFTextRun r : textRuns) { if ("201809".equals(r.getRawText())) { // 对匹配到的字符串进行更改 r.setText("2018-09"); // 设置字体颜色 r.setFontColor(Color.RED); } } } } } } |
/* * 获取PPT的所有表格里的文字,并进行更改 */ // 获取PPT中的所有幻灯片 List for (XSLFSlide slide : slides) { // 获取幻灯片中的所有图形(文本框、表格、图形...) List for (XSLFShape shape : shapes) { // 判断该图形类是否是表格类 if (shape instanceof XSLFTable) { // 将图像类强制装换成表格类 XSLFTable table = (XSLFTable) shape; // 获取表格中的所有行 List for (XSLFTableRow tr : rows) { // 获取行中的所有单元格 List for (XSLFTableCell tc : cells) { // 获取单元格内的文字 String str = tc.getText(); // 若想对表格内的文字进行更改,还需要进行如下步骤 List for (XSLFTextParagraph tp : textParagraphs) { List for (XSLFTextRun r : textRuns) { if ("风险指标".equals(r.getRawText())) { // 对匹配到的字符串进行更改 r.setText("测试修改文字"); // 设置字体颜色 r.setFontColor(Color.RED); } } } } } } } } |
/* * 获取PPT的所有图片,并进行更改 */ // 获取PPT中的所有幻灯片 List for (XSLFSlide slide : slides) { // 获取幻灯片中的所有图形(文本框、表格、图形...) List for (XSLFShape shape : shapes) { // 判断该图形类是否是图片框类 if (shape instanceof XSLFPictureShape) { /* * 获取图片数据 */ // 将图像类强制装换成图片框类 XSLFPictureShape ps = (XSLFPictureShape) shape; // 获取图片的字节码数据(可以利用输出流将该图片保存到硬盘里) byte [] pictureData = ps.getPictureData().getData(); /* * 更改图片 */ // 图片文件 File image = new File("D://222.jpg"); // 图片文件输入流 FileInputStream imageFis = new FileInputStream(image); // 获取图片大小 int len = (int) image.length(); // 创建一个字节数组,数组大小与图片文件大小一致 byte[] imageData = new byte[len];
if (imageFis.read(imageData) != -1) { // 更换图片必须图片设置索引,要不不生效 ps.getPictureData().setIndex(1); ps.getPictureData().setData(imageData); } // 关闭输入流 imageFis.close(); } } } |
若转装载,请标明来源,谢谢!