替换doc文件中的字符串后,Apache POI破坏了目录

时间:2018-07-23 21:16:20

标签: apache-poi doc tableofcontents

我必须替换* .doc文件中的一些字符串。 (我知道使用* .docx会更容易。)当我执行多个操作时,请更换目录损害赔偿。有没有办法保存目录?

我有两段代码,似乎可以创建相同的输出。

更快的代码:

Map<String, String> items = new HashMap<>();
items.put("toreplace1", "replacement1");
items.put("toreplace2", "replacement2");
try (POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("c:\\doc\\mydocument.doc")); HWPFDocument doc = new HWPFDocument(fs);) {
    Range r1 = doc.getRange();
    items.forEach((k, v) -> {
        for (int i = 0; i < r1.numSections(); ++i) {
            Section s = r1.getSection(i);
            for (int x = 0; x < s.numParagraphs(); x++) {
                Paragraph p = s.getParagraph(x);
                for (int z = 0; z < p.numCharacterRuns(); z++) {
                    CharacterRun run = p.getCharacterRun(z);
                    String text = run.text();
                    if (text.contains(k)) {
                        run.replaceText(k, v);
                    }
                }
            }
        }
    });
    doc.write(new FileOutputStream(new File("c:\\doc\\mydocument_replaced.doc")));
}

较慢的代码:

Map<String, String> items = new HashMap<>();
items.put("toreplace1", "replacement1");
items.put("toreplace2", "replacement2");
try (HWPFDocument doc = new HWPFDocument(new FileInputStream(new File("c:\\doc\\mydocument.doc")))) {
    Range range = doc.getRange();
    items.forEach((k, v) -> {
        range.replaceText(k, v);
    });
    doc.write(new FileOutputStream(new File("c:\\doc\\mydocument_replaced.doc")));
}

1 个答案:

答案 0 :(得分:0)

为避免损坏_model字段(_dataService也是一个字段),可以将替换限制为仅对字段外部的文档零件进行限制。

字段始终以包含字节Word的运行开始,并以包含字节TOC的运行结束。因此,以下代码应仅将替换内容限制为仅在字段外部记录零件。使用此代码,应避免损坏0x13。但是当然0x15不会是最新的,必须手动更新( Ctrl + A ,然后是 F9 )。

TOC