1、导出ppt 必要的包

使用maven

  1. <dependency>
  2. <groupId>org.apache.poi</groupId>
  3. <artifactId>poi-ooxml</artifactId>
  4. <version>3.9</version>
  5. <exclusions>
  6. <exclusion>
  7. <groupId>org.apache.poi</groupId>
  8. <artifactId>poi-ooxml-schemas</artifactId>
  9. </exclusion>
  10. </exclusions>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.apache.poi</groupId>
  14. <artifactId>ooxml-schemas</artifactId>
  15. <version>1.1</version>
  16. </dependency>

2、poi-ooxml-schemas 和 ooxml-schemas 的区别

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

3、应用

3.1、表格操作

  1. public void parsing(XSLFSlide slide, XSLFTable table) {
  2. //for循环增加数据,忽略标题行
  3. List<XSLFTableRow> tableRow = table.getRows();
  4. List<XSLFTableCell> cells = tableRow.get(1).getCells();
  5.  
  6. while(table.getRows().size()<tableData.getRows()){
  7. XSLFTableRow row = table.addRow();
  8. for (int i1 = 0; i1 < cells.size(); i1++) {
  9. row.addCell();
  10.  
  11. }
  12.  
  13. }
  14.  
  15. for (int i = 0; i < tableData.getRows(); i++) {
  16. for (int i1 = 0; i1 < tableData.get(i).size(); i1++) {
  17. String key = tableData.get(i).get(i1);
  18. if(table.getRows().get(i + 1).getCells().size()<i1+1){
  19. table.getRows().get(i + 1).addCell();
  20. }
  21. table.getRows().get(i + 1).getCells().get(i1).setText(key);
  22. }
  23. }
  24.  
  25. }

 

3.2、替换图片操作

  插入图片自己查资料,这里不提

  这里只说读取模板ppt,并替换特定区域成图片。

  1. if(shape[i] instanceof XSLFAutoShape){
  2. XSLFAutoShape txShape = (XSLFAutoShape) shape[i];
  3. if (txShape.getText().contains("{pic}")) {
  4. byte[] pictureData = new byte[0];
  5. try {
  6. if(imageIndex>inputStreamList.size()-1){
  7. continue;
  8. }
  9. pictureData = IOUtils.toByteArray(inputStreamList.get(imageIndex++));
  10. } catch (IOException e) {
  11. e.printStackTrace();
  12. }
  13. int idx = slide.getSlideShow().addPicture(pictureData, XSLFPictureData.PICTURE_TYPE_PNG);
  14. XSLFPictureShape pic = slide.createPicture(idx);
  15. // 设置XSLFPictureShape的位置信息
  16. pic.setAnchor(txShape.getAnchor());
  17. // 移除XSLFTextShape
  18. slide.removeShape(txShape);
  19. }

其中 imageIndex 表示我图片流的位置,因为我兼容多张图片替换,所以根据查找到的图形的,依次替换。

XSLFAutoShape 表示,图形图片,例如以下我使用的图片,中间{pic}表示我要替换成图片的意思,详细看代码。

3.3、文本操作(略过)

4、问题汇总

  4.1、表格 setText  失败问题

    可能是因为 poi-ooxml-schemas.jar 包,出现bug 的问题。4.0版本以下poi-ooxml-schemas都出现setText 失败问题。4.0版本以上 可能是修复好了。

    4.1.1、解决方案有两种:

      ① 使用poi-ooxml-schemas 4.0以上版本

      ② 使用ooxml-schemas 版本,移除 poi-ooxml-schemas 版本 ,两个区别可以参考 第2标题。

  4.2、读取*.ppt失败

    XMLSlideShow slideShow = new XMLSlideShow(); //只支持读取pptx 文件。

4.3、关于setText 后文字样式失效问题

    解决方法:可以使用 把他转成xmlString ,并修改,修改后并重新set 进去

  1. private void setTextBox(XSLFTextBox textbox) {
  2.  
  3. String xml = textbox.getXmlObject().xmlText();
  4. // 使用freemarker 把xml的${...}数据替换,并返回替换后数据
  5. String tx =parsingText(xml,data);
  6. CTTableCell ctTableCell = null;
  7. try {
  8. //重新把xml set进去该tablecell
  9. ctTableCell = CTTableCell.Factory.parse(tx);
  10. textbox.getXmlObject().set(ctTableCell);
  11. } catch (XmlException e) {
  12. e.printStackTrace();
  13. }
  14.  
  15. }

5、文档资料

  [poi 官网] http://poi.apache.org/

  [poi 操作office说明] http://poi.apache.org/components/index.html

 [git项目]:https://code.aliyun.com/1003771635/document.git

  在子项目 pptXSLF 中。

6、个人说明

  如果你们发现其他问题或者解决方法,可以在评论区里提出。

关于java使用POI导出ppt ,其中表格setText 失败问题的更多相关文章

  1. java使用poi读取ppt文件和poi读取excel、word示例

    java使用poi读取ppt文件和poi读取excel.word示例 http://www.jb51.net/article/48092.htm

  2. Java之POI导出Excel(一):单sheet

    相信在大部分的web项目中都会有导出导入Excel的需求,今天我们就来看看如何用Java代码去实现 用POI导出Excel表格. 一.pom引用 pom文件中,添加以下依赖 查看代码  <!-- ...

  3. java利用poi来读取execl表格返回对象

    利用poi来读取execl表格,返回一个对象(可能有点不完善,但是应该能满足平常的所用),用到了反射等等; 使用的jar包有: commons-collections4-4.1.jar poi-3.1 ...

  4. java 使用POI导出百万级数据

    先看结果吧,这只是测试其中有很多因数影响了性能. 表总数为:7千多万,测试导出100万 表字段有17个字段 最终excel大小有60多兆 总耗时:126165毫秒 差不多2分多钟 其核心简单来说就是分 ...

  5. java解决poi导出excel文字水印,导出excel不可操作问题

    首先需求是用户提出导出excel数据需使用水印备注其用途: 其实就是在导出excel的同时带有自定义文字水印的导出. 那么我们首先想到的肯定是以一个什么样的思路去解决该问题,首先查找poi导出exce ...

  6. java使用poi导出excel

    继上一篇导出pdf,这篇导出excel. 1.导入依赖 <dependency> <groupId>org.apache.poi</groupId> <art ...

  7. Java使用POI导出excel(下)——实例与小技巧

    [更新]:thinkgem的导出工具类: /** * Copyright © 2012-2016 <a href="https://github.com/thinkgem/jeesit ...

  8. POI导出PPT

    1.null <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> <g ...

  9. JAVA 使用POI导出数据格式为Execl

    需要下载一个poi的jar包. 控制器 @Override public void getContractListExecl(Contract contract, BindingResult resu ...

随机推荐

  1. 前端AES解密

    使用插件Crypto.JS 安装 npm install --save_dev crypto-js // 导入 crypto-js 包 import CryptoJS from 'crypto-js/ ...

  2. 学习笔记TF058:人脸识别

    人脸识别,基于人脸部特征信息识别身份的生物识别技术.摄像机.摄像头采集人脸图像或视频流,自动检测.跟踪图像中人脸,做脸部相关技术处理,人脸检测.人脸关键点检测.人脸验证等.<麻省理工科技评论&g ...

  3. SP3871 GCDEX - GCD Extreme

    //author Eterna #define Hello the_cruel_world! #pragma GCC optimize(2) #include<iostream> #inc ...

  4. C51单片机_day_01(定时器和中断系统)

                c51单片机 51单片机是控制电路系统的开关,当然芯片就是51芯片,现在随着科技的发展,也是出了很多,功能更多,更全的芯片. 51是用c语言做为程序编程的语言 ——我对基本基础 ...

  5. Android L2TP Client Setup

    原文链接:http://www.softether.org/4-docs/2-howto/9.L2TPIPsec_Setup_Guide_for_SoftEther_VPN_Server/3.Andr ...

  6. linux子系统ubuntu16.04安装使用xrdp当远程桌面

    参考文献:https://icytown.com/windows/windows-subsystem-for-linux-gui-xubuntu/ https://jingyan.baidu.com/ ...

  7. Django学习笔记之验证和授权

    验证和授权概述 Django有一个内置的授权系统.他用来处理用户.分组.权限以及基于cookie的会话系统.Django的授权系统包括验证和授权两个部分.验证是验证这个用户是否是他声称的人(比如用户名 ...

  8. 未能加载文件或程序集“SuperMap.Mapping, Version=7.0.0.0, Culture=neutral, PublicKeyToken=0635c574ea890381”或它的某一个依赖项。试图加载格式不正确的程序。

    开发SuperMap.Mapping的时候,蹦出来的错误!让人摸不着头脑.查找原因如下: (1)安装32位的super map iobject后,进行开发,vs上选择目标平台是x86位的,然后从控件列 ...

  9. 关于memset的错误使用

    我们在使用memset进行初始化的时候,经常会使用这种方式,memset(a,0,sizeof(a)),这让我们误以为将其初始化其他值也可以,实际是错误的. void print_arr(unsign ...

  10. CentOS7.4下部署hadoop3.1.1

    CentOS7.4下部署hadoop3.1.1 契机 由于工作原因要部署hadoop的集群,习惯使用最新的稳定版本2018年的时候由于时间紧破部署了2.7.2版本,最新由于又要部署有研究了一下3.x的 ...