关于java使用POI导出ppt ,其中表格setText 失败问题
1、导出ppt 必要的包
使用maven
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
<exclusions>
<exclusion>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
<version>1.1</version>
</dependency>
2、poi-ooxml-schemas 和 ooxml-schemas 的区别
http://blog.sina.com.cn/s/blog_801b121d0102x3fa.html
3、应用
3.1、表格操作
public void parsing(XSLFSlide slide, XSLFTable table) {
//for循环增加数据,忽略标题行
List<XSLFTableRow> tableRow = table.getRows();
List<XSLFTableCell> cells = tableRow.get(1).getCells(); while(table.getRows().size()<tableData.getRows()){
XSLFTableRow row = table.addRow();
for (int i1 = 0; i1 < cells.size(); i1++) {
row.addCell(); } } for (int i = 0; i < tableData.getRows(); i++) {
for (int i1 = 0; i1 < tableData.get(i).size(); i1++) {
String key = tableData.get(i).get(i1);
if(table.getRows().get(i + 1).getCells().size()<i1+1){
table.getRows().get(i + 1).addCell();
}
table.getRows().get(i + 1).getCells().get(i1).setText(key);
}
} }
3.2、替换图片操作
插入图片自己查资料,这里不提
这里只说读取模板ppt,并替换特定区域成图片。
if(shape[i] instanceof XSLFAutoShape){
XSLFAutoShape txShape = (XSLFAutoShape) shape[i];
if (txShape.getText().contains("{pic}")) {
byte[] pictureData = new byte[0];
try {
if(imageIndex>inputStreamList.size()-1){
continue;
}
pictureData = IOUtils.toByteArray(inputStreamList.get(imageIndex++));
} catch (IOException e) {
e.printStackTrace();
}
int idx = slide.getSlideShow().addPicture(pictureData, XSLFPictureData.PICTURE_TYPE_PNG);
XSLFPictureShape pic = slide.createPicture(idx);
// 设置XSLFPictureShape的位置信息
pic.setAnchor(txShape.getAnchor());
// 移除XSLFTextShape
slide.removeShape(txShape);
}
其中 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 进去
private void setTextBox(XSLFTextBox textbox) { String xml = textbox.getXmlObject().xmlText();
// 使用freemarker 把xml的${...}数据替换,并返回替换后数据
String tx =parsingText(xml,data);
CTTableCell ctTableCell = null;
try {
//重新把xml set进去该tablecell
ctTableCell = CTTableCell.Factory.parse(tx);
textbox.getXmlObject().set(ctTableCell);
} catch (XmlException e) {
e.printStackTrace();
} }
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 失败问题的更多相关文章
- java使用poi读取ppt文件和poi读取excel、word示例
java使用poi读取ppt文件和poi读取excel.word示例 http://www.jb51.net/article/48092.htm
- Java之POI导出Excel(一):单sheet
相信在大部分的web项目中都会有导出导入Excel的需求,今天我们就来看看如何用Java代码去实现 用POI导出Excel表格. 一.pom引用 pom文件中,添加以下依赖 查看代码 <!-- ...
- java利用poi来读取execl表格返回对象
利用poi来读取execl表格,返回一个对象(可能有点不完善,但是应该能满足平常的所用),用到了反射等等; 使用的jar包有: commons-collections4-4.1.jar poi-3.1 ...
- java 使用POI导出百万级数据
先看结果吧,这只是测试其中有很多因数影响了性能. 表总数为:7千多万,测试导出100万 表字段有17个字段 最终excel大小有60多兆 总耗时:126165毫秒 差不多2分多钟 其核心简单来说就是分 ...
- java解决poi导出excel文字水印,导出excel不可操作问题
首先需求是用户提出导出excel数据需使用水印备注其用途: 其实就是在导出excel的同时带有自定义文字水印的导出. 那么我们首先想到的肯定是以一个什么样的思路去解决该问题,首先查找poi导出exce ...
- java使用poi导出excel
继上一篇导出pdf,这篇导出excel. 1.导入依赖 <dependency> <groupId>org.apache.poi</groupId> <art ...
- Java使用POI导出excel(下)——实例与小技巧
[更新]:thinkgem的导出工具类: /** * Copyright © 2012-2016 <a href="https://github.com/thinkgem/jeesit ...
- POI导出PPT
1.null <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> <g ...
- JAVA 使用POI导出数据格式为Execl
需要下载一个poi的jar包. 控制器 @Override public void getContractListExecl(Contract contract, BindingResult resu ...
随机推荐
- Exp2 后门原理与实践 毛瀚逸 20164318
Exp2 后门原理与实践 20164318 毛瀚逸 一.实验内容 基础问题回答: 1.例举你能想到的一个后门进入到你系统中的可能方式? 答:下载奇怪的文件并运行,通过操作系统的漏洞来获取电脑的高级权限 ...
- hibernate的lazy初始化结果
package com.ehcache; import java.io.Serializable; public class User implements Serializable{ private ...
- Linux下的常用文本编辑器
Linux的文本编辑器 ed 在早期的unix平台上,ed可以说是唯一的编辑工具.它是一个很古老的行编辑器,vi这些编辑器都是从ed 演化而来.行编辑器使用起来很不方便,每次只能对一行进行操作,.而后 ...
- celery+RabbitMQ 实战记录2—工程化使用
上篇文章中,已经介绍了celery和RabbitMQ的安装以及基本用法. 本文将从工程的角度介绍如何使用celery. 1.配置和启动RabbitMQ 请参考celery+RabbitMQ实战记录. ...
- Redis类的源码使用
$redis = new Redis(); //连接redis服务器 $redis->connect('127.0.0.1', '6379'); $key = "key"; ...
- Linux DNS 服务器安装、配置和维护
每个 IP 地址都可以有一个主机名,主机名由一个或多个字符串组成,字符串之间用小数点隔开.有了主机名,就不要死记硬背每台 IP 设备的 IP 地址,只要记住相对直观有意义的主机名就行了.这就是 DNS ...
- 高度自适应的div
需求:有一个高度自适应的div,里面有两个div,一个高度100px,希望另一个填满剩下的高度 1.用flex 来实现 思路:flex 垂直布局(column),第一个元素固定高度,第二个元素flex ...
- 语音通信中终端上的时延(latency)及减小方法
时延是语音通信中的一个重要指标,当端到端(end2end)的时延(即one-way-delay,单向时延)低于150Ms时人感觉不到,当端到端的时延超过150Ms且小于450Ms时人能感受到但能忍受不 ...
- Xorboot-UEFI新手入门教程
Xorboot-UEFI新手入门教程 Xorboot-UEFI是一款UEFI下轻量级的图形化多系统引导程序,pauly于2014年国庆节期间发布了预览版.搜了下论坛,关于Xorboot- ...
- 利用rman duplicate重建oracle dataguard standby数据库
问题背景 适用情况: 操作系统: redhat 6.5 数据库: oracle 11g r2 问题描述: failover后原主库无法恢复和启动或者丢失主备关系 优点 不需要对primary数据库停机 ...