当前位置: 首页 > 知识库问答 >
问题:

如何用docx4j替换Ms word中的文本/合并字段

上官恩
2023-03-14

我正试图从word文档中替换文本或合并字段。我发现我可以为此使用docx4j。

String docxFile = "C:/Users/admin/Desktop/HelloWorld.docx";

WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage
            .load(new java.io.File(docxFile));

HashMap<String, String> mappings = new HashMap<String, String>();
mappings.put("Hello", "salutation");
//mappings.put("salutation", "myLastname");
//mappings.put("Salutation", "myFirstName");
//mappings.put("myLastName", "Salutation");

MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();

// Approach 2 (original)

// unmarshallFromTemplate requires string input
String xml = XmlUtils.marshaltoString(documentPart.getJaxbElement(),
            true);
// Do it...
Object obj = XmlUtils.unmarshallFromTemplate(xml, mappings);
// Inject result into docx
documentPart.setJaxbElement((Document) obj);


wordMLPackage.save(new java.io.File(
            "C:/Users/admin/Desktop/OUT_SIMPLE.docx"));

我阅读了docx4j的文档和其他一些相关文章,如docx4j-如何用值替换占位符。但是,我似乎不能正确地理解文档和帖子来解决这个问题。

共有1个答案

东方弘壮
2023-03-14

请试用以下代码片段:

public static void main(String[] args) throws Exception {

    String docxFile = "template.docx";

    WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new java.io.File(docxFile));

    List<Map<DataFieldName, String>> data = new ArrayList<Map<DataFieldName, String>>();

    Map<DataFieldName, String> item = new HashMap<DataFieldName, String>();
    item.put(new DataFieldName("@name"), "myFirstname");
    item.put(new DataFieldName("@lastname"), "myLastname");
    data.add(item);

    org.docx4j.model.fields.merge.MailMerger.setMERGEFIELDInOutput(OutputField.KEEP_MERGEFIELD);

    org.docx4j.model.fields.merge.MailMerger.performMerge(wordMLPackage, item, true);

    wordMLPackage.save(new java.io.File("OUT.docx"));

}
 类似资料:
  • 编辑:我发现如果我向UnmarshallFromTemplate.docx添加一些文本并保存它,它不会替换新的文本行。-标记以某种方式拆分为多个标记: 编辑document.xml中的文本并添加缺少的信息没有多大帮助。 编辑2: 伙计们。我找到了一个非常适合自己的解决办法,不知道为什么花了这么长时间才弄明白。正如我所说的:运行在哪里分裂,原因是在我看来是${}。因此,我只是在占位符之前使用了一个#

  • 我有一个与XPages-docx4j类似的问题,用文本替换书签,但我想保留样式。我的书签不在文本上(因为它是由Google Docs创建的docx),我想保留书签后面的文本,以便将其包含在书签中并保持其样式。例如: 我找到了删除书签后文本的解决方案,我找到了在书签内添加文本的解决方法,但我无法保留样式。 我不是以英语为母语的人,所以如果我不清楚,请毫不犹豫地问我。

  • 我一直在尝试通过FieldMailMerge和VariableReplace示例,但似乎无法运行本地测试用例。我基本上试图从一个docx模板文档开始,并让它从一个模板创建x个docx文档,替换变量。 在下面的代码中,试图替换单个变量,但失败了。模板文件中的${}值作为处理的一部分被移除,因此我认为它正在查找它们,而不是出于某种原因替换它们。我明白这可能是由于格式问题,正如示例代码的注释中所解释的那

  • 问题内容: 在表的一个特定字段中将进行文本搜索和替换的是哪种MySQL查询? 即搜索并替换为具有值的字段的记录变为。 问题答案: 更改并匹配您的表名和相关字段: 替换(字符串函数) INSTR(字符串函数)

  • 问题内容: 在同一页面中提到的oodocx模块会将用户引向一个似乎不存在的/ examples文件夹。 我已经阅读了python-docx 0.7.2的文档,以及在上可以找到的所有内容,因此请相信我已经完成了“作业”。 Python是我所知道的唯一语言(初学者+,也许是中级),所以请不要假定对C,Unix,xml等有任何了解。 任务:打开其中包含一行文本的ms-word 2007+文档(为简单起见

  • 我可以添加文本和段落到word中,也可以用文本替换任何合并字段,但我需要添加一个新的合并字段使用docx4j来创建一个word模板。我怎么能这么做? 是否使用添加合并字段。如果是,怎么做? 从这里我可以看到MergeField在xml元素w:fldsimple中,所以我可能需要像这样创建这个xml: 任何帮助都是非常感谢的!