【问题标题】:Read & Write MS word document using custom properties?使用自定义属性读写 MS Word 文档?
【发布时间】:2019-03-10 06:34:30
【问题描述】:

我正在使用下面的代码使用docx4j 生成带有 HTML 内容的 word 文档,并且能够成功生成文档。

我的要求是编写带有一些自定义属性的内容,这样用户修改后可以很容易地阅读相同的文档。

String finalData = "<h1> Heading One </h1>".aapend("<h2> Heading two </h2>");

String str1 = new StringBuffer()
                .append("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html;
                charset=UTF-8\" /><style type='text/css'> 
                * { font-family: 'Arial Unicode MS'; } </style></head>")
                .append(finalData).append("</html>").toString();


        str1 = fixWhitespaceIssue(str1);
        str1 = cleanHTML(str1);
        
        System.out.println(str1);
        WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
        XHTMLImporterImpl XHTMLImporter = new XHTMLImporterImpl(wordMLPackage);
        XHTMLImporter.setRunFormatting(FormattingOption.CLASS_PLUS_OTHER);
        NumberingDefinitionsPart ndp = new NumberingDefinitionsPart();
        wordMLPackage.getMainDocumentPart().addTargetPart(ndp);
        ndp.unmarshalDefaultNumbering();
        wordMLPackage.getMainDocumentPart().getContent().addAll(XHTMLImporter.convert(str1, null));
        File exportFile = new File("test.docx");
        wordMLPackage.save(exportFile);

例如:

<h1> Heading One </h1> // i'll bind custom property for first element as c_property1
<h2> Heading two </h2> // i'll use custom property for second element as c_property2

生成的文档可以由某些用户查看,之后他会进行一些更改,之后相同的更新文档将出现在我的代码中,因此代码必须能够使用自定义属性读取文档。

如果我想从文档中提取更新的值,所以我只想提供自定义属性,那么它应该返回其关联值。

对于c_property1,代码应返回Heading One 或更新值,例如Updated Heading One.

对于c_property2,代码应返回Heading two 或更新值,例如Updated Heading two.

【问题讨论】:

  • 我建议您研究Content controls 的概念。这些可以链接到Custom XML Part,以便将控件的内容保存到XML 文件(自定义XML 部分)。然后您的代码可以读取 XML 文件。
  • @CindyMeister 感谢您的评论,您能分享一些示例或任何参考链接吗?
  • 澄清一下,您可以将内容控件绑定到标准属性部分之一,因此不需要额外的自定义 xml 部分。我会看看我是否能在第二天左右找到一个例子。
  • @JasonPlutext 谢谢哥们,等待您的回复,提供一些示例参考。

标签: java ms-word docx4j


【解决方案1】:

TLDR:您可以使用 docx4j 的 FieldUpdater 从您的自定义属性更新文档表面,但您需要编写一些代码将合适的 DOCPROPERTY 字段放入 docx(即在您的情况下,将 XHTML 转换为 docx 之后)。

内容控件对自定义属性没有帮助

要设置您的 docx,在 Word(最新版本)中,首先启用“开发人员”菜单(如果您还没有这样做的话)。

单击“XML 映射窗格”。出现的任务窗格允许您从“核心”或“扩展”属性中进行选择。

右键单击感兴趣的属性; “插入内容控制”>“纯文本”。

你会在你的文档中看到这个。

XML 映射窗格不包含“自定义”属性,因此您无法通过这种方式轻松地将这些属性添加到文档中。

另外,您正在从 XHTML 创建您的 docx,所以我猜您需要一个编程解决方案,用于将某些特定标签转换为绑定到自定义属性部分的内容控件。

可以使用 Docx4j Helper Word AddIn 或 docx4j webapp 从示例 docx 生成用于创建内容控件的 Java 代码。

您必须通过 ItemID 将您的内容控件绑定到 CutomXML 部件。某些自定义 xml 部分是“众所周知的”:https://msdn.microsoft.com/en-us/library/ff531265(v=office.12).aspx

当我绑定核心属性时,它使用 w:storeItemID="{6C3C8BC8-F283-45AE-878A-BAB7291924A1}"

但是没有用于自定义属性的 storeItemID?

https://social.msdn.microsoft.com/Forums/office/en-US/c7e66714-3224-4298-8673-1ce095db092a/how-to-create-databinding-between-custom-property-value-and-content-control-such-as-text?forum=oxmlsdk

您可以尝试将 itemProps 部分添加到自定义属性部分,但我怀疑它会起作用!

因此,如果您真的想通过内容控件方法使用自定义属性,则需要稍微修改 docx4j 以绑定它们。

DOCPROPERTY 字段的救援

但有一种旧方法可用:您可以使用指向自定义属性的 DOCPROPERTY 字段。

而且 docx4j 的 DocPropertyResolver 知道如何处理这些。请参阅 FieldUpdater:https://github.com/plutext/docx4j/blob/master/src/main/java/org/docx4j/model/fields/FieldUpdater.java。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    相关资源
    最近更新 更多