1

我在一个 word 文件中有一些标签,看起来像<tag>.
现在我使用 docx4j 获取 Word 文件的内容并遍历每一行并搜索此标签。当我找到一个时,我用一个字符串替换它。但是我试过的这段代码不起作用,现在我真的不知道我怎么能实现它!

这是我已经尝试过的代码:

WordprocessingMLPackage wpml = WordprocessingMLPackage.load(new File(path));

MainDocumentPart mdp = wpml.getMainDocumentPart();

List<Object> content = mdp.getContent();
String line;
for (Object object : content) {
    line = object.toString();
    if (line.contains("<tag>")) {
        line.replace("<tag>", "<newTag>");
    }
}

任何提示或解决方案如何实现它?

4

4 回答 4

1

你的问题之一是你修改String line它对任何东西都没有影响。line.replace("<tag>", "<newTag>");此操作的结果被忽略。你肯定想用那个做某事,对吧?

此外,如果object您的循环中不是 instaneOf String,则lineobject指向不同的对象。

您需要修改内容,但不是您这样做的方式。请阅读入门

源代码下载部分还有很多示例(示例代码)

如果您在阅读入门指南后有任何具体问题,我们很乐意为您提供帮助。

于 2013-07-05T10:23:39.350 回答
1

您列表中的内容将是 org.docx4j.wml.P(段落)或 Tbl(表格)或其他块级内容。

段落包含运行,而运行又包含实际文本。

有关执行您想要执行的操作的建议方法,请参阅 VariableReplace 示例。

更好的是,考虑内容控制数据绑定。

否则,如果您想推出自己的方法,请参阅入门指南了解如何遍历或使用 JAXB 级别的 XPath。

于 2013-07-05T23:59:23.110 回答
0

首先,您应该使用replaceAll()而不是replace().

然后您应该将此字符串存储到一个对象中,您可以在修改 Word 文件后将其序列化回来。

此外,我认为处理结束标签(如果有的话)也会很好......

于 2013-07-05T10:27:30.963 回答
0

字符串(行)是不可变的,因此replace("<tag>", "<newTag>")不会修改您的line它会创建一个新的修改过的字符串。

你的代码应该做这样的事情:

for (Object object : content) {
    line = object.toString();
    if (line.contains("<tag>")) {
       line= line.replaceAll("<tag>", "<newTag>");
    }
    writeLineToNewFile(line);
}

或更短:

for (Object object : content) {
      writeLineToNewFile(object.toString().replace("<tag>", "<newTag>");
}
于 2013-07-05T10:30:24.757 回答