Apache POI 5.2.2 中使用getFldSimpleList()方法替换getFieldList()方法

在 Apache POI 5.2.2 版本中,getFieldList() 方法已被移除。您可以使用getFldSimpleList()方法来替代。

问题:

以下代码在 Apache POI 5.2.2 版本中会报错:java: 找不到符号 符号: 方法 getFieldList() 位置: 接口 org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR

package word;

import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSimpleField;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.List;

public class Word {
    public static void main(String[] args) {
        try {
            // 打开输入文档1
            XWPFDocument inputDoc1 = new XWPFDocument(new FileInputStream("input01.docx"));

            // 打开输入文档2
            XWPFDocument inputDoc2 = new XWPFDocument(new FileInputStream("input02.docx"));

            // 创建输出文档
            XWPFDocument outputDoc = new XWPFDocument();

            // 复制输入文档1的内容到输出文档
            copyDocumentContent(inputDoc1, outputDoc);

            // 复制输入文档1中指定书签的内容到输出文档
            copyBookmarkContent('应变计', inputDoc1, outputDoc);

            // 复制输入文档2中指定书签的内容到输出文档
            copyBookmarkContent('位移计', inputDoc2, outputDoc);

            // 保存输出文档
            FileOutputStream out = new FileOutputStream("input04.docx");
            outputDoc.write(out);
            out.close();

            System.out.println("复制完成");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 复制文档内容
    private static void copyDocumentContent(XWPFDocument sourceDoc, XWPFDocument targetDoc) {
        for (IBodyElement element : sourceDoc.getBodyElements()) {
            if (element instanceof XWPFParagraph) {
                XWPFParagraph paragraph = (XWPFParagraph) element;
                targetDoc.createParagraph().createRun().setText(paragraph.getText());
            } else if (element instanceof XWPFTable) {
                XWPFTable table = (XWPFTable) element;
                targetDoc.createTable().getCTTbl().setTblPr(table.getCTTbl().getTblPr());
            }
        }
    }

    // 复制书签内容
    private static void copyBookmarkContent(String bookmarkName, XWPFDocument sourceDoc, XWPFDocument targetDoc) {
        for (XWPFParagraph paragraph : sourceDoc.getParagraphs()) {
            for (XWPFRun run : paragraph.getRuns()) {
                List<CTSimpleField> fields = run.getCTR().getFieldList(); // 报错
                for (CTSimpleField field : fields) {
                    if (field.getInstr().contains(' FORMTEXT ')) {
                        String fieldValue = field.getInstr().split('"')[1];
                        if (fieldValue.equals(bookmarkName)) {
                            targetDoc.createParagraph().createRun().setText(paragraph.getText());
                            break;
                        }
                    }
                }
            }
        }
    }
}

解决办法:

请将以下代码替换copyBookmarkContent()方法中的相应部分:

private static void copyBookmarkContent(String bookmarkName, XWPFDocument sourceDoc, XWPFDocument targetDoc) {
    for (XWPFParagraph paragraph : sourceDoc.getParagraphs()) {
        for (XWPFRun run : paragraph.getRuns()) {
            List<CTSimpleField> fields = run.getCTR().getFldSimpleList();
            for (CTSimpleField field : fields) {
                if (field.getInstr().contains(' FORMTEXT ')) {
                    String fieldValue = field.getInstr().split('"')[1];
                    if (fieldValue.equals(bookmarkName)) {
                        targetDoc.createParagraph().createRun().setText(paragraph.getText());
                        break;
                    }
                }
            }
        }
    }
}

这样就可以解决找不到getFieldList()方法的问题。

注意:

在使用 Apache POI 时,建议您使用最新版本,并参考官方文档进行学习。

更多信息:

Apache POI 5.2.2中使用`getFldSimpleList()`方法替换`getFieldList()`方法

原文地址: https://www.cveoy.top/t/topic/fKIX 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录