0

我使用 xdocreport 生成一个 word 文件。在 IDE 中它工作正常,但是一旦我将我的程序测试为可运行的 jar,就不再生成该文件,而是出现错误

fr.opensagres.xdocreport.core.XDocReportException: Null template engine. Set template engine with IXDocReport#setTemplateEngine.

当我使用xdocreport projet 中给出的教程尝试一个可运行的 jar 时,也会发生同样的事情

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import fr.opensagres.xdocreport.core.XDocReportException;
import fr.opensagres.xdocreport.document.IXDocReport;
import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
import fr.opensagres.xdocreport.template.IContext;
import fr.opensagres.xdocreport.template.TemplateEngineKind;

public class testing {

  public static void main(String[] args) {
    try {
      // 1) Load ODT file by filling Velocity template engine and cache it to the registry
      InputStream in = testing.class.getResourceAsStream("DocxProjectWithVelocity.docx");
      IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in,TemplateEngineKind.Velocity);

      // 2) Create context Java model
      IContext context = report.createContext();
      Project project = new Project("XDocReport");
      context.put("project", project);

      // 3) Generate report by merging Java model with the ODT
      OutputStream out = new FileOutputStream(new    File("DocxProjectWithVelocity_out.docx"));
      report.process(context, out);

    } catch (IOException e) {
      e.printStackTrace();
    } catch (XDocReportException e) {
      e.printStackTrace();
    }
  }
}

该错误似乎发生在该行:

 IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in,TemplateEngineKind.Velocity);

关于如何克服这个问题的任何想法(至少在本教程中)?我尝试将文件放在许多不同的路径中,但可运行的 jar 仍然找不到它。

谢谢你

4

3 回答 3

1

我在可运行的 jar 中遇到了同样的速度问题。解决此问题的关键写在异常消息中:

Set template engine with IXDocReport#setTemplateEngine

对我来说,可以设置IXDocReport( ITemplateEngineobject) 和FieldsMetadata( String= "Velocity") 对象的速度。我的代码示例:

private void CreateTextFooterReportPdf(PdfFooterModel footerTemplate, String FullFilePath)
            throws IOException, FileNotFoundException, Exception {
    InputStream in = new FileInputStream("Path to your template Here");


    IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in, TemplateEngineKind.Velocity);

    Properties properties = new Properties();
    properties.setProperty("resource.loader", "class");
    properties.setProperty(
            "class.resource.loader.class",               "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");


    ITemplateEngine templateEngine = new VelocityTemplateEngine(properties);

    report.setTemplateEngine(templateEngine);



    FieldsMetadata metadata = report.createFieldsMetadata();
    metadata.setTemplateEngineKind("Velocity");

......

希望它对某人有帮助。

于 2018-02-05T09:24:42.983 回答
0

如果您使用 Maven,请添加依赖项

        <dependency>
        <groupId>fr.opensagres.xdocreport</groupId>
        <artifactId>fr.opensagres.xdocreport.template.velocity</artifactId>
        <version>2.0.2</version>
    </dependency>
于 2020-01-12T04:43:51.267 回答
0

从velocity切换到freemarker似乎已经解决了这个问题。而不是线

IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in,TemplateEngineKind.Velocity);

我用了

IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in,TemplateEngineKind.Freemarker);

至于 word 文件,在合并文件而不是 «$Project.name» 我使用 «${Project.name}»

希望这可以帮助

于 2016-01-14T11:55:49.620 回答