首页 > 解决方案 > 尝试使用 docx4j 扩展控件绑定和设置自定义 xsltfinisher 时出现问题

问题描述

我正在尝试使用 docx4j 生成报告。我已经设法创建了一个 word 模板并根据我的数据创建了 xml 绑定。

我可以使用 docx4j 生成基于此的 docx 输出,但现在我需要做一些条件样式 - 基于值将单元格着色为某种颜色。

我已经查看并尝试实现ContentControlBindingExtensions 示例

但我不断收到错误消息,提示无法在类加载器中找到 XsltCustomFinisher。

我的代码:

private static void bindXMLToTemplateFinisher(WordprocessingMLPackage wordMLPackage, String xml) throws Docx4JException, SAXException, IOException {

    XPathFactoryUtil.setxPathFactory(new net.sf.saxon.xpath.XPathFactoryImpl());

    Document xmlDoc = convertStringToXMLDocument(xml);
    //ClassLoader classloader = Thread.currentThread().getContextClassLoader();
    //String url = classloader.getResource("XsltFinishers/XsltFinisherCustom.xslt").getPath();

    Docx4jProperties.setProperty("docx4j.model.datastorage.XsltFinisher.xslt", "XsltFinisherReport.xslt");

    Docx4J.bind(wordMLPackage, xmlDoc, Docx4J.FLAG_BIND_INSERT_XML | Docx4J.FLAG_BIND_BIND_XML, null, new XsltProviderImpl(), "XsltFinisherReport.xslt", null);

} 

我希望能够设置一个 xsltfinisher 文件,但它似乎无法找到我要使用的那个。

任何有助于了解如何在 docx4j 中设置和使用自定义 xslt 修整器的帮助将不胜感激。

标签: javaxsltdocx4j

解决方案


从基础开始,将 XsltFinisherReport.xslt 放在你的类路径中,就像它说的那样?在您的 IDE 中,这可能意味着将包含它的目录添加到您的类路径中。

您可以打开 org.docx4j.utils.ResourceUtils 的日志记录以进行更多诊断。

根据 XsltFinisher 中的文档:

 * As an optional step after binding, apply user-defined XSLT to transform
 * this content control.
 * 
 * A template is attached to a content control (a repeat/condition/or normal bind),
 * using tag od:call=XYZ where XYZ is the template to call.
 * 
 * For example, by placing this on a repeat, a table tow could be coloured red if
 * its contents met some condition. 

例如 xslt,见https://github.com/plutext/docx4j/tree/master/docx4j-samples-resources/src/main/resources


推荐阅读