将BIRT库包含在InputStream的报告中(BIRT DEAPI)

时间:2015-01-12 10:47:02

标签: birt birt-deapi

我有一个环境,我使用ReportLibraries中的组件动态组装BIRT ReportDesigns。这些ReportLibraries存储在数据库中,在文件系统的任何位置都找不到。

我要做的是在会话中打开一个库,为库提供一个名称,以及一个InputStream(来自测试资源的FileInputStream)

    SessionHandle session = de.newSessionHandle(ULocale.ENGLISH);

    LibraryHandle library = session.openLibrary("lib01.rptlibrary", is);

然后我创建一个ReportDesign并包含库(按名称?)

    ReportDesignHandle reportDesign = session.createDesign();

    reportDesign.includeLibrary("lib01.rptlibrary", "lib01");

稍后我会在库中搜索表元素并尝试将其复制到Design:

    ElementFactory elementFactory = reportDesign.getElementFactory();

    DesignElementHandle deh1 = library.findElement("NewTable");

    DesignElementHandle ldeh1 = elementFactory.newElementFrom(deh1, "newTable");

此时我会得到以下例外:

 org.eclipse.birt.report.model.api.command.InvalidParentException: The library for the parent element "Table("NewTable")" is not included.
at org.eclipse.birt.report.model.api.ElementFactoryImpl.newElementFrom(ElementFactoryImpl.java:968)
at org.eclipse.birt.report.model.api.ElementFactory.newElementFrom(ElementFactory.java:1)

似乎找到了Library并且DesignElementHandle确实指向了我要复制到Design中的组件,但是ReportDesign找不到会话中打开的库。

有没有办法告诉ReportDesign从非FileSystem资源中包含库,还是要包含Session中的Library,因为它具有相同的名称?

我想避免将rptlibrary文件放在我的FielSystem上,不惜一切代价组装ReportDesign。

1 个答案:

答案 0 :(得分:1)

我没有测试过,我认为您的报告需要首先包含库,然后才能尝试将报表中的元素句柄从库中取出。

includeLibrary(filename, namespace)该函数只能用于从文件系统加载库。所以我认为你必须从数据库的内容创建一个临时文件,但是你可以在创建报告后删除它。

//add this
reportDesign.includeLibrary(filename, namespace);

ElementFactory elementFactory = reportDesign.getElementFactory();

DesignElementHandle deh1 = library.findElement("NewTable");

DesignElementHandle ldeh1 = elementFactory.newElementFrom(deh1, "newTable");