Docx4j 从一个 .docx 导出样式并在另一个 .docx 中使用它

Docx4j export style from one .docx and use it in another .docx

我正在使用以下代码创建新的 Word 文档:

Tidy tidy = new Tidy();
            tidy.setShowWarnings(true);
            tidy.setInputEncoding("UTF-8");
            tidy.setOutputEncoding("UTF-8");
            tidy.setXHTML(true);
            tidy.setMakeClean(true);
            tidy.setQuoteNbsp(false);

WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
            XHTMLImporterImpl XHTMLImporter = new XHTMLImporterImpl(wordMLPackage);

for (Value v : res.getRules()) {
                System.out.println(v.toString());
                ByteArrayOutputStream ou = new ByteArrayOutputStream();
                tidy.parse(new ByteArrayInputStream(v.toString().getBytes(StandardCharsets.UTF_8)), ou);
                wordMLPackage.getMainDocumentPart().getContent().clear();
                wordMLPackage.getMainDocumentPart().getContent().addAll(XHTMLImporter.convert(new String(ou.toByteArray()), null));
            }
            wordMLPackage.save(new java.io.File(System.getProperty("user.dir") + "/report.docx"));

我想做的是使用其他 .docx 的样式并将其附加到我保存的输出的特定部分。有任何想法吗 ?我花了很多时间寻找解决方案,但我没有找到任何有用的东西。

通常,您会将 XHTML 直接导入到目标 docx 中(而不是像您在问题中所做的那样创建一个新的 docx)。这样,导入的内容就可以使用目标样式(如果您需要的话)。

但是,如果您想将样式从一个 docx 复制到另一个 docx,那可能很简单或更复杂(但与 XHTML 导入无关)。

首先,您需要参考每个 docx 中的样式:

Styles styles = wordMLPackage.getMainDocumentPart().getStyleDefinitionsPart().getJaxbElement();

样式通常是"basedOn"另一种样式。如果您要导入的样式是基于您的目标 docx 中具有相同定义的样式,您可以直接复制源样式。

如果 basedOn 样式不存在于目标 docx 中或定义不同,您将需要通过 copying/renaming 处理这种情况。以此类推。

此外,样式可以使用编号定义,因此您可能还需要导入它们(从 NumberingDefinitionsPart)。

第一个文件。我们想从中导入样式。

WordprocessingMLPackage wordMLPackage2 = WordprocessingMLPackage
.load(new java.io.File(System.getProperty("user.dir") + "/template.docx"));

第二个文档

WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();

我们从第一个文档导入样式并将它们附加到第二个文档

MainDocumentPart tempDocPart = wordMLPackage2.getMainDocumentPart();
StyleDefinitionsPart sdp = tempDocPart.getStyleDefinitionsPart();
Styles tempStyle = sdp.getJaxbElement();
wordMLPackage.getMainDocumentPart().getStyleDefinitionsPart().setJaxbElement(tempStyle);

并且我们可以使用其 id 使用特定样式

wordMLPackage.getMainDocumentPart().addStyledParagraphOfText("Heading1", "Example");