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");
我正在使用以下代码创建新的 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");