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

时间:2016-02-01 16:41:19

标签: java ms-word docx docx4j

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

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

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

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

样式通常是" basedOn"另一种风格。如果要导入的样式基于目标docx中具有相同定义的样式,则只需复制源样式。

如果目标docx中不存在basedOn样式或以不同方式定义,则您需要通过复制/重命名来处理该情况。等等。等等。

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