java poi 操作ppt

可以参考:

https://www.w3cschool.cn/apache_poi_ppt/apache_poi_ppt_installation.html

http://blog.sina.com.cn/s/blog_657d630f0100nltw.html

http://blog.csdn.net/zt_fucker/article/details/52290028

http://blog.csdn.net/mike_caoyong/article/details/28651665

http://blog.csdn.net/littlebeat123/article/details/46483323

http://bbs.csdn.net/topics/380182913

http://blog.csdn.net/zhongweijian/article/details/8299531

http://www.anyrt.com/blog/list/poippt.html

具体:

1:maven 依赖:

  <!--导出文件--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency>

java代码:

package com.dengwei.day01springboot.utils;import org.apache.poi.sl.usermodel.PictureData;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xslf.usermodel.*;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;import static org.apache.poi.xslf.usermodel.SlideLayout.TITLE_AND_CONTENT;/*** @Author* @ClassName AddImgToPPt* @Description TODO* @Date 2018/11/17 0017 下午 3:28* @Version 1.0*/
public class AddImgToPPt {public static void main(String args[]) throws IOException {// 创建ppt:XMLSlideShow ppt = new XMLSlideShow();//设置幻灯片的大小:Dimension pageSize = ppt.getPageSize();pageSize.setSize(800,700);//获取幻灯片主题列表:List<XSLFSlideMaster> slideMasters = ppt.getSlideMasters();//获取幻灯片的布局样式XSLFSlideLayout layout = slideMasters.get(0).getLayout(SlideLayout.TITLE_AND_CONTENT);//通过布局样式创建幻灯片XSLFSlide slide = ppt.createSlide(layout);// 创建一张无样式的幻灯片
//        XSLFSlide slide = ppt.createSlide();//通过当前幻灯片的布局找到第一个空白区:XSLFTextShape placeholder = slide.getPlaceholder(0);XSLFTextRun title = placeholder.setText("成都智互联科技有限公司");XSLFTextShape content = slide.getPlaceholder(1);//   投影片中现有的文字
        content.clearText();content.setText("图片区");// reading an imageFile image = new File("F:\\workroom\\img\\class2.jpg");//获取图片信息:BufferedImage img = ImageIO.read(image);// converting it into a byte arraybyte[] picture = IOUtils.toByteArray(new FileInputStream(image));// adding the image to the presentationXSLFPictureData idx = ppt.addPicture(picture, PictureData.PictureType.PNG);// creating a slide with given picture on itXSLFPictureShape pic = slide.createPicture(idx);//设置当前图片在ppt中的位置,以及图片的宽高pic.setAnchor(new java.awt.Rectangle(360, 200, img.getWidth(), img.getHeight()));// creating a file objectFile file = new File("F:\\workroom\\img\\AddImageToPPT.pptx");FileOutputStream out = new FileOutputStream(file);// saving the changes to a file
        ppt.write(out);System.out.println("image added successfully");out.close();}}

找到给定文件夹下面的所有图片文件:

  //找到当前文件夹下面的所有图片文件private  ArrayList<File> ImgList = new ArrayList<>();public List<File> findAllImgFile(File file) throws IOException {
//        File file = new File("F:\\workroom\\img");File[] files = file.listFiles();for (File file1 : files) {if (file1.isDirectory()) {findAllImgFile(file1);} else if (ImageIO.read(file1) != null) {ImgList.add(file1);}}return ImgList;}

 项目实战运用:

package com.zhl.push.Utils;import com.mongodb.gridfs.GridFSDBFile;
import org.apache.poi.sl.usermodel.PictureData;
import org.apache.poi.sl.usermodel.StrokeStyle;
import org.apache.poi.sl.usermodel.TextBox;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xslf.usermodel.*;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import static org.apache.poi.xslf.usermodel.SlideLayout.TITLE_AND_CONTENT;/*** @Author* @ClassName PPtExportUtil* @Description TODO ppt导出检测报告* @Date 2018/12/11 13:43* @Version 1.0*/
public class PPtExportUtil {public static XMLSlideShow exportPPt() throws IOException {// 创建ppt:XMLSlideShow ppt = new XMLSlideShow();//设置幻灯片的大小:Dimension pageSize = ppt.getPageSize();pageSize.setSize(975, 730);// 创建一张无样式的幻灯片(首页)XSLFSlide slide = ppt.createSlide();//标题XSLFTextBox title = slide.createTextBox();   //创建文本框title.setAnchor(new Rectangle2D.Double(400, 100, 250, 100));  //设置文本框的位置XSLFTextParagraph titleFontP = title.addNewTextParagraph();    //创建一个段落XSLFTextRun titleTextRun = titleFontP.addNewTextRun();      //创建文本titleTextRun.setText("成都肛肠医院--发布");                  //设置文本类容titleTextRun.setFontSize(26.00);  //设置标题字号
//        titleTextRun.setBold(true);    //设置成粗体XSLFTextParagraph titlePr = title.addNewTextParagraph();titlePr.setSpaceBefore(-20D);     // 设置与上一行的行距 :20DtitlePr.setLeftMargin(35D);        //设置段落开头的空格数titlePr.setBulletFont("宋体");XSLFTextRun xslfTextRun = titlePr.addNewTextRun();xslfTextRun.setText("媒体监测报告");xslfTextRun.setFontSize(26.00);//公司XSLFTextBox textBox = slide.createTextBox();textBox.setAnchor(new Rectangle2D.Double(30, 150, 300, 150));XSLFTextRun paragraph = textBox.addNewTextParagraph().addNewTextRun();paragraph.setText("智互联科技有限公司");paragraph.setBold(true);paragraph.setFontSize(30.00);//      城市XSLFTextBox textCityBox = slide.createTextBox();textCityBox.setAnchor(new Rectangle2D.Double(440, 390, 250, 100));XSLFTextRun city = textCityBox.addNewTextParagraph().addNewTextRun();city.setText("成都");city.setFontSize(20.00);
//     时间XSLFTextBox textTimeBox = slide.createTextBox();textTimeBox.setAnchor(new Rectangle2D.Double(400, 420, 400, 100));XSLFTextRun time = textTimeBox.addNewTextParagraph().addNewTextRun();time.setText("2018年12月10日-2019年1月28日");time.setFontSize(20.00);//   插入图片到ppt中 、每页显示两张//测试图片数据ArrayList<String> imgs = new ArrayList<>();imgs.add("F:\\img\\ceshi1.jpg");imgs.add("F:\\img\\ceshi2.jpg");imgs.add("F:\\img\\ceshi3.jpg");imgs.add("F:\\img\\ceshi4.jpg");imgs.add("F:\\img\\ceshi5.jpg");imgs.add("F:\\img\\ceshi6.jpg");//获取图片信息:
//      BufferedImage img = ImageIO.read(image);if (imgs.size() > 0) {for (int i = 0; i < imgs.size(); i++) {//创建一张幻灯片XSLFSlide slidePicture = ppt.createSlide();//项目名字XSLFTextBox projectNameBox = slidePicture.createTextBox();projectNameBox.setAnchor(new Rectangle2D.Double(150, 100, 200, 200));XSLFTextRun projectName = projectNameBox.addNewTextParagraph().addNewTextRun();projectName.setText("万科京城");projectName.setBold(true);projectName.setFontSize(20.00);//项目信息XSLFTextBox projectInfoBox = slidePicture.createTextBox();projectInfoBox.setAnchor(new Rectangle2D.Double(280, 100, 400, 200));XSLFTextRun projectInfo = projectInfoBox.addNewTextParagraph().addNewTextRun();projectInfo.setText("社区位置:" + "成都市锦江区水三接166号");projectInfo.setFontSize(14.00);XSLFTextRun projectType = projectInfoBox.addNewTextParagraph().addNewTextRun();projectType.setText("社区属性:" + "商住楼");projectType.setFontSize(14.00);XSLFTextRun projectDdNum = projectInfoBox.addNewTextParagraph().addNewTextRun();projectDdNum.setText("合同规定:" + "10");projectDdNum.setFontSize(14.00);XSLFTextRun projectPushNum = projectInfoBox.addNewTextParagraph().addNewTextRun();projectPushNum.setText("实际发布:" + "8");projectPushNum.setFontSize(14.00);//发布实景图XSLFTextBox pushPic = slidePicture.createTextBox();pushPic.setAnchor(new Rectangle2D.Double(150, 210, 400, 100));XSLFTextRun pushPicTxt = pushPic.addNewTextParagraph().addNewTextRun();pushPicTxt.setText("发布实景图:");pushPicTxt.setFontSize(14.00);//       插入图片 、每页显示两张图片:int h = 2;for (int k = 0;k<h;k++){if(i<imgs.size()){byte[] picture2 = IOUtils.toByteArray(new FileInputStream(imgs.get(i++)));XSLFPictureData idx2 = ppt.addPicture(picture2, PictureData.PictureType.JPEG);XSLFPictureShape pic2 = slidePicture.createPicture(idx2);if(k==0){pic2.setAnchor(new java.awt.Rectangle(150, 260, 200, 240));}else if (k==1){pic2.setAnchor(new java.awt.Rectangle(400, 260, 200, 240));}}}if(i>0){i=i-1;}}}System.out.println("image added successfully");return ppt;}}

controller:

@Controller
@RequestMapping("ppt")
public class PPTExportController {@RequestMapping("export")public void exportPPt(HttpServletResponse response, HttpServletRequest request) throws IOException {XMLSlideShow xmlSlideShow = PPtExportUtil.exportPPt();String fileName = "a.ppt";//处理中文文件名乱码if (request.getHeader("User-Agent").toUpperCase().contains("MSIE") ||request.getHeader("User-Agent").toUpperCase().contains("TRIDENT")|| request.getHeader("User-Agent").toUpperCase().contains("EDGE")) {fileName = java.net.URLEncoder.encode(fileName, "UTF-8");} else {//非IE浏览器的处理:fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");}response.setContentType("application/vnd.ms-powerpoint");response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");xmlSlideShow.write(response.getOutputStream());}
}

场景2:根据ppt模板导出ppt

注意:如果是springboot项目打成jar后不能使用ResourceUtils.getFile(" ") 来读取资源文件,只能使用:InputStream inputStream = getClass().getClassLoader().getResourceAsStream("static/zhmd.pptx");

public static void PptExportUtil() throws IOException {//读取模板pptSlideShow ppt = new XMLSlideShow(new FileInputStream(ResourceUtils.getFile("classpath:static/zhmd.pptx")));//提取文本信息List<XSLFSlide> slides = ppt.getSlides();//   SlideShow slideShow = copyPage(slides.get(1), ppt,2);for (XSLFSlide slide : slides) {List<XSLFShape> shapes = slide.getShapes();for(int i=0;i<shapes.size();i++){Rectangle2D anchor = shapes.get(i).getAnchor();if (shapes.get(i) instanceof XSLFTextBox) {XSLFTextBox txShape = (XSLFTextBox) shapes.get(i);if (txShape.getText().contains("{schemeName}")) {// 替换文字内容.用TextRun获取替换的文本来设置样式TextRun rt = txShape.setText(txShape.getText().replace("{schemeName}", "测试方案"));rt.setFontColor(Color.BLACK);rt.setFontSize(20.0);rt.setBold(true);rt.setFontFamily("微软雅黑");}else if (txShape.getText().contains("{time}")) {TextRun textRun = txShape.setText(txShape.getText().replace("{time}", "2019-1-19"));textRun.setFontColor(Color.BLACK);textRun.setFontSize(20.0);textRun.setFontFamily("微软雅黑");}   else if (txShape.getText().contains("{projectAdd}")) {TextRun textRun = txShape.setText(txShape.getText().replace("{projectAdd}", "成都市经江区"));textRun.setFontColor(Color.BLACK);textRun.setFontSize(16.0);textRun.setFontFamily("微软雅黑");} else if (txShape.getText().contains("{rzl}")) {TextRun textRun = txShape.setText(txShape.getText().replace("{rzl}", "90%"));textRun.setFontColor(Color.BLACK);textRun.setFontSize(16.0);textRun.setFontFamily("微软雅黑");}else if (txShape.getText().contains("{cg}")) {TextRun textRun = txShape.setText(txShape.getText().replace("{cg}", "30"));textRun.setFontColor(Color.BLACK);textRun.setFontSize(16.0);textRun.setFontFamily("微软雅黑");}else if (txShape.getText().contains("{mediaImg2}")) {byte[] bytes = IOUtils.toByteArray(new FileInputStream(ResourceUtils.getFile("classpath:static/ceshi4.jpg")));PictureData pictureData = ppt.addPicture(bytes, XSLFPictureData.PictureType.JPEG);XSLFPictureShape picture = slide.createPicture(pictureData);picture.setAnchor(anchor);}else if (txShape.getText().contains("{mediaImg1}")) {byte[] bytes = IOUtils.toByteArray(new FileInputStream(ResourceUtils.getFile("classpath:static/ceshi4.jpg")));PictureData pictureData = ppt.addPicture(bytes, XSLFPictureData.PictureType.JPEG);XSLFPictureShape picture = slide.createPicture(pictureData);picture.setAnchor(anchor);}else if(txShape.getText().contains("{projectImg}")){byte[] bytes = IOUtils.toByteArray(new FileInputStream(ResourceUtils.getFile("classpath:static/ceshi5.jpg")));PictureData pictureData = ppt.addPicture(bytes, XSLFPictureData.PictureType.JPEG);XSLFPictureShape picture = slide.createPicture(pictureData);picture.setAnchor(anchor);}}}}OutputStream outputStreams = new FileOutputStream("F:\\test2.pptx");ppt.write(outputStreams);}
/** * @return * @Author * @Description //TODO 复制ppt中的幻灯片 ,并设置幻灯片在ppt中的位置 * @Date 2019/1/24 11:16 * @Param slide:被复制的幻灯片,ppt:ppt对象, index:复制的ppt插入到第几页 */public static XSLFSlide copyPage(XSLFSlide slide, XMLSlideShow ppt, int index) throws IOException {    List<XSLFShape> shapes = slide.getShapes();    XSLFSlide slide2 = ppt.createSlide();    if (shapes.size() > 0) {        for (XSLFShape shape : shapes) {            slide2.importContent(shape.getSheet());        }    }    //排序(在PPT中的第几页)    ppt.setSlideOrder(slide2, index);    return slide2;}
public static void main(String[] args) { try { PptExportUtil(); System.out.println("执行完成!!!!!!!!!"); } catch (IOException e) { e.printStackTrace(); } }

注意:返回给浏览器是一个流对象,前端页面需要通过<a href=" " > 的形式访问  或则  window.location.href='' " 访问

或者 用axios 请求文件:

 axios({url: path + '/ppt/export' + '?access_token=' + getToken(),method: 'post',type: 'application/vnd.ms-powerpoint',params: {pushDate: this.changeDate,schemeId: val.id},responseType: 'blob'}).then(response => {const blob = new Blob([response.data])const fileName = val.schemeName + '.pptx'if ('download' in document.createElement('a')) { // 非IE下载const elink = document.createElement('a')elink.download = fileNameelink.style.display = 'none'elink.href = URL.createObjectURL(blob)document.body.appendChild(elink)elink.click()URL.revokeObjectURL(elink.href) // 释放URL 对象
          document.body.removeChild(elink)this.disable = false} else { // IE10+下载
          navigator.msSaveBlob(blob, fileName)this.disable = false}})

3:如果PPT模板中包含表格,怎么往表格中添加数据呢??

 /*** @return* @Author* @Description //TODO 六福珠宝--往PPT中表格填充数据* @Date 2019/4/21 16:41* @Param*/public void insertExcelDataToPPt(XSLFSlide slide, XMLSlideShow ppt, List<Map> DataTable) throws IOException {List<List<Map>> subListMap = getSubListMap(DataTable, 10);int k = 1;int p = 1;for (int a = 0; a < subListMap.size(); a++) {int h=1;XSLFSlide slide1 = copyPage(slide, ppt, p);List<XSLFShape> shapes = slide1.getShapes();for (XSLFShape shape : shapes) {Rectangle2D rcn = shape.getAnchor();//ppt页中是否含有表格判断if (shape instanceof XSLFTable) {XSLFTable table = (XSLFTable) shape;table.setAnchor(rcn);for (int d = 0; d < subListMap.get(a).size(); d++) {XSLFTableRow tr = table.getRows().get(h);int cellSize = tr.getCells().size();for (int j = 0; j < cellSize; j++) {if (j == 0) {tr.getCells().get(j).setText(String.valueOf(k));} else if (j == 1) {String projectName = String.valueOf(subListMap.get(a).get(d).get("projectName"));tr.getCells().get(j).setText(projectName);} else if (j == 2) {String projectAdds = String.valueOf(subListMap.get(a).get(d).get("projectAdds"));tr.getCells().get(j).setText(projectAdds);} else if (j == 3) {String ddNum = String.valueOf(subListMap.get(a).get(d).get("ddNum"));tr.getCells().get(j).setText(ddNum);} else if (j == 4) {String sjNum = String.valueOf(subListMap.get(a).get(d).get("sjNum"));tr.getCells().get(j).setText(sjNum);}}k += 1;h+=1;}}}p+=1;}ppt.removeSlide(0);}

4:集合分割:

 /*** @return* @Author* @Description //TODO 集合分割* @Date 2019/1/24 16:48* @Param*/private List<List<Map>> getSubListMap(List list, int len) {List<List<Map>> listGroup = new ArrayList<List<Map>>();if (list.size() < len) {listGroup.add(list);return listGroup;}int listSize = list.size();//子集合的长度int toIndex = len;for (int i = 0; i < list.size(); i += len) {if (i + len > listSize) {toIndex = listSize - i;}List<Map> newList = list.subList(i, i + toIndex);listGroup.add(newList);}return listGroup;}

 

转载于:https://www.cnblogs.com/dw3306/p/9974920.html

java poi 操作ppt相关推荐

  1. Java使用poi操作ppt

    Java使用poi操作ppt https://editor.csdn.net/md/?articleId=117926694 上一篇中写了操作文本框和插入图片 这一篇主要是如何在有模板的情况下如替换文 ...

  2. java通过poi操作ppt

    Java POI导出ppt简单实现 Java使用poi组件导出ppt报表幻灯片,poi导出pptx表格可以合并单元格,输出老版本的ppt不支持合并单元格, 下面介绍poi导出pptx的一些常用功能, ...

  3. java使用poi操作ppt(导入,导出,读取,添加,拼接,替换文本,页面排序)

    POI操作PPT文档(导入,导出,读取,添加,拼接,替换文本,页面排序) 注意:直接读取.pptx文件时不能使用${user}这样的作为替换标识,在读取.pptx文件时会解析成三段文本"${ ...

  4. POI操作ppt图表完整示例演示

    poi操作ppt图表史上最完整示例演示和内嵌excel的获取添加数据简单示例,POI3.15版本. 在模板中构造几中基本图表进行测试就行了. 其它操作ppt的基础资料见:http://blog.csd ...

  5. poi操作ppt图表史上最完整示例演示

    poi操作ppt图表史上最完整示例演示和内嵌excel的获取添加数据简单示例 ,POI3.15版本. 在模板中构造几中基本图表进行测试就行了. 完整下载地址:http://download.csdn. ...

  6. poi 操作 PPT,针对 PPTX--文字操作

    poi 操作 PPT,针对 PPTX–文字操作 文章目录 poi 操作 PPT,针对 PPTX--文字操作 1.获取幻灯片内的所有段落文字 2.对幻灯片内的文本内容进行模板替换 3.对段落新增文本 接 ...

  7. poi操作PPT文档总结

    POI操作PPT文档1 注意ppt模板不能使用${user}--这样的作为替换标识,在读取PPT模板时会解析成三段文本1.${ 2.user  3.},而一般在控件中使用%1$S这样的方式做为替换标识 ...

  8. Java - Poi 操作 Excel

    Java - Poi 操作 Excel 关注 "弋凡"(YiFan)微信公众号吧 记录简单笔记 做你的最爱 注意 XSSFWorkbook 对象是操作 .xlsx 格式的表格 HS ...

  9. java poi 操作word遇到的问题

    java poi 操作word文本,图表,遇到的问题 直接上问题 模板字段匹配问题 图表问题 图表导出 问题:模板找不到对应图表 问题:数据填充后效果不达目标 图表中为零的数值去掉(!!!模板层面解决 ...

最新文章

  1. ntop和Cacti
  2. 好消息,Blackberry开发文档发布。
  3. vue导入非es6 js文件_Vue项目兼容IE11
  4. mac 当前文件夹打开终端_Mac上的这些实用你技巧,你知道几个?
  5. linux find和xargs
  6. Bipartite Segments CodeForces - 901C (区间二分图计数)
  7. 代码评审-如何保证缓存与数据库的读写一致性?
  8. java 与sas交互_SAS与MACRO的交互使用
  9. hadoop集群配置SSH免登陆
  10. ElasticSearch搜索引擎:数据的写入流程
  11. 学习OpenCV3:计算点到直线的距离并画出垂线(含公式和推导)
  12. python多条件求和_使用sumifs进行多条件求和
  13. 图片一句话木马简单制作方法
  14. 借助 Lucene.Net 构建站内搜索引擎(上)
  15. Linux- 系统随你玩之--文本、字符串处理摸金校尉--RE
  16. 超说网络NO.4 | 深入了解应用层原理(中科大 郑烇)
  17. 使用第三方应用打开pdf文件
  18. 基于搜狗微信的爬虫知识总结
  19. 【NVCaffe源码分析】数据增量之batch_sampler
  20. 如何用光盘映像文件重装服务器系统,使用ISO系统镜像文件重装系统的方法集合...

热门文章

  1. Elasticsearch是如何实现master选举的?
  2. C++中Future和Promise的一种简单实现
  3. redis压缩列表ziplist的连锁扩容
  4. 服务器c盘windows文件夹太大,Win10C盘windows文件夹过大怎么办?Win10C盘windows文件夹过大的解决方法...
  5. PHP 安全:如何防范用户上传 PHP 可执行文件
  6. PHP CodeBase: 判断用户是否手机访问
  7. 启动报错:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
  8. C语言中总是从main函数开始执行函数吗?
  9. Go 到底算不算一门面向对象的编程语言
  10. 二分的思想在算法中体现