使用POI进行Word操作(一)
本文于 354 天之前发表,文中内容可能已经过时。
操作步骤
- 步骤一:引用相关POI库
- 步骤二:创建POI中的word文件对象
- 步骤三:调用word文件对象的方法对文件进行操作
步骤一:引用相关的POI库
吐槽一下,这一步是最坑的
本人尝试了很多版本组合,最新的版本提示class重复引用。老的版本又有存在图片插入后损坏文件。本人把能用的放在后面
加载方式 | 效果 |
---|---|
通过gradle引用3.14poi | 使用javatest能够通过,但在编译apk时提示重复类 |
加载最新的5.1poi包 | 提示无法找到一些java类 |
加载3.8的poi包及java包 | 添加图片时,导致docx文件异常 |
通过gradle混合加载版本 | 能够使用 |
错误引用1-生成app提示类重复
1 | implementation 'org.apache.poi:poi-ooxml:3.14' |
错误引用2-添加图片时doc错误
目前采用直接加载jar包的方式,引用库加载文件如下:
1 | implementation files('libs/poi-3.8-20120326.jar') |
正确引用-混合版本加载
1 | implementation group: 'org.apache.poi', name: 'poi-ooxml', version: '3.17' |
步骤二:创建POI对应的Document对象
首先区别你要加载的word后缀,是
.doc
还是.docx
,因为这两个所创建的对象不一样,如果不对号入座则会报错
org.apache.poi.POIXMLException: org.apache.poi.openxml4j.exceptions.InvalidFormatException: Package should contain a content type part [M1.13]
文件后缀 | 创建对象 |
---|---|
doc |
HWPFDocument |
docx |
XWPFDocument |
由于doc
是2003年的word版本,此处暂时略过。主要使用docx
进行作业
步骤三:文件操作
获取主要信息
读取字段信息
1 | // 段落,一般只文字内容,图片表格等其他字符,会作为空字符 |
编辑文档内容(覆盖和添加)
- 注意使用POI的修改操作比较繁琐,建议直接准备一个空文件进行填充
- 编辑和修改都最好不要对源文件进行修改,而是在修改后通过一个输出流程,将修改后的文件输出
- 默认所有的操作,最后都有调用 doc.write(out);
(一) 文字修改
操作步骤
- 遍历所有的
XWPFParagraph
,并查找其中是否有自己需要修改的内容- 遍历该
XWPFParagraph
中的XWPFRun
,调用toString()
方法查看是否为需要修改的内容- 使用
run.setText("修改内容", 0)
方法修改
1 | List<XWPFParagraph> paragraphs = doc.getParagraphs(); |
注意:
- 一定要添加第二个参数
0
,否则会变成插入操作 - 需要查找的内容不要增加特殊符号,特殊符号会被识别为单独的
XWPFRun
对象
(二) 表格修改
操作步骤
- 确定需要处理的表格是第几个
- 根据确定需要编辑的数据在第几行,第几列后,通过
XWPFTable
->XWPFTableRow
->CTRow
->XWPFTableCell
- 在获取到
XWPFTableCell
后调用
1 | //表格 |
注意:
- 若担心异常退出,可以做一些长度限制,通过
table.getRows();
,然后每一行的row.getCtRow()sizeOfTcArray();
判断列数
(三) 图片插入
此处默认在最后插入图片,插入图片的方式是通过输入流的方式插入
1 | XWPFRun run = doc.createParagraph().createRun(); |
注意:
插入图片打开word出现错误,则需要升级poi版本。目前可以使用的我已经上传在最上面的下载地址了
![](./2021-04-03_234422.png) 导入图片打开提示错误 插入图片的宽和高,一定要使用
Units.toEMU
方法,并传入想要显示的宽和高。直接传入宽和高无法显示