【问题标题】:Docx4j export style from one .docx and use it in another .docxDocx4j 从一个 .docx 导出样式并在另一个 .docx 中使用
【发布时间】:2016-02-01 16:41:19
【问题描述】:

我正在使用以下代码创建新的 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 中的样式并将其附加到我保存的输出的特定部分。有任何想法吗 ?我花了很多时间寻找解决方案,但没有发现任何有用的东西。

【问题讨论】:

  • 您想使用其他 docx 中的样式来设置什么样式?你的一些XHTML?如果有,请将 XHTML sn-p 添加到您的问题中。
  • 我也想设置 .docx 的样式。在第一个 .docx 中,我定义了样式。我必须使用从第一个 .docx 到我放入第二个 .docx 的特定文本部分的样式生成另一个 .docx。

标签: java ms-word docx docx4j


【解决方案1】:

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

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");

【讨论】:

    【解决方案2】:

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

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

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

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

    样式通常是“基于”另一种样式。如果您要导入的样式是基于您的目标docx中具有相同定义的样式,您只需复制源样式即可。

    如果 basedOn 样式在目标 docx 中不存在或定义不同,则需要通过复制/重命名来处理这种情况。依此类推。

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

    【讨论】:

    • 这部分救了我。我不知道在哪里添加我定义的样式,也找不到任何关于它的文档。谢谢你。 wordMLPackage.getMainDocumentPart().getStyleDefinitionsPart().getJaxbElement().getStyle().add(style)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 2015-03-21
    相关资源
    最近更新 更多