【发布时间】:2018-07-23 21:16:20
【问题描述】:
我必须替换 *.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")));
}
【问题讨论】:
-
如果字符串“toreplace1”包含在目录中使用的标题中,则这是可重现的。即使只有一个字符串将被替换,它也会发生。但是由于二进制文件格式
HWPF确实是HorribleWordP处理器F格式,最好您可以选择向apache poi提交错误报告。与您的两个代码中较短的一个一起执行此操作,并提供一个示例mydocument.doc。
标签: apache-poi doc tableofcontents