Android使用POI进行Word操作(一)

2,166 阅读3分钟

操作步骤

  1. 步骤一:引用相关POI库
  2. 步骤二:创建POI中的word文件对象
  3. 步骤三:调用word文件对象的方法对文件进行操作

步骤一:引用相关的POI库

吐槽一下,这一步是最坑的 本人尝试了很多版本组合,最新的版本提示class重复引用。老的版本又有存在图片插入后损坏文件。本人把能用的放在后面

加载方式效果
通过gradle引用3.14poi使用javatest能够通过,但在编译apk时提示重复类
加载最新的5.1poi包提示无法找到一些java类
加载3.8的poi包及java包添加图片时,导致docx文件异常
通过gradle混合加载版本能够使用

错误引用1-生成app提示类重复

    implementation 'org.apache.poi:poi-ooxml:3.14'
    implementation 'org.apache.poi:poi-excelant:3.14'
    implementation 'org.apache.poi:poi-examples:3.14'
    implementation 'org.apache.xmlbeans:xmlbeans:2.6.0'

类重复导入

错误引用2-添加图片时doc错误

目前采用直接加载jar包的方式,引用库加载文件如下:

    implementation files('libs/poi-3.8-20120326.jar')
    implementation files('libs/poi-ooxml-3.8-20120326.jar')
    implementation files('libs/poi-ooxml-schemas-3.8-20120326.jar')
    implementation files('libs/xmlbeans-2.3.0.jar')
    implementation files('libs/commons-logging-1.1.jar')
    implementation files('libs/dom4j-1.6.1.jar')
    implementation files('libs/stax-api-1.0.1.jar')

正确引用-混合版本加载

    implementation group: 'org.apache.poi', name: 'poi-ooxml', version: '3.17'
    implementation group: 'org.apache.xmlbeans', name: 'xmlbeans', version: '3.1.0'
    implementation 'javax.xml.stream:stax-api:1.0'
    implementation 'com.fasterxml:aalto-xml:1.2.2'

步骤二:创建POI对应的Document对象

首先区别你要加载的word后缀,是.doc还是.docx,因为这两个所创建的对象不一样,如果不对号入座则会报错

org.apache.poi.POIXMLException: org.apache.poi.openxml4j.exceptions.InvalidFormatException: Package should contain a content type part [M1.13]

文件后缀创建对象
docHWPFDocument
docxXWPFDocument

由于doc是2003年的word版本,此处暂时略过。主要使用docx进行作业

步骤三:文件操作

在这里插入图片描述

文章类结构

获取主要信息

读取字段信息

            // 段落,一般只文字内容,图片表格等其他字符,会作为空字符
            List<XWPFParagraph> paragraphs = doc.getParagraphs();
            // 表格,整文档中的所有表格
            List<XWPFTable> tables = doc.getTables();
            // 图片,获取的都是byte[]
            List<XWPFPictureData> allPictures = doc.getAllPictures();
            // 页眉,只能获取不同内容的页眉
            List<XWPFHeader> headerList = doc.getHeaderList();
            // 页脚,注意自动生成的编号不会被获取到,只能获取不同类型的页脚
            List<XWPFFooter> footerList = doc.getFooterList();


编辑文档内容(覆盖和添加)

  1. 注意使用POI的修改操作比较繁琐,建议直接准备一个空文件进行填充
  2. 编辑和修改都最好不要对源文件进行修改,而是在修改后通过一个输出流程,将修改后的文件输出
  3. 默认所有的操作,最后都有调用 doc.write(out);

(一) 文字修改

操作步骤

  1. 遍历所有的XWPFParagraph,并查找其中是否有自己需要修改的内容
  2. 遍历该XWPFParagraph中的XWPFRun,调用toString()方法查看是否为需要修改的内容
  3. 使用run.setText("修改内容", 0)方法修改
       List<XWPFParagraph> paragraphs = doc.getParagraphs();
            for (int i = 0; i < paragraphs.size(); i++) {
                XWPFParagraph para = paragraphs.get(i);
                String text = para.getText();
                if (!TextUtils.isEmpty(text)) {
                    index = text.indexOf(GOAL);
                    if (index != -1) {
                        List<XWPFRun> runs = para.getRuns();
                        for (XWPFRun run : runs) {
                            if (run.toString().equals("GOAL")) {
                                run.setText("修改内容", 0);
                            }
                        }
                    }
                }

            }

注意:

  1. 一定要添加第二个参数0,否则会变成插入操作
  2. 需要查找的内容不要增加特殊符号,特殊符号会被识别为单独的XWPFRun对象

(二) 表格修改

操作步骤

  1. 确定需要处理的表格是第几个
  2. 根据确定需要编辑的数据在第几行,第几列后,通过XWPFTable->XWPFTableRow->CTRow->XWPFTableCell
  3. 在获取到XWPFTableCell后调用
    		//表格
            List<XWPFTable> tables = doc.getTables();
            XWPFTable table = tables.get(0);
            table.getRow(0).getCell(1).setText("LJJ");
            table.getRow(1).getCell(1).setText("29");
            table.getRow(2).getCell(1).setText("地球");

注意:

  1. 若担心异常退出,可以做一些长度限制,通过table.getRows();,然后每一行的row.getCtRow()sizeOfTcArray();判断列数

(三) 图片插入

此处默认在最后插入图片,插入图片的方式是通过输入流的方式插入

XWPFRun run = doc.createParagraph().createRun();
            FileInputStream picIn = new FileInputStream(new File(picPath));
            run.addPicture(picIn, XWPFDocument.PICTURE_TYPE_PNG, "插入图片", Units.toEMU(256), Units.toEMU(256));
            FileUtils.close(picIn);

注意:

  1. 插入图片打开word出现错误,则需要升级poi版本。目前可以使用的我已经上传在最上面的下载地址了

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

导入图片打开提示错误
  1. 插入图片的宽和高,一定要使用Units.toEMU方法,并传入想要显示的宽和高。直接传入宽和高无法显示

效果图

在这里插入图片描述

原始内容

在这里插入图片描述

输出内容

在这里插入图片描述

原始文章位置