【问题标题】:Xdocreport generating file in IDE but not from a jarXdocreport 在 IDE 中生成文件,但不是来自 jar
【发布时间】:2016-01-13 09:41:55
【问题描述】:

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

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

当我使用the 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 仍然找不到它。

谢谢

【问题讨论】:

    标签: java xdocreport


    【解决方案1】:

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

    Set template engine with IXDocReport#setTemplateEngine
    

    对我来说,可以为IXDocReportITemplateEngine 对象)和FieldsMetadataString = "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");
    

    .....

    希望对某人有所帮助。

    【讨论】:

      【解决方案2】:

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

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

      我用过

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

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

      希望对你有帮助

      【讨论】:

      • 您的问题是因为您的可运行 JAR 中没有 Velocity 和/或其依赖项。
      【解决方案3】:

      添加依赖 如果你使用 maven

              <dependency>
              <groupId>fr.opensagres.xdocreport</groupId>
              <artifactId>fr.opensagres.xdocreport.template.velocity</artifactId>
              <version>2.0.2</version>
          </dependency>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-29
        • 2015-07-05
        • 1970-01-01
        • 2015-04-17
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多