使用自定义属性读写MS Word文档?

时间:2018-10-04 19:37:05

标签: java ms-word docx4j

我正在使用以下代码使用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

任何人都可以为我提供一些解决方案或替代方法,以帮助我完成它。感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

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

要在Word(最新版本)中设置docx,请首先启用“开发人员”菜单(如果尚未启用)。

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

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

您将在docx中看到它。

尽管XML Mapping Pane不包含“自定义”属性,所以您不能轻易地将它们添加到文档中。

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

可以使用docx4j Helper Word插件或docx4j Web应用程序从示例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