13.1报表引擎详解,API结构

BIRT包含几个引擎。一个引擎是一个提供一个特定领域的功能的一套Java API。例如,数据引擎包含管理数据的API,图表引擎包含生成一个图表的API。一般而言,BIRT包含四个引擎,报表设计引擎(design Engine),报表引擎(report engine),图表引擎(chat engine),数据引擎(data engine)。

a) 关于报表设计引擎

报表设计引擎包含验证一个报表设计文件的有效性和生成一个报表设计文件的API。报表设计引擎被BIRT Report Designer和任何定制的生成一个BIRT报表设计的Java应用程序所使用。生成引擎在创建一个报表文档时也使用报表设计引擎。报表设计引擎包含使用ROM技术规范来验证设计文件的元素和结构的有效性的API。

b) 关于报表引擎

报表引擎包含两部分:生成引擎和展示引擎。BIRT Report Viewer和定制的Java应用程序使用报表引擎来处理一个报表设计并按照设计中指定的格式生成报表。生成引擎包含读取和解释一个报表设计的API。生成引擎使用数据引擎来读取和转换来自由报表设计标识的数据源。生成引擎的输出是一个报表文档,这是一个报表产品中的一个中间文档。展示引擎处理由生成引擎创建的报表文档并按设计中指定的格式产生报表。和生成引擎一样,展示引擎也使用数据引擎。但是,在展示阶段,数据引擎从报表文件而不是数据源中获取数据。展示引擎它需要的任何一个报表发射器按照设计中指定的格式生成一个报表。BIRT有两个标准的发射器,HTML和PDF。BIRT也支持不是HTML和PDF格式的定制的发射器。图表报表项和定制的报表项扩展展示引擎来提供这些报表项的展示功能。

c) 关于图表引擎

图标引擎包含生成图表及将图表与来自数据源的数据关联起来的API。图表引擎的使用不仅限于BIRT应用程序。任何Java程序都可以使用图表引擎来创建和现实一个图表。BIRT Report Viewer 解释报表设计中的图标设计信息并使用图表引擎来生成图表。

d) 关于数据引擎

数据引擎包含获取和转换数据的API。当被生成引擎使用时,数据引擎直接从数据源中获取数据。当被展示引擎使用时,数据引擎从报表文档中获取数据。

1) 关于数据引擎组件

数据引擎包含两个主要组件:数据访问组件和数据转换组件。数据访问组件与ODA框架通信来获取数据。数据引擎的数据转换组件执行像排序、分组、累计和过滤来自数据访问组件的数据的操作。

2) 关于ODA框架

ODA框架管理ODA和本地驱动、装载驱动、打开连接并管理数据请求。ODA框架使用Eclipse Data Tools Platform项目来管理连接。ODA框架包含扩展点,籍此可以添加一个定制的ODA驱动。数据引擎扩展用于数据源的连接方法和驱动。如果有一个BIRT不支持的数据源就需要一个定制的ODA驱动。创建一个定制的ODA驱动时可能不仅需要扩展数据引擎而且还需要扩展BIRT Report Designer。如果数据源需要一个GUI组件来制定数据集,那么还需要一个BIRT Report Designer扩展。

应用开发者只需要了解公用的API,这些API包含在以下的几个包内:

a) org.eclipse.birt.report.model.api:这个包内包含了93个class,两个接口和一个exception,这个包是为那些想要定制report designer的开发者使用的,报表设计引擎包含这个包

b) org.eclipse.birt.report.engine.api:这个包包含了一个类,17个接口和四个exception,是给那些想要定制一个report generator的开发者使用的,报表引擎包含这个包

c) org.eclipse.birt.charthierarchy:这个包是给想定制一个chartgenerator的开发者使用的,图表引擎包含这个包

BIRT报表引擎(BIRT report engine)在几个环境提供了报表生成和翻译服务,包含在以下组件中:

a) Stand-alone engine:这个engine可以让开发者使用一个命令行程序来从一个report design文件(.rptdesign)中得到Html或PDF格式的report

b) BIRT report viewer:BIRT Report Designer使用它来预览report。这个程序是一个web程序,它运行在一个Eclipse内嵌的Tomcat中,这个Tomcat中有一个内嵌的report engine

c) Custom report designer with an embedded engine:一个定制的桌面报表应用集成BIRT report engine来预览报表

d) Web application that embeds the engine:一个类似于BIRT report viewer的Web程序,可以产生基于web的报表。

如下图所示:

另外,用户还能定制报表引擎,除了通常是集成到一个Web应用或者一个独立的Java应用程序外,定制的Java报表生成器质性和BIRT报表生成器相同的功能。和BIRT 报表浏览器Web应用一样,定制的Java报表生成器使用报表引擎的API来读取报表设计文件并生成一个报表。一个定制的业务逻辑来管理安全事宜、控制目录和确定输出的格式。

Report engine的核心engine运行并实施报表,而将其他的环境相关的任务留给运行该引擎的应用程序,比如:URLconstruction, image storage, and design file caching

BIRT report engine的API可以做以下几件事情:

a) 发现一组为报表定义的参数(包括动态参数和级联参数)

b) 获得参数的默认值

c) 产生任务(task)实施操作的应用

d)包含1到2个操作阶段((RunTask 然后 Render Task 或者RunAndRenderTask)

d) 为报表产生图片或chart

e) 产生报表文档

f) 运行报表产生HTML或PDF格式的输出

EngineConfig –设置报表引擎可选的参数.

ReportEngine – 用于运行一到多个报表任务

IReportRunnable –用于打开报表设计文档,并把句柄传给报表任务

IReportDocument – 用于打开报表文档,并把句柄传给报表任务,同时包含很多方法用于获TOC,数据等等

HTMLRenderContext – 定义展示HTML的环境,例如设置HTML图片地址,事件处理

PDFRenderContext – 定义展示PDF的环境,例如设置字体的地址,事件处理

HTMLRenderOption – 用于设置html的可选选项,比如导出时的路径

报表设计引擎(Design Engine)需要完成的事情:

1、用于产生或者修改报表设计文档,报表模板文档,报表库文档

2、有时候报表引擎需要修改报表设计文档,这个时候就需要调用报表设计引擎

3、如果报表引擎在运行时,事件机制和脚本机制中本身就包含修改报表设计的代码,这个时候也要调用报表设计引擎

4、用于获取和设置报表参数

5、可以用于获取报表设计的种种属性和参数

用户还能定制报表设计器,一个定制的报表设计器是一个由Java开发人员创建的用来基于特定的需求生成一个格式良好的报表设计文件Java应用程序。定制的报表设计器不需要包含用户界面。定制的报表设计起的一个典型的例子是一个动态确定一个报表的目录、结构或者数据元的Java应用程序。定制的报表设计器使用和BIRTReport Designer相同的设计引擎API。

图表引擎用于产生图表,展示图表,修改图表,是一个比较独立的引擎。通常包含两个API包:

org.eclipse.birt.chart.model.*,org.eclipse.birt.chart.*

一般报表设计器在产生一份包含图表的设计文档的时候,都要调用图表的设计和展示引擎,但图表引擎不仅仅包含在报表设计器的类库中,报表在展示阶段如果包含图表,或者需要修改图表的时候,也会调用图表的引擎。

事实上,birt提供的开源产品Report Designer,Example Viewer都包含这三个引擎(报表设计引擎,报表引擎,图表引擎),所以用户在自定义设计器,自定义web展示器,自定义独立运行的展示器的时候,最好也要包含这三类引擎。

构建一个报表的必须工作:

创建和配置报表引擎
单个报表引擎可以通过创建多个设计器来生成多个报表。通过Platform.createFactoryObject()方法创建一个ReportEngine对象。设置BIRT目录,指向需要的plug-in和库。

打开报表文档(*.rptdesign 或 *.rptdocument)
通过ReportEngine对象的openReportDesign( )打开一个报表设计模版,参数是文件路径名或InputStream,返回一个IReportRunnable对象。
通过ReportEngine对象的openReportDocument( )打开一个报表文档,参数是文件路径名,返回一个IReportDocument对象。

连接数据源
通过创建数据连接或使用应用程序提供的连接为数据集提供数据源。

报表生成的准备工作
用一个IRenderOption对象设置输出格式,输出文件名,输出流或输出位置,和一些特定格式设置。HTMLRenderOption支持HTML格式的输出,输出PDF格式使用RenderOption

生成报表
使用IRunAndRenderTask对象生成IReportRunnable类型的报表,使用IRenderTask对象创建IReportDocument类型的报表。
也可以访问部署在应用程序服务器上的report viewer servlet来生成报表。

销毁引擎
当我们不再需要使用报表引擎时将它销毁。

可选的任务:

获取参数
如果报表中设置了参数,引擎要使用传入的参数生成报表,如果没有传入参数则使用默认值。

创建报表文档文件(*.rptdocument)
报表文档文件已二进制的形式存储的,如果应用程序使用报表设计文件,要通过IRunTask对象生成一个IReportDocument对象的报表文档。

从报表文档导出数据。
使用IDataExtractionTask对象在报表文档中导出一项或多项的值。

开发环境要求
把需要的类库都引入classpath或开发工具中。配置BIRT目录,目录中包含了从报表设计文件生成报表所需要的plug-in和类库。 BIRT的报表引擎包在他的ReportEngine子目录里提供了完整的BIRT home。如果你想动手修改BIRT源码的话,一定要保证源码的版本与BIRT home中的plug-in和类库的版本是一致的。

类库和plug-in
BIRT home的ReportEngine\lib子目录和ReportEngine\plugins中包含了报表应用程序需要的用到的类库和plug-in,你可以根据自己项目的情况删除掉不用的包。

jdbc驱动
BIRT home的plugins/org.eclipse.birt.report.data.oda.jdbc_...文件夹用于存放连接数据库所需要的驱动程序,你可以把需要的驱动程序包放到该目录下(引入classpath中好像是不起作用的…)

通过api修改报表设计模版
报表应用程序在生成报表前可以修改报表设计模版。如:添加删除数据项,更深入的定制报表等。DesignEngine API提供了修改设计模版(包括修改脚本)DesignEngine的主要接口在org.eclipse.birt.model.api包中。

下面给出一个简单的例子:

该报表的设计如下:

数据集上有事件处理绑定:

需要在报表的资源中导入事件处理包:

预览如下:

报表引擎的源码如下:

[java] view plaincopy
  1. package REAPI;
  2. import java.util.logging.Level;
  3. import org.eclipse.birt.core.framework.Platform;
  4. import org.eclipse.birt.report.engine.api.EXCELRenderOption;
  5. import org.eclipse.birt.report.engine.api.EngineConfig;
  6. import org.eclipse.birt.report.engine.api.EngineConstants;
  7. import org.eclipse.birt.report.engine.api.EngineException;
  8. import org.eclipse.birt.report.engine.api.HTMLRenderOption;
  9. import org.eclipse.birt.report.engine.api.IReportEngine;
  10. import org.eclipse.birt.report.engine.api.IReportEngineFactory;
  11. import org.eclipse.birt.report.engine.api.IReportRunnable;
  12. import org.eclipse.birt.report.engine.api.IRunAndRenderTask;
  13. import org.eclipse.birt.report.engine.api.PDFRenderOption;
  14. public class RunAndRenderTask {
  15. public void runReport() throws EngineException
  16. {
  17. IRunAndRenderTask task=null;
  18. IReportEngine engine=null;
  19. EngineConfig config = null;
  20. try{
  21. //System.setProperty("java.io.tmpdir", "c:/temp/test/testsampledb");
  22. config = new EngineConfig( );
  23. config.setLogConfig("d:\\dwn.txt", Level.INFO);
  24. config.getAppContext().put(EngineConstants.APPCONTEXT_CLASSLOADER_KEY, this.getClass().getClassLoader());
  25. config.getAppContext().put(EngineConstants.WEBAPP_CLASSPATH_KEY, "d:\\eventjar.jar");
  26. config.setBIRTHome("E:\\birt汉化包\\birt-runtime-3_7_2\\ReportEngine");
  27. //config.setLogConfig(null, Level.FINEST);
  28. Platform.startup( config );
  29. IReportEngineFactory factory = (IReportEngineFactory) Platform
  30. .createFactoryObject( IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY );
  31. engine = factory.createReportEngine( config );
  32. IReportRunnable design = null;
  33. //Open the report design
  34. design = engine.openReportDesign("d:\\dataseteventhandler.rptdesign");
  35. task = engine.createRunAndRenderTask(design);
  36. //task.setParameterValue("Top Count", (new Integer(5)));
  37. task.validateParameters();
  38. HTMLRenderOption options = new HTMLRenderOption();
  39. options.setImageDirectory("d:\\");
  40. options.setOutputFileName("d:\\eventhandlerjar.html");
  41. options.setOutputFormat("html");
  42. //PDFRenderOption options = new PDFRenderOption();
  43. //options.setOutputFileName("d:\\topn.pdf");
  44. //options.setSupportedImageFormats("PNG;GIF;JPG;BMP;SWF;SVG");
  45. //options.setOutputFormat("pdf");
  46. //EXCELRenderOption options = new EXCELRenderOption();
  47. //options.setOutputFormat("xls");
  48. //options.setOutputFileName("d:\\customers.xls");
  49. //options.setWrappingText(true);
  50. task.setRenderOption(options);
  51. task.run();
  52. task.close();
  53. engine.destroy();
  54. }catch( Exception ex){
  55. ex.printStackTrace();
  56. }
  57. finally
  58. {
  59. if ( !task.getErrors( ).isEmpty( ) )
  60. {
  61. for ( Object e : task.getErrors( ) )
  62. {
  63. ( (Exception) e ).printStackTrace( );
  64. }
  65. }
  66. Platform.shutdown( );
  67. System.out.println("Finished");
  68. }
  69. }
  70. /**
  71. * @param args
  72. */
  73. public static void main(String[] args) {
  74. try
  75. {
  76. RunAndRenderTask ex = new RunAndRenderTask( );
  77. ex.runReport();
  78. }
  79. catch ( Exception e )
  80. {
  81. e.printStackTrace();
  82. }
  83. }
  84. }

运行,会看到D盘产生eventhandlerjar.html文档,查看如下:

下面详细介绍如何构建一个报表应用程序

org.eclipse.birt.report.engine.api包含了用来生成报表的类和接口,其中主要的类和接口有 ReportEngine, EngineConfig, IReportRunnable, IRenderOption以及它的子类,IEngineTask以及它的子类。
在Eclipse提供的Birt集成开发工具的帮助文档里有详细的api参考,不过有点简略。

一、创建报表引擎

报表引擎是ReportEngine类的一个实例,是任何报表应用程序的关键部分。首先用EngineConfig对象来为ReportEngine准备参数,然后用BIRT报表引擎工厂来创建引擎。创建一个配置对象:
EngineConfig config = new EngineConfig();

设置BIRT home
BIRT home就是BIRT plug-ins和类库的路径,它是报表引擎的关键参数。
你可以用下面的方式进行BIRT home设置:
■对于独立的应用程序可以吐过下面的方式设置:
config.setBIRTHome ( "C:/birt-runtime-<version>/ReportEngine" );
■也可以再你自己的环境变量中设置:
set BIRT_HOME="C:\birt-runtime-<version>\ReportEngine"
SET CLASSPATH=%BIRT_HOME%\<required library 1>;
■ 在Web应用程序里要首先取得绝对路径让后设置到config
config.setBIRTHome( servletContext.getRealPath( "/WEB-INF" ) );
■在WAR 文件的Web应用程序中可以使用PlatformServletContext.
config.setBIRTHome( "" );
■ 在Eclipse中,通过VM运行参数设置
-DBIRT_HOME="C:\birt-runtime-<version>\ReportEngine"

设置引擎的其他参数
通过配置对象进行配置的参数还有日志,OSGI(Open Services Gateway Initiative),平台上下文,资源文件,临时资源文件,脚本等,这些都是可选的参数,详细信息可以参考EngineConfig的API。

不同运行环境的差异
应用程序是独立运行的还是以web形式运行的决定了平台上下文和HTML发射器(emitter,不知道是不是生成器更合适一点)的配置的不同。 平台上下文提供了报表引擎连接plug-in的机制,默认使用独立运行的方式。HTML发射器提供了处理图片和处理超链接和标签事件的功能。

设置上下文
BIRT是一个基于Eclipse的应用程序,因此它使用OSGI平台来启动插件来产生报表和设计引擎。BIRT需要的plug-in存储在 BIRT主目录下,通过platform context进行配置,它实现了接口org.eclipse.birt.core.framework.IPlatformContext。 context作为EngineConfig的一个参数通过setEngineContext( )进行设置。
BIRT中提供了两个IPlatformContext的实现:
PlatformFileContext通过文件系统目录配置context,用于独立运行的应用程序和web应用程序中部署的基于系统文件目录的BIRT应用程序。
IPlatformContext context = new PlatformFileContext( );
config.setEngineContext( context );
对于web应用上部署的BIRT应用程序,使用PlatformServletContext。它使用基于资源连接的J2EE ServletContext来定位BIRT plug-in。它默认使用“/WEB-INF/platform/”
IPlatformContext context =
new PlatformServletContext(request.getSession().getServletContext());
config.setPlatformContext(context);
如果默认的BIRT提供的实现不能满足你的要求,可以定义自己的实现。

设置HTML emitter
当使用HTML格式生成一个报表,引擎通过一个HTMLRenderOption对象来定义如何处理HTML emitter使用的资源(图像滤镜,图像元素,图表,书签等)。桌面应用程序和web应用程序用来处理图像的方法是不同的。使用HTML emitter首先要创建HTMLRenderOption,使用方法:
HTMLRenderOption ho = new HTMLRenderOption( );
ho.setImageHandler( new HTMLCompleteImageHandler( ));
config.setEmitterConfiguration( RenderOptionBase.OUTPUT_FORMAT_HTML, ho );
创建引擎时可以不必设置HTML emitter,你可以需要生成HTML报表时再去进行配置。
IHTMLImageHandler是用来处理图像的接口,BIRT提供了两个IHTMLImageHandler的实现:
HTMLCompleteImageHander可以将图像保存到文件目录。它首先使用HTMLRenderOption设置的图像目录,如果没 有则使用EngineConfig.setTempDir( )设置的临时文件目录,如果还没有则使用java.io.tmpdir定义的系统临时文件目录。生成的HTML中引用的图像也是引擎创建的。
HTMLServerImageHandler应用在web应用程序中,它将图像文件保存在HTMLRenderOption设置的图像文目录 中。HTML的图像的src指向生成的图像文件的路径也是在HTMLRenderOption中配置的。这样报表引擎就可以在本地文件中创建图像文件,并 且通过URL共享。
ho.setImageDirectory("output/image");
ho.setBaseImageURL("http://myhost/prependme?image=");
如果IHTMLImageHandler得实现不能满足你的要求,你可以开发自己的实现。或者继承并重写已有的image handler。HTMLCompleteImageHander已经提供了足够的图像文件接口因此一般情况下不需要我们进行扩展。

启动平台
设置完成平台上下文环境,你可以通过org.eclipse.birt.core.framework.Platform类启动一个平台。 Platform是一个Eclipse OSGI平台的包装类,提供一个同步的静态方法startup( )用来启动平台,该操作的开销比较大,因此你的应用程序最好只调用一次。平台使用结束后调用Platform.shutdown( )关闭。如果你是在Web应用程序里使用报表引擎,请在servlet的init方法中调用startup方法或者在第一次处理用到平台的请求时。最好启 动平台的代码封装为一个单例。如果你使用Birt提供的Web Viewer或使用基于Eclipse的富客户端程序(RCP),你就不需要启动平台,因为应用程序已经自己启动了OSGi。

Platform Class的作用

用于启动所需要的插件

使用 OSGi.

DE API, CE API and the RE API都需要启动平台

使用 PlatformConfig 类去配置startup.

DesignConfig and EngineConfig 是扩展自 PlatformConfig.

PlatformContext 类决定了插件(Plugins)的地址

创建Factory用于产生DesignEngine或者ReportEngine

创建报表引擎
BIRT提供一个工厂服务用于创建ReportEngine对象。Platform.createFactoryObject( )创建一个实现了org.eclipse.birt.report.engine.api.IReportEngineFactory接口的工厂对象。该 方法需要一个PlatformConfig对象。因为EngineConfig是继承自PlatformConfig,你可以使用 EngineConfig来创建一个工厂。最后通过IReportEngineFactory.createReportEngine( )方法和刚才使用的EngineConfig对象创建报表引擎。

实例
在独立运行的应用程序中创建一个报表引擎,如下:

[java] view plaincopy
  1. // Create an EngineConfig object.
  2. EngineConfig config = new EngineConfig( );
  3. // Set up the path to your BIRT home directory.
  4. config.setBIRTHome("E:\\birt汉化包\\birt-runtime-3_7_2\\ReportEngine");
  5. // Explicitly set up the stand-alone application
  6. IPlatformContext context = new PlatformFileContext( );
  7. config.setEngineContext( context );
  8. // Start the platform for a non-RCP application.
  9. Platform.startup( config );
  10. IReportEngineFactory factory = ( IReportEngineFactory ) Platform.createFactoryObject
  11. ( IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY );
  12. // Set up writing images or charts embedded in HTML output.
  13. HTMLRenderOption ho = new HTMLRenderOption( );
  14. ho.setImageHandler( new HTMLCompleteImageHandler( ));
  15. config.setEmitterConfiguration( RenderOptionBase.OUTPUT_FORMAT_HTML, ho );
  16. // Create the engine.
  17. IReportEngine engine = factory.createReportEngine( config );

说明:上面一个在windows系统上的独立运行的应用程序,它使用BIRT run-time提供的BIRT home,报表输出格式是HTML。

[java] view plaincopy
  1. 在<span style="font-family:Calibri;">Web</span><span style="font-family:宋体;">应用程序上创建一个报表引擎,如下:</span>
[java] view plaincopy
  1. // Example class to create the report engine
  2. public class BirtEngine {
  3. private static IReportEngine birtEngine = null;
  4. public static synchronized IReportEngine getBirtEngine( ServletContext sc ) {
  5. if (birtEngine == null) {
  6. EngineConfig config = new EngineConfig( );
  7. config.setBIRTHome( "" );
  8. IPlatformContext context = new PlatformServletContext( sc );
  9. config.setPlatformContext( context );
  10. try{
  11. Platform.startup( config );
  12. IReportEngineFactory factory = ( IReportEngineFactory )
  13. Platform.createFactoryObject(
  14. IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY );
  15. birtEngine = factory.createReportEngine( config );
  16. }catch ( Exception e ) { e.printStackTrace( ); }
  17. }
  18. return birtEngine;
  19. }
  20. }

说明:上面的代码是一个用单例模式实现的报表引擎的创建的类,EngineConfig配置了两个参数 BIRTHome和PlatformContext。

在上面例子的基础上进行更多的配置

[java] view plaincopy
  1. // In a different class, get the report engine
  2. reportEngine = BirtEngine.getBirtEngine( request.getSession( ).getServletContext( ));
  3. // Set up the engine
  4. EngineConfig config = reportEngine.getConfig( );
  5. HTMLRenderOption ho = new HTMLRenderOption( );
  6. ho.setImageHandler( new HTMLServerImageHandler( ));
  7. ho.setImageDirectory("output/image");
  8. ho.setBaseImageURL("http://myhost/prependme?image=");
  9. config.setEmitterConfiguration( RenderOptionBase.OUTPUT_FORMAT_HTML, ho );

使用日志环境调试应用程序
BIRT报表引擎使用java.util.logging的Logger和Level类来处理引擎平台的日志信息。你在Eclipse中运行一个 应用程序运行信息默认的是显示在控制台上的。在非Eclipse环境中运行信息的输出就要有运行环境决定了。默认的日志级别是Level.INFO,你可 以通过改变日志级别来减少系统内部的日志信息。
使用EngineConfig.setLogConfig( )可以让日志输出到磁盘文件中。该方法需要两个参数,第一个参数是日志输出的目录,BIRT 引擎会在指定目录中创建一个名称格式为ReportEngine
_YYYY_MM_DD_hh_mm_ss.log的日志文件。第二个参数是日志信息的最低级别,级别越高输出的日志信息越少。ReportEngine.changeLogLevel( )方法可以让你修改日志级别。

如何使用BIRT日志 如下:

[java] view plaincopy
  1. // Set up the location and level of the logging output.
  2. config.setLogConfig( "C:/Temp", Level.ERROR );
  3. engine.changeLogLevel( Level.INFO );

二、打开报表资源文件

BIRT引擎可以通过报表设计文件和报表文档两种方式生成报表,引擎还可以从报表设计文件生成报表文档。
你可以通过openReportDesign( )方法打开一个报表设计文件文件,他实例化一个IReportRunnable对象,支持文件路径或一个输入流。
你可以通过openReportDocument( )方法打开一个报表设计文件文件,他实例化一个IReportDocument对象,也支持文件路径或一个输入流。
使用这些方法要处理EngineException。

理解IReportRunnable对象
IReportRunnable对象提供到报表设计的基本属性的直接接口。报表设计属性的属性名是静态字符串变量,如:IReportRunnable.AUTHOR。可以通过getProperty( )方法去访问这些属性。下面的代码展示了如何连接到报表设计文件:

[java] view plaincopy
  1. String designName = "./SimpleReport.rptdesign";
  2. IReportRunnable runnable = null;
  3. try {
  4. runnable = engine.openReportDesign( designName );
  5. }catch ( EngineException e ) {
  6. System.err.println( "Design " + designName + " not found!" );
  7. engine.destroy( );
  8. System.exit( -1 );
  9. }
  10. // Get the value of a simple property.
  11. String author = ( String ) runnable.getProperty( IReportRunnable.AUTHOR );

理解IReportDocument对象
IReportDocument对象提供了访问报表数据和报表结构的接口,它提供了方法来访问表格内容,书签,页面信息等。
使用findTOC( )访问表格内容,该方法使用TOCNode参数返回一个TOCNode对象。使用null参数就可以访问根表格。
调用getTOCTree( )返回一个ITOCTree对象获取更详细的Table信息。调用TOCNode.getChildren( )方法获取table的子节点,返回值是一个TOCNode对象列表。
通过TOCNode对象你可以得到表格中的内容和书签。你可以使用书签对象作为参数调用getPageNumber( )方法获取书签连接的页面的页数。通过这些信息你可以在以格式化的报表中显示特定的页面。
下面的代码展示了如何打开一个报表文档,并在页面上查找元素:

[java] view plaincopy
  1. String dName = "./SimpleReport.rptdocument";
  2. IReportDocument doc = null;
  3. try {
  4. doc = engine.openReportDocument( dName );
  5. catch ( EngineException e ) {
  6. System.err.println( "Document " + dName + " not found!" );
  7. engine.destroy( );
  8. System.exit( -1 );
  9. }
  10. // Get the root of the table of contents.
  11. TOCNode td = doc.findTOC( null );
  12. java.util.List children = td.getChildren( );
  13. long pNumber;
  14. // Loop through the top level table of contents entries.
  15. if ( children != null && children.size( ) > 0 ) {
  16. for ( int i = 0; i < children.size( ); i++ ) {
  17. // Find the required table of contents entry.
  18. TOCNode child = ( TOCNode ) children.get( i );
  19. if ( child.getDisplayString( ).equals( "103" ) ) {
  20. // Get the number of the page that contains the data.
  21. pNumber = doc.getPageNumber( child.getBookmark( ) );
  22. System.out.println( "Page to print is " + pNumber );
  23. }
  24. }
  25. }

三、用程序处理报表参数

参数是报表生成之前想报表设计文件输入的报表元素。报表的应用程序可以访问报表的参数的属性,最常用的属性是name和value,你可以使用参数名或通用编码来获取参数。

为报表设计创建一个参数定义任务
一个IGetParameterDefinitionTask对象提供链接到报表设计所有参数的接口。通过调用 ReportEngine.createGetParameterDefinitionTask( )创建一个参数定义对象,使用结束后调用他的close方法关闭。

测试报表设计是否有参数
IGetParameterDefinitionTask.getParameterDefns( )可以测试报表设计是否有参数,它返回一个参数集合,调用集合的isEmpty( )方法可以测试集合中是否有元素。

获取报表设计的参数
通过IGetParameterDefinitionTask.getParameterDefn( )方法获取一个已知名字的参数,它返回一个IParameterDefnBase类型对象,也可以调用getParameterDefns( )方法返回一个参数集合。
getParameterDefns( )需要一个boolean参数,如果为false返回一个未分组的参数集合,如果为true返回报表设计中定义的参数组。
调用IParameterDefnBase.getParameterType( )可以检验参数是否是一个组。如果是一个组则返回IParameterDefnBase.PARAMETER_GROUP,如果是一个级联参数组则返回 IParameterDefnBase.CASCADING_PARAMETER_GROUP。为获取一组报表参数,使用方法 IParameterGroupDefn.getContents( ),它返回一个数据类型是IScalarParameterDefn的ArrayList对象。

获取报表参数的默认值
这个任务是可选的。调用IGetParameterDefinitionTask.getDefaultValue( )获取一个已知参数的默认值,它返回的是一个Object。可以通过调用IScalarParameterDefn.getDataType( )来获取Object的有效类型,它返回一个IScalarParameterDefn定义的int类型的静态变量。调用 IGetParameterDefinitionTask.getDefaultValues( )来获取报表设计的所有参数的默认值,它返回一个HashMap对象存储了从参数名到默认值的映射。

使用常量列表提供的效值
许多报表参数只接受常量列表的值,这些值可能是静态常量,也可能是数据库里查出来的数据list。使用 IGetParameterDefinitionTask.getSelectionList( )可以返回参数所能接受的参数(IParameterSelectionChoice)的集合,如果集合为null,则可以接受任何值。 IParameterSelectionChoice的getLabel( )方法返回现实的文本,getValue( )返回值。

获取每个报表参数的属性
这个任务是可选的。使用IScalarParameterDefn的方法可以获取表参数的属性。应用程序使用属性生成用户自定义接口。例如,获取参数的数据类型使用getDataType( )方法。

为参数设置值
调用IGetParameterDefinitionTask.setParameterValue( )为参数设置值。如果你是通过应用程为日期数值等参数返回一个字符串,要把他们转化成和本地无关的格式。调用方法 ReportParameterConverter.parse( )方法可以完成这项工作。getParameterValues( )方法返回一个HashMap包含了已经设置的所有参数。

实例
下面的代码展示了如何设置一个已知参数名的参数值:

[java] view plaincopy
  1. // Create a parameter definition task.
  2. IGetParameterDefinitionTask task = engine.createGetParameterDefinitionTask( runnable );
  3. // Instantiate a scalar parameter.
  4. IScalarParameterDefn param = (IScalarParameterDefn)
  5. task.getParameterDefn( "customerID" );
  6. // Get the default value of the parameter. In this case,
  7. // the data type of the parameter, customerID, is Double.
  8. int customerID = ((Double) task.getDefaultValue( param )).intValue( );
  9. // Get a value for the parameter. This example assumes that
  10. // this step creates a correctly typed object, inputValue.
  11. // Set the value of the parameter.
  12. task.setParameterValue( "customerID", inputValue );
  13. // Get the values set by the application for all parameters.
  14. HashMap parameterValues = task.getParameterValues( );
  15. // Close the parameter definition task.
  16. task.close( );

下面的代码展示了如何使用报表参数集合,例子中使用ReportParameterConverter将字符串转化成用户接口接受的参数格式。

[java] view plaincopy
  1. // Create a parameter definition task.
  2. IGetParameterDefinitionTask task = engine.createGetParameterDefinitionTask( runnable );
  3. // Create a collection of the parameters in the report design.
  4. Collection params = task.getParameterDefns( false );
  5. // Get the default values of the parameters.
  6. HashMap parameterValues = task.getDefaultValues( );
  7. // Get values for the parameters. Later code in this example
  8. // assumes that this step creates a HashMap object,
  9. // inputValues. The keys in the HashMap are the parameter
  10. // names and the values are those that the user provided.
  11. // Iterate through the report parameters, setting the values
  12. // in standard locale-independent format.
  13. Iterator iterOuter = params.iterator( );
  14. ReportParameterConverter cfgConverter =
  15. new ReportParameterConverter( "", Locale.getDefault() );
  16. while ( iterOuter.hasNext( ) ) {
  17. IParameterDefnBase param = (IParameterDefnBase) iterOuter.next( );
  18. String value = (String) inputValues.get( param.getName( ));
  19. if ( value != null ) {
  20. parameterValues.put( param.getName( ),
  21. cfgConverter.parse( value, param.getDataType( ) ) );
  22. }
  23. }
  24. // Close the parameter definition task.
  25. task.close( );

使用级联参数
级联参数参数是一组可供用户选择的参数值的集合。第一个参数的选择会影响到第二个参数中的值。参数使用一个或多个查询来从数据集把数据展示给用户。参数定义任务根据前面的选择以行为单位过滤参数组中的数据。
使用报表引擎实现级联参数,要进行如下工作:
■使用IGetParameterDefinitionTask.evaluateQuery( )方法为级联参数准备数据,它需要参数group的名字作为参数。
■调用IGetParameterDefinitionTask.getSelectionListForCascadingGroup( )获取参数组的第一个参数的值,它需要两个参数,参数名和对象数组,对第一个参数来说这个数组是空的。该方法返回一个 IParameterSelectionChoice集合。
■ 再次调用getSelectionListForCascadingGroup( )方法获取后面的参数,这次Object[ ]中放的是前面获取的参数值。

下面的代码展示了如何通过查询实现级联参数:

[java] view plaincopy
  1. // Create a grouped collection of the design’s parameters.
  2. Collection params = task.getParameterDefns( true );
  3. // Iterate through the parameters to find the cascading group.
  4. Iterator iter = params.iterator( );
  5. while ( iter.hasNext( ) ) {
  6. IParameterDefnBase param = (IParameterDefnBase) iter.next();
  7. if ( param.getParameterType() ==
  8. IParameterDefnBase.CASCADING_PARAMETER_GROUP ) {
  9. ICascadingParameterGroup group = (ICascadingParameterGroup) param;
  10. Iterator i2 = group.getContents( ).iterator( );
  11. // Run the query for the cascading parameters.
  12. task.evaluateQuery( group.getName() );
  13. Object[ ] userValues = new Object[group.getContents( ).size( )];
  14. // Get the report parameters in the cascading group.
  15. int i = 0;
  16. while ( i2.hasNext( ) ) {
  17. IScalarParameterDefn member = (IScalarParameterDefn) i2.next( );
  18. // Get the values for the parameter.
  19. Object[ ] setValues = new Object[i];
  20. if ( i > 0 ) System.arraycopy( userValues, 0, setValues, 0, i );
  21. Collection c = task.getSelectionListForCascadingGroup(
  22. group.getName(),setValues );
  23. // Iterate through the values for the parameter.
  24. Iterator i3 = c.iterator();
  25. while ( i3.hasNext( ) ) {
  26. IParameterSelectionChoice s =
  27. ( IParameterSelectionChoice ) i3.next( );
  28. String choiceValue = s.getValue( );
  29. String choiceLabel = s.getLabel( );
  30. }
  31. // Get the value for the parameter from the list of
  32. // choices. This example does not provide the code for
  33. // this task.
  34. userValues[i] = inputChoiceValue;
  35. i++;
  36. }
  37. }
  38. }

四、报表生成的准备工作

BIRT支持HTML, Adobe PDF, Adobe PostScript (PS), Microsoft Excel (XLS), Microsoft PowerPoint (PPT)和 Microsoft Word (DOC) 格式的报表生成器。你也可以通过扩展支持自定义的格式。

有三个task类用来支持从源文件生成报表,就是:

■ IRunAndRenderTask. 通过运行报表设计文件直接生成目标格式的报表。调用方法ReportEngine.createRunAndRenderTask( )可以创建这个对象。

■ IRunTask. 通过报表设计文件生成报表文档,ReportEngine.createRunTask( )方法可以创建这个对象。

■ IRenderTask. 通过对报表文档中的内容进行格式化生成一个完整的报表或一个页面集。ReportEngine. createRenderTask( )方法返回该对象的一个实例。
每一个任务都可以使用多个报表文件,任务结束后都要调用close方法关闭。

为运行报表设计文件准备参数
IRunAndRenderTask 和 IRunTask对象允许设置报表参数。调用setParameterValues( )方法,通过传入一个参数的HashMap设置所有的参数,设置单个参数可以使用setParameterValue( )方法。

添加到报表引擎的类路径
一些报表设计需要扩展的java类,BIRT报表引擎通过使用环境变量信息定位类。通过动态设置应用程序上下文信息或引擎配置对象也可以配置java类的位置。使用EngineConstants中的常量来配置这些参数。

使用EngineTask对象和EngineConfig对象可以设置应用程序上下文,如下:

configOrTask.getAppContext( ).put(EngineConstants.APPCONTEXT_CLASSLOADER_KEY,MyClass.class.getClassLoader( ));

使用EngineConfig对象设置CLASSPATH,如下:
Java代码

config.setProperty( EngineConstants.WEBAPP_CLASSPATH_KEY, "c:/myjars/jar1.jar;c:/myclasses" );

使用Java System类设置CLASSPATH,如下:

System.setProperty(EngineConstants.WEBAPP_CLASSPATH_KEY, "c:/myjars/jar1.jar;c:/myclasses" );

BIRT按下面的顺序来查找扩展类:
■ 报表引擎plug-in的CLASSPATH
■ 上下文环境中定义的EngineConstants.APPCONTEXT_CLASSLOADER_KEY
■Java System 类或EngineConfig 中定义的EngineConstants.WEBAPP_CLASSPATH_KEY.
■Java System 类或EngineConfig 中定义的EngineConstants. PROJECT _CLASSPATH_KEY.
■Java System 类或EngineConfig 中定义的
EngineConstants. WORKSPACE _CLASSPATH_KEY.
■ 报表设计中引入的JAR文件

为报表设计提供外部对象
BIRT支持把以前实例化的对象拿过来重用。调用报表引擎前你要在应用程序中持有这个已经在内存中存在的对象。如果在脚本环境中使用,你传递对象给引擎后,脚本可以通过对象名在必要的是后获取对象。
可以通过EngineConfig或task得上下文环境为引擎提供对象。如下:

[java] view plaincopy
  1. MyObject mo = new MyObject( );
  2. config = new EngineConfig( );
  3. // Get the application context from the config or the task
  4. HashMap hm = config.getAppContext( );
  5. //HashMap hm = task.getAppContext( );
  6. hm.put( "MyCreatedObject", mo );
  7. config.setAppContext( hm );
  8. // To refer to this object in a BIRT script
  9. // or expression, use MyCreatedObject.myMethod()

设置rendering选项
按指定格式输出报表前要先设置报表输出选项。必须设置一个文件名或输出流用来输出报表,其他的设置都是可选的如是否创建一个可嵌入的HTML。 BIRT支持可嵌入和非可嵌入两种HTML,可嵌入HTML可以被嵌入其他的web页面,不包含头信息<body> 和<html>表签。

应用程序通过rendering options对象设置输出选项,指定格式的rendering options类实现了IRenderOption接口,并且继承了RenderOption类。HTMLRenderOption用来设置HTML输出 选项,PDFRenderOption用来设置PDF格式输出选项。其他的格式都使用RenderOption。

常用的设置有超连接的URL,事件处理器,图像处理器,输出格式,支持的图片输出格式,还可以设置输出到数据流还是文件。

设置HTML rendering选项
生成一个使用了图片的HTML报表,必须进行更多的配置。HTMLRenderOption提供了许多方式去自定义HTML的生产。下面是一些常用的选项:
■ 图像路径,生成HTML需要的图像(图片,动态生成的图表等)的路径通过调用方法HTMLRenderOption.setImageDirectory( )进行设置。
■ 基本图像URL,在Web应用程序开发时,浏览器要引用到图像所要使用的URL路径前缀。通过HTMLRenderOption.setBaseImageURL( )进行设置。
■ 图像处理器,使用HTMLRenderOption.setImageHandler( ) 进行设置
■ 可嵌入的HTML,调用HTMLRenderOption.setEmbeddable( )。
■ 从左到右的生成方式,调用HTMLRenderOption.setHtmlRtLFlag( )设置。
■ 标题标签,调用HTMLRenderOption.setHtmlTitle( )设置,该标签将显示在浏览器的标签页上。
■ 主页面内容,通过主页面可以设置页面大小、页眉、页脚等。如果不想让主页面的设置影响HTML的生成,可以调用HTMLRenderOption.setMasterPageContent( )设置。
■ 浮动的页脚,主页面的页脚默认直接显示在内容的下方。传一个boolean值false给方法 HTMLRenderOption.setPageFooterFloatFlag( ),强制页脚在页面底部的固定位置显示。这个设置将在生成的HTML中添加一个固定高度的DIV。
■主页的页边距,HTMLRenderOption.setOutputMasterPageMargins( )设置主页的页边距是否影响到HTML页面。
■ HTML分页,生成HTML时也支持分页。设置HTMLRenderOption.setHtmlPagination( )可以让HTML页面支持分页。
下面的实例展示了在IRunAndRenderTask对象上使用rendering选项:

[java] view plaincopy
  1. // Create a run and render task object.
  2. IRunAndRenderTask task = engine.createRunAndRenderTask( runnable );
  3. // Set values for all parameters in a HashMap, parameterValues
  4. task.setParameterValues( parameterValues );
  5. // Validate parameter values.
  6. boolean parametersAreGood = task.validateParameters( );
  7. // Set the name of an output file.
  8. HTMLRenderOption options = new HTMLRenderOption( );
  9. String output = name.replaceFirst( ".rptdesign"".html" );
  10. options.setOutputFileName( output );
  11. options.setImageDirectory( "image" );
  12. options.setHtmlRtLFlag( true );
  13. options.setEmbeddable( false );
  14. // Apply the rendering options to the task.
  15. task.setRenderOption( options );
  16. // Run and close the task
  17. task.run();
  18. task.close();

设置PDF rendering选项
生成PDF格式的报表需要在报表中嵌入字体,或者使用非标准路径的字体,应用程序支持PDF rendering以下设置:
■ 字体路径,如果使用自定义路径下的字体,使用setFontDirectory( )进行设置。
■ 嵌入的字体,调用PDFRenderOption.setEmbededFont( )可以使用嵌入字体。

五、生成报表

IRunAndRenderTask和IRunTask对象的run方法可以生成报表,同时要处理run方法抛出的EngineException异常。
下面的代码展示了如何生成一个报表:

[java] view plaincopy
  1. try {
  2. task.run( );
  3. System.out.println( "Created Report " + output + "." );
  4. }catch ( EngineException e1 ) {
  5. System.err.println( "Report " + name + " run failed." );
  6. System.err.println( e1.toString( ) );
  7. }
  8. engine.destroy( );

六、取消报表运行任务

BIRT报表引擎支持检查引擎任务的状态,并取消这个任务。通常使用不同的进程来执行这些操作。
使用EngineTask.getStatus( )方法可以检查报表的运行状态,返回值有下面这些:
■ IEngineTask.STATUS_NOT_STARTED. 任务没有启动
■ IEngineTask.STATUS_RUNNING. 任务正在运行中
■ IEngineTask.STATUS_SUCCEEDED. 任务正常结束
■ IEngineTask.STATUS_FAILED. 任务没有正常执行
■ IEngineTask.STATUS_CANCELLED. 任务被取消
调用IEngineTask.cancel( )方法可以取消任务。如果一个正在运行的任务被取消了,它将停止生成报表,如果任务正在查询数据库,则数据库要继续执行完查询任务。
下面就是一个取消任务的例子:

[java] view plaincopy
  1. private class CancelReport extends Thread
  2. {
  3. private IEngineTask eTask;
  4. public CancelReport( String myName, IEngineTask task ) {
  5. super( myName );
  6. eTask = task;
  7. }
  8. public void cancel( ) {
  9. try {
  10. Thread.currentThread( ).sleep( 100 );
  11. eTask.cancel( );
  12. System.out.println( "#### Report cancelled #####" );
  13. }catch( Exception e )
  14. {
  15. e.printStackTrace();
  16. }
  17. }
  18. }
  19. CancelReport cancelThread = new CancelReport( "cancelReport", task);
  20. cancelThread.cancel( );

下面我给出几个比较完整的例子来讲解报表引擎的工作。

下面是一个运行并导出部分列数据的代码:

[java] view plaincopy
  1. package REAPI;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.logging.Level;
  5. import org.eclipse.birt.core.framework.Platform;
  6. import org.eclipse.birt.data.engine.api.IConditionalExpression;
  7. import org.eclipse.birt.data.engine.api.IFilterDefinition;
  8. import org.eclipse.birt.data.engine.api.querydefn.ConditionalExpression;
  9. import org.eclipse.birt.data.engine.api.querydefn.FilterDefinition;
  10. import org.eclipse.birt.data.engine.core.DataException;
  11. import org.eclipse.birt.report.engine.api.EngineConfig;
  12. import org.eclipse.birt.report.engine.api.EngineException;
  13. import org.eclipse.birt.report.engine.api.IDataExtractionTask;
  14. import org.eclipse.birt.report.engine.api.IDataIterator;
  15. import org.eclipse.birt.report.engine.api.IExtractionResults;
  16. import org.eclipse.birt.report.engine.api.IReportDocument;
  17. import org.eclipse.birt.report.engine.api.IReportEngine;
  18. import org.eclipse.birt.report.engine.api.IReportEngineFactory;
  19. import org.eclipse.birt.report.engine.api.IResultMetaData;
  20. import org.eclipse.birt.report.engine.api.IResultSetItem;
  21. public class DataExtract {
  22. static void readReport() throws EngineException
  23. {
  24. IReportEngine engine=null;
  25. EngineConfig config = null;
  26. try{
  27. config = new EngineConfig( );
  28. config.setBIRTHome("E:\\birt汉化包\\birt-runtime-3_7_2\\ReportEngine");
  29. config.setLogConfig(null, Level.OFF);
  30. Platform.startup( config );
  31. IReportEngineFactory factory = (IReportEngineFactory) Platform
  32. .createFactoryObject( IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY );
  33. engine = factory.createReportEngine( config );
  34. }catch( Exception ex){
  35. ex.printStackTrace();
  36. }
  37. IReportDocument iReportDocument = engine.openReportDocument("d:\\customers.rptdocument");
  38. //Setup data extraction task
  39. IDataExtractionTask task = engine.createDataExtractionTask(iReportDocument);
  40. /**
  41. * returns the metadata corresponding to the data stored in the report
  42. * document.  Could specify a component.
  43. */
  44. ArrayList resultSetList = (ArrayList)task.getResultSetList( );
  45. IResultSetItem resultItem = null;
  46. Iterator it = resultSetList.iterator();
  47. while (it.hasNext()) {
  48. resultItem = (IResultSetItem)it.next();
  49. System.out.println("ResultSetName ====> " + resultItem.getResultSetName( ));
  50. }
  51. resultItem = (IResultSetItem)resultSetList.get( 0 );
  52. String dispName = resultItem.getResultSetName( );
  53. //Name Tables for ease
  54. task.selectResultSet( dispName );
  55. //Return Only customers between 201-300
  56. IFilterDefinition[] FilterExpression = new IFilterDefinition[2];
  57. FilterExpression[0] = new FilterDefinition( new ConditionalExpression( "row[\"CUSTOMERNUMBER\"]",
  58. IConditionalExpression.OP_GE, "201"null ) );
  59. FilterExpression[1] = new FilterDefinition( new ConditionalExpression( "row[\"CUSTOMERNUMBER\"]",
  60. IConditionalExpression.OP_LT, "300"null ) );
  61. task.setFilters( FilterExpression );
  62. IExtractionResults iExtractResults = task.extract();
  63. IDataIterator iData = null;
  64. try{
  65. if ( iExtractResults != null )
  66. {
  67. iData = iExtractResults.nextResultIterator( );
  68. //Get metadata on retrieved results
  69. IResultMetaData irmd = iData.getResultMetaData();
  70. if ( iData != null  ){
  71. int colCount = irmd.getColumnCount();
  72. System.out.println("Cloumn Count =" + colCount );
  73. forint j=0; j< colCount; j++){
  74. System.out.println("Cloumn Name =" + irmd.getColumnName(j) );
  75. System.out.println("Cloumn Type =" + irmd.getColumnTypeName(j) );
  76. }
  77. while ( iData.next( ) )
  78. {
  79. //Just disply the first two columns
  80. Object objColumn1;
  81. Object objColumn2;
  82. try{
  83. objColumn1 = iData.getValue(4);
  84. }catch(DataException e){
  85. objColumn1 = new String("");
  86. }
  87. try{
  88. objColumn2 = iData.getValue(12);
  89. }catch(DataException e){
  90. objColumn2 = new String("");
  91. }
  92. System.out.println( objColumn1 + " , " + objColumn2 );
  93. }
  94. iData.close();
  95. }
  96. }
  97. }
  98. catch( Exception e){
  99. e.printStackTrace();
  100. }
  101. task.close();
  102. engine.destroy();
  103. Platform.shutdown();
  104. System.out.println("Finished");
  105. System.exit(0);
  106. }
  107. /**
  108. * @param args
  109. */
  110. public static void main(String[] args) {
  111. try
  112. {
  113. readReport( );
  114. }
  115. catch ( Exception e )
  116. {
  117. e.printStackTrace();
  118. }
  119. }
  120. }

其中customers.rptdesign的设计如下:

预览如下:

该源码打印了结果集中的所有表名,从第一个表中获取了结果集列属性信息,导出了客户号在201到300之间客户第4列和第12列信息

运行结果如下:

[plain] view plaincopy
  1. ResultSetName ====> MyCustomerTable
  2. ResultSetName ====> innertable
  3. ResultSetName ====> innertable_1
  4. ResultSetName ====> innertable_2
  5. ResultSetName ====> innertable_3
  6. ResultSetName ====> innertable_4
  7. ResultSetName ====> innertable_5
  8. ResultSetName ====> innertable_6
  9. ResultSetName ====> innertable_7
  10. ResultSetName ====> innertable_8
  11. ResultSetName ====> innertable_9
  12. ResultSetName ====> innertable_10
  13. ResultSetName ====> innertable_11
  14. ResultSetName ====> innertable_12
  15. ResultSetName ====> innertable_13
  16. ResultSetName ====> innertable_14
  17. ResultSetName ====> innertable_15
  18. ResultSetName ====> innertable_16
  19. ResultSetName ====> innertable_17
  20. ResultSetName ====> innertable_18
  21. ResultSetName ====> innertable_19
  22. ResultSetName ====> innertable_20
  23. ResultSetName ====> innertable_21
  24. ResultSetName ====> innertable_22
  25. ResultSetName ====> innertable_23
  26. ResultSetName ====> innertable_24
  27. ResultSetName ====> innertable_25
  28. ResultSetName ====> innertable_26
  29. ResultSetName ====> innertable_27
  30. ResultSetName ====> innertable_28
  31. ResultSetName ====> innertable_29
  32. ResultSetName ====> innertable_30
  33. ResultSetName ====> innertable_31
  34. ResultSetName ====> innertable_32
  35. ResultSetName ====> innertable_33
  36. ResultSetName ====> innertable_34
  37. ResultSetName ====> innertable_35
  38. ResultSetName ====> innertable_36
  39. ResultSetName ====> innertable_37
  40. ResultSetName ====> innertable_38
  41. ResultSetName ====> innertable_39
  42. ResultSetName ====> innertable_40
  43. ResultSetName ====> innertable_41
  44. ResultSetName ====> innertable_42
  45. ResultSetName ====> innertable_43
  46. ResultSetName ====> innertable_44
  47. ResultSetName ====> innertable_45
  48. ResultSetName ====> innertable_46
  49. ResultSetName ====> innertable_47
  50. ResultSetName ====> innertable_48
  51. ResultSetName ====> innertable_49
  52. ResultSetName ====> innertable_50
  53. ResultSetName ====> innertable_51
  54. ResultSetName ====> innertable_52
  55. ResultSetName ====> innertable_53
  56. ResultSetName ====> innertable_54
  57. ResultSetName ====> innertable_55
  58. ResultSetName ====> innertable_56
  59. ResultSetName ====> innertable_57
  60. ResultSetName ====> innertable_58
  61. ResultSetName ====> innertable_59
  62. ResultSetName ====> innertable_60
  63. ResultSetName ====> innertable_61
  64. ResultSetName ====> innertable_62
  65. ResultSetName ====> innertable_63
  66. ResultSetName ====> innertable_64
  67. ResultSetName ====> innertable_65
  68. ResultSetName ====> innertable_66
  69. ResultSetName ====> innertable_67
  70. ResultSetName ====> innertable_68
  71. ResultSetName ====> innertable_69
  72. ResultSetName ====> innertable_70
  73. ResultSetName ====> innertable_71
  74. ResultSetName ====> innertable_72
  75. ResultSetName ====> innertable_73
  76. ResultSetName ====> innertable_74
  77. ResultSetName ====> innertable_75
  78. ResultSetName ====> innertable_76
  79. ResultSetName ====> innertable_77
  80. ResultSetName ====> innertable_78
  81. ResultSetName ====> innertable_79
  82. ResultSetName ====> innertable_80
  83. ResultSetName ====> innertable_81
  84. ResultSetName ====> innertable_82
  85. ResultSetName ====> innertable_83
  86. ResultSetName ====> innertable_84
  87. ResultSetName ====> innertable_85
  88. ResultSetName ====> innertable_86
  89. ResultSetName ====> innertable_87
  90. ResultSetName ====> innertable_88
  91. ResultSetName ====> innertable_89
  92. ResultSetName ====> innertable_90
  93. ResultSetName ====> innertable_91
  94. ResultSetName ====> innertable_92
  95. ResultSetName ====> innertable_93
  96. ResultSetName ====> innertable_94
  97. ResultSetName ====> innertable_95
  98. ResultSetName ====> innertable_96
  99. ResultSetName ====> innertable_97
  100. ResultSetName ====> innertable_98
  101. ResultSetName ====> innertable_99
  102. ResultSetName ====> innertable_100
  103. ResultSetName ====> innertable_101
  104. ResultSetName ====> innertable_102
  105. ResultSetName ====> innertable_103
  106. ResultSetName ====> innertable_104
  107. ResultSetName ====> innertable_105
  108. ResultSetName ====> innertable_106
  109. ResultSetName ====> innertable_107
  110. ResultSetName ====> innertable_108
  111. ResultSetName ====> innertable_109
  112. ResultSetName ====> innertable_110
  113. ResultSetName ====> innertable_111
  114. ResultSetName ====> innertable_112
  115. ResultSetName ====> innertable_113
  116. ResultSetName ====> innertable_114
  117. ResultSetName ====> innertable_115
  118. ResultSetName ====> innertable_116
  119. ResultSetName ====> innertable_117
  120. ResultSetName ====> innertable_118
  121. ResultSetName ====> innertable_119
  122. ResultSetName ====> innertable_120
  123. ResultSetName ====> innertable_121
  124. Cloumn Count =13
  125. Cloumn Name =CUSTOMERNUMBER
  126. Cloumn Type =Integer
  127. Cloumn Name =CUSTOMERNAME
  128. Cloumn Type =String
  129. Cloumn Name =CONTACTLASTNAME
  130. Cloumn Type =String
  131. Cloumn Name =CONTACTFIRSTNAME
  132. Cloumn Type =String
  133. Cloumn Name =PHONE
  134. Cloumn Type =String
  135. Cloumn Name =ADDRESSLINE1
  136. Cloumn Type =String
  137. Cloumn Name =ADDRESSLINE2
  138. Cloumn Type =String
  139. Cloumn Name =CITY
  140. Cloumn Type =String
  141. Cloumn Name =STATE
  142. Cloumn Type =String
  143. Cloumn Name =POSTALCODE
  144. Cloumn Type =String
  145. Cloumn Name =COUNTRY
  146. Cloumn Type =String
  147. Cloumn Name =SALESREPEMPLOYEENUMBER
  148. Cloumn Type =Integer
  149. Cloumn Name =CREDITLIMIT
  150. Cloumn Type =Float
  151. 02 9936 8555 , 107800.0
  152. +61 2 9495 8555 , 93300.0
  153. (604) 555-3392 , 90300.0
  154. (514) 555-8054 , 48700.0
  155. (604) 555-4555 , 89600.0
  156. 86 21 3555 , 120800.0
  157. 88.60.1555 , 53800.0
  158. 61.77.6555 , 61100.0
  159. +33 1 46 62 7555 , 68100.0
  160. 30.59.8555 , 77900.0
  161. 0372-555188 , 0.0
  162. 069-0555984 , 0.0
  163. 0221-5554327 , 120400.0
  164. 089-0877555 , 0.0
  165. +852 2251 1555 , 58600.0
  166. 011-4988555 , 113000.0
  167. 035-640555 , 119600.0
  168. +47 2212 1555 , 95100.0
  169. +612 9411 1555 , 0.0
  170. (93) 203 4555 , 60300.0
  171. (91) 745 6555 , 0.0
  172. +41 26 425 50 01 , 0.0
  173. 0897-034555 , 141300.0
  174. (171) 555-2282 , 92700.0
  175. (198) 555-8888 , 93900.0
  176. 6175557555 , 68700.0
  177. 6265557265 , 90700.0
  178. 3105552373 , 11000.0
  179. 7605558146 , 105000.0
  180. 6175558555 , 123700.0
  181. Finished

下面这个案例运行报表,并导出html文件:

[java] view plaincopy
  1. package REAPI;
  2. import java.util.logging.Level;
  3. import org.eclipse.birt.core.framework.Platform;
  4. import org.eclipse.birt.report.engine.api.EXCELRenderOption;
  5. import org.eclipse.birt.report.engine.api.EngineConfig;
  6. import org.eclipse.birt.report.engine.api.EngineException;
  7. import org.eclipse.birt.report.engine.api.HTMLRenderOption;
  8. import org.eclipse.birt.report.engine.api.IPDFRenderOption;
  9. import org.eclipse.birt.report.engine.api.IRenderOption;
  10. import org.eclipse.birt.report.engine.api.IRenderTask;
  11. import org.eclipse.birt.report.engine.api.IReportDocument;
  12. import org.eclipse.birt.report.engine.api.IReportEngine;
  13. import org.eclipse.birt.report.engine.api.IReportEngineFactory;
  14. import org.eclipse.birt.report.engine.api.PDFRenderOption;
  15. import org.eclipse.birt.report.engine.api.RenderOption;
  16. public class RenderTask {
  17. public void runReport() throws EngineException
  18. {
  19. IReportEngine engine=null;
  20. EngineConfig config = null;
  21. try{
  22. config = new EngineConfig( );
  23. config.setBIRTHome("E:\\birt汉化包\\birt-runtime-3_7_2\\ReportEngine");
  24. config.setLogConfig(null, Level.FINE);
  25. Platform.startup( config );
  26. IReportEngineFactory factory = (IReportEngineFactory) Platform.createFactoryObject( IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY );
  27. engine = factory.createReportEngine( config );
  28. }catch( Exception ex){
  29. ex.printStackTrace();
  30. }
  31. IReportDocument document = null;
  32. //Open the report design
  33. document = engine.openReportDocument("d:\\ps.rptdocument");
  34. IRenderOption options = new RenderOption();
  35. options.setOutputFormat("html");
  36. options.setOutputFileName("d:\\ps.html");
  37. options.setOption( IRenderOption.HTML_PAGINATION,
  38. Boolean.TRUE );
  39. //
  40. //      if( options.getOutputFormat().equalsIgnoreCase("html")){
  41. //          HTMLRenderOption htmlOptions = new HTMLRenderOption( options);
  42. //          htmlOptions.setImageDirectory("output/image");
  43. //          //set this if you want your image source url to be altered
  44. //          //htmlOptions.setBaseImageURL("http://myhos/prependme?image=");
  45. //          htmlOptions.setHtmlRtLFlag(false);
  46. //          htmlOptions.setEmbeddable(false);
  47. //      }else if( options.getOutputFormat().equalsIgnoreCase("pdf") ){
  48. //
  49. //          PDFRenderOption pdfOptions = new PDFRenderOption( options );
  50. //          /*  CLIP_CONTENT:             clip the content
  51. //           *  FIT_TO_PAGE_SIZE:         scale the content to fit into the page
  52. //           *  OUTPUT_TO_MULTIPLE_PAGES: divided the content into multiple pages
  53. //           *  ENLARGE_PAGE_SIZE:        enlarge the page size to contain all the content.
  54. //           */
  55. //          pdfOptions.setOption( IPDFRenderOption.PAGE_OVERFLOW, Integer.valueOf( PDFRenderOption.FIT_TO_PAGE_SIZE ) );
  56. //
  57. //      }
  58. IRenderTask task = engine.createRenderTask(document);
  59. task.setRenderOption(options);
  60. //task.setPageRange("1-3");
  61. //task.setPageNumber(0);
  62. //task.setReportlet("chart3");
  63. task.render();
  64. task.close();
  65. document.close();
  66. engine.destroy();
  67. Platform.shutdown();
  68. System.out.println("Finished");
  69. }
  70. /**
  71. * @param args
  72. */
  73. public static void main(String[] args) {
  74. try
  75. {
  76. RenderTask ex = new RenderTask( );
  77. ex.runReport();
  78. }
  79. catch ( Exception e )
  80. {
  81. e.printStackTrace();
  82. }
  83. System.exit(0);
  84. }
  85. }

报表的设计如下:

运行源码,可以看到D盘导出的文件:

而下面的这段源码,打印了报表的所有参数:

[java] view plaincopy
  1. package REAPI;
  2. import java.util.Collection;
  3. import java.util.Collections;
  4. import java.util.HashMap;
  5. import java.util.Iterator;
  6. import java.util.logging.Level;
  7. import org.eclipse.birt.core.framework.Platform;
  8. import org.eclipse.birt.report.engine.api.EngineConfig;
  9. import org.eclipse.birt.report.engine.api.EngineException;
  10. import org.eclipse.birt.report.engine.api.IGetParameterDefinitionTask;
  11. import org.eclipse.birt.report.engine.api.IParameterDefnBase;
  12. import org.eclipse.birt.report.engine.api.IParameterGroupDefn;
  13. import org.eclipse.birt.report.engine.api.IParameterSelectionChoice;
  14. import org.eclipse.birt.report.engine.api.IReportEngine;
  15. import org.eclipse.birt.report.engine.api.IReportEngineFactory;
  16. import org.eclipse.birt.report.engine.api.IReportRunnable;
  17. import org.eclipse.birt.report.engine.api.IScalarParameterDefn;
  18. import org.eclipse.birt.report.model.api.CascadingParameterGroupHandle;
  19. import org.eclipse.birt.report.model.api.ScalarParameterHandle;
  20. public class ReportParameters {
  21. @SuppressWarnings("unchecked")
  22. static void executeReport() throws EngineException
  23. {
  24. HashMap parmDetails = new HashMap();
  25. IReportEngine engine=null;
  26. EngineConfig config = null;
  27. try{
  28. config = new EngineConfig( );
  29. config.setBIRTHome("E:\\birt汉化包\\birt-runtime-3_7_2\\ReportEngine");
  30. config.setLogConfig(null, Level.OFF);
  31. Platform.startup( config );
  32. IReportEngineFactory factory = (IReportEngineFactory) Platform
  33. .createFactoryObject( IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY );
  34. engine = factory.createReportEngine( config );
  35. }catch( Exception ex){
  36. ex.printStackTrace();
  37. }
  38. //Open a report design
  39. IReportRunnable design = engine.openReportDesign("d:\\parameters.rptdesign");
  40. IGetParameterDefinitionTask task = engine.createGetParameterDefinitionTask( design );
  41. Collection params = task.getParameterDefns( true );
  42. //task.getSelectionListForCascadingGroup();
  43. Iterator iter = params.iterator( );
  44. while ( iter.hasNext( ) )
  45. {
  46. IParameterDefnBase param = (IParameterDefnBase) iter.next( );
  47. if ( param instanceof IParameterGroupDefn )
  48. {
  49. IParameterGroupDefn group = (IParameterGroupDefn) param;
  50. System.out.println( "Parameter Group: " + group.getName( ) );
  51. // Do something with the parameter group.
  52. // Iterate over group contents.
  53. Iterator i2 = group.getContents( ).iterator( );
  54. while ( i2.hasNext( ) )
  55. {
  56. IScalarParameterDefn scalar = (IScalarParameterDefn) i2.next( );
  57. //System.out.println("\t" + scalar.getName());
  58. parmDetails.put( scalar.getName(), loadParameterDetails( task, scalar, design, group));
  59. }
  60. }
  61. else
  62. {
  63. IScalarParameterDefn scalar = (IScalarParameterDefn) param;
  64. //System.out.println(param.getName());
  65. parmDetails.put( scalar.getName(),loadParameterDetails( task, scalar, design, null));
  66. }
  67. }
  68. task.close();
  69. engine.destroy();
  70. Platform.shutdown();
  71. System.out.println("Finished");
  72. }
  73. private static HashMap loadParameterDetails(IGetParameterDefinitionTask task, IScalarParameterDefn scalar, IReportRunnable report, IParameterGroupDefn group){
  74. HashMap parameter = new HashMap();
  75. if( group == null){
  76. parameter.put("Parameter Group""Default");
  77. }else{
  78. parameter.put("Parameter Group", group.getName());
  79. }
  80. parameter.put("Name", scalar.getName());
  81. parameter.put("Help Text", scalar.getHelpText());
  82. parameter.put("Display Name", scalar.getDisplayName());
  83. //this is a format code such as  > for UPPERCASE
  84. parameter.put("Display Format", scalar.getDisplayFormat());
  85. if( scalar.isHidden() ){
  86. parameter.put("Hidden""Yes");
  87. }else{
  88. parameter.put("Hidden""No");
  89. }
  90. if( scalar.isHidden() ){
  91. parameter.put("Hidden""Yes");
  92. }else{
  93. parameter.put("Hidded""No");
  94. }
  95. if( scalar.isRequired() ){
  96. parameter.put("Is Required""Yes");
  97. }else{
  98. parameter.put("Is Required""No");
  99. }
  100. if( scalar.isValueConcealed() ){
  101. parameter.put("Conceal Entry""Yes");  //ie passwords etc
  102. }else{
  103. parameter.put("Conceal Entry""No");
  104. }
  105. switch (scalar.getControlType()) {
  106. case IScalarParameterDefn.TEXT_BOX:  parameter.put("Type""Text Box"); break;
  107. case IScalarParameterDefn.LIST_BOX:  parameter.put("Type""List Box"); break;
  108. case IScalarParameterDefn.RADIO_BUTTON:  parameter.put("Type""List Box"); break;
  109. case IScalarParameterDefn.CHECK_BOX:  parameter.put("Type""List Box"); break;
  110. default: parameter.put("Type""Text Box");break;
  111. }
  112. switch (scalar.getDataType()) {
  113. case IScalarParameterDefn.TYPE_STRING:  parameter.put("Data Type""String"); break;
  114. case IScalarParameterDefn.TYPE_FLOAT:  parameter.put("Data Type""Float"); break;
  115. case IScalarParameterDefn.TYPE_DECIMAL:  parameter.put("Data Type""Decimal"); break;
  116. case IScalarParameterDefn.TYPE_DATE_TIME:  parameter.put("Data Type""Date Time"); break;
  117. case IScalarParameterDefn.TYPE_BOOLEAN:  parameter.put("Data Type""Boolean"); break;
  118. default:  parameter.put("Data Type""Any"); break;
  119. }
  120. ScalarParameterHandle parameterHandle = ( ScalarParameterHandle ) scalar.getHandle();
  121. parameter.put("Default Value", scalar.getDefaultValue());
  122. parameter.put("Prompt Text", scalar.getPromptText());
  123. parameter.put("Data Set Expression", parameterHandle.getValueExpr());
  124. if(scalar.getControlType() !=  IScalarParameterDefn.TEXT_BOX)
  125. {
  126. //System.out.println("dynamic parameter");
  127. if ( parameterHandle.getContainer( ) instanceof CascadingParameterGroupHandle ){
  128. Collection sList = Collections.EMPTY_LIST;
  129. if ( parameterHandle.getContainer( ) instanceof CascadingParameterGroupHandle )
  130. {
  131. String groupName = parameterHandle.getContainer( ).getName( );
  132. //used for Cascading parms see IGetParameterDefinitionTask.java code for comments
  133. //task.evaluateQuery( groupName );
  134. //Need to load this for calls to get next level.
  135. //This just gets the first level
  136. Object [] keyValueTmp = new Object[1];
  137. sList = task.getSelectionListForCascadingGroup( groupName, keyValueTmp );
  138. for ( Iterator sl = sList.iterator( ); sl.hasNext( ); )
  139. {
  140. IParameterSelectionChoice sI = (IParameterSelectionChoice) sl.next( );
  141. Object value = sI.getValue( );
  142. Object label = sI.getLabel( );
  143. System.out.println( label + "--" + value);
  144. }
  145. }
  146. }else{
  147. Collection selectionList = task.getSelectionList( scalar.getName() );
  148. if ( selectionList != null )
  149. {
  150. HashMap dynamicList = new HashMap();
  151. for ( Iterator sliter = selectionList.iterator( ); sliter.hasNext( ); )
  152. {
  153. IParameterSelectionChoice selectionItem = (IParameterSelectionChoice) sliter.next( );
  154. Object value = selectionItem.getValue( );
  155. String label = selectionItem.getLabel( );
  156. //System.out.println( label + "--" + value);
  157. //Display label unless null then display value.  Value is the what should get passed to the report.
  158. dynamicList.put(value,label);
  159. }
  160. parameter.put("Selection List", dynamicList);
  161. }
  162. }
  163. }
  164. Iterator iter = parameter.keySet().iterator();
  165. System.out.println("======================Parameter =" + scalar.getName());
  166. while (iter.hasNext()) {
  167. String name = (String) iter.next();
  168. if( name.equals("Selection List")){
  169. HashMap selList = (HashMap)parameter.get(name);
  170. Iterator selIter = selList.keySet().iterator();
  171. while (selIter.hasNext()) {
  172. Object lbl = selIter.next();
  173. System.out.println( "Selection List Entry ===== Key = " + lbl + " Value = " + selList.get(lbl));
  174. }
  175. }else{
  176. System.out.println( name + " = " + parameter.get(name));
  177. }
  178. }
  179. return parameter;
  180. }
  181. /**
  182. * @param args
  183. */
  184. public static void main(String[] args) {
  185. try
  186. {
  187. executeReport( );
  188. }
  189. catch ( Exception e )
  190. {
  191. e.printStackTrace();
  192. }
  193. }
  194. }

运行结果如下:

[plain] view plaincopy
  1. ======================Parameter =parameter1
  2. Hidded = No
  3. Default Value = 1
  4. Type = Text Box
  5. Conceal Entry = No
  6. Hidden = No
  7. Data Set Expression = null
  8. Name = parameter1
  9. Is Required = Yes
  10. Help Text = null
  11. Parameter Group = Default
  12. Display Name = null
  13. Display Format = #,##0.00%
  14. Data Type = Decimal
  15. Prompt Text = "This i prompt text"
  16. Parameter Group: ParmGroup1
  17. ======================Parameter =Parameter2
  18. Hidded = No
  19. Default Value = parm2
  20. Type = Text Box
  21. Conceal Entry = No
  22. Hidden = No
  23. Data Set Expression = null
  24. Name = Parameter2
  25. Is Required = No
  26. Help Text = null
  27. Parameter Group = ParmGroup1
  28. Display Name = null
  29. Display Format = Unformatted
  30. Data Type = String
  31. Prompt Text = null
  32. ======================Parameter =Parameter3
  33. Hidded = No
  34. Default Value = 10101
  35. Type = List Box
  36. Conceal Entry = No
  37. Hidden = No
  38. Selection List Entry ===== Key = 10346 Value = 10346
  39. Selection List Entry ===== Key = 10207 Value = 10207
  40. Selection List Entry ===== Key = 10347 Value = 10347
  41. Selection List Entry ===== Key = 10208 Value = 10208
  42. Selection List Entry ===== Key = 10344 Value = 10344
  43. Selection List Entry ===== Key = 10205 Value = 10205
  44. Selection List Entry ===== Key = 10345 Value = 10345
  45. Selection List Entry ===== Key = 10206 Value = 10206
  46. Selection List Entry ===== Key = 10342 Value = 10342
  47. Selection List Entry ===== Key = 10343 Value = 10343
  48. Selection List Entry ===== Key = 10340 Value = 10340
  49. Selection List Entry ===== Key = 10209 Value = 10209
  50. Selection List Entry ===== Key = 10341 Value = 10341
  51. Selection List Entry ===== Key = 10200 Value = 10200
  52. Selection List Entry ===== Key = 10203 Value = 10203
  53. Selection List Entry ===== Key = 10204 Value = 10204
  54. Selection List Entry ===== Key = 10348 Value = 10348
  55. Selection List Entry ===== Key = 10201 Value = 10201
  56. Selection List Entry ===== Key = 10349 Value = 10349
  57. Selection List Entry ===== Key = 10202 Value = 10202
  58. Selection List Entry ===== Key = 10333 Value = 10333
  59. Selection List Entry ===== Key = 10334 Value = 10334
  60. Selection List Entry ===== Key = 10335 Value = 10335
  61. Selection List Entry ===== Key = 10336 Value = 10336
  62. Selection List Entry ===== Key = 10330 Value = 10330
  63. Selection List Entry ===== Key = 10331 Value = 10331
  64. Selection List Entry ===== Key = 10332 Value = 10332
  65. Selection List Entry ===== Key = 10337 Value = 10337
  66. Selection List Entry ===== Key = 10338 Value = 10338
  67. Selection List Entry ===== Key = 10339 Value = 10339
  68. Selection List Entry ===== Key = 10320 Value = 10320
  69. Selection List Entry ===== Key = 10321 Value = 10321
  70. Selection List Entry ===== Key = 10324 Value = 10324
  71. Selection List Entry ===== Key = 10229 Value = 10229
  72. Selection List Entry ===== Key = 10325 Value = 10325
  73. Selection List Entry ===== Key = 10322 Value = 10322
  74. Selection List Entry ===== Key = 10227 Value = 10227
  75. Selection List Entry ===== Key = 10323 Value = 10323
  76. Selection List Entry ===== Key = 10228 Value = 10228
  77. Selection List Entry ===== Key = 10328 Value = 10328
  78. Selection List Entry ===== Key = 10225 Value = 10225
  79. Selection List Entry ===== Key = 10329 Value = 10329
  80. Selection List Entry ===== Key = 10226 Value = 10226
  81. Selection List Entry ===== Key = 10326 Value = 10326
  82. Selection List Entry ===== Key = 10223 Value = 10223
  83. Selection List Entry ===== Key = 10327 Value = 10327
  84. Selection List Entry ===== Key = 10224 Value = 10224
  85. Selection List Entry ===== Key = 10221 Value = 10221
  86. Selection List Entry ===== Key = 10222 Value = 10222
  87. Selection List Entry ===== Key = 10220 Value = 10220
  88. Selection List Entry ===== Key = 10310 Value = 10310
  89. Selection List Entry ===== Key = 10311 Value = 10311
  90. Selection List Entry ===== Key = 10216 Value = 10216
  91. Selection List Entry ===== Key = 10312 Value = 10312
  92. Selection List Entry ===== Key = 10217 Value = 10217
  93. Selection List Entry ===== Key = 10313 Value = 10313
  94. Selection List Entry ===== Key = 10218 Value = 10218
  95. Selection List Entry ===== Key = 10314 Value = 10314
  96. Selection List Entry ===== Key = 10219 Value = 10219
  97. Selection List Entry ===== Key = 10315 Value = 10315
  98. Selection List Entry ===== Key = 10212 Value = 10212
  99. Selection List Entry ===== Key = 10316 Value = 10316
  100. Selection List Entry ===== Key = 10213 Value = 10213
  101. Selection List Entry ===== Key = 10317 Value = 10317
  102. Selection List Entry ===== Key = 10214 Value = 10214
  103. Selection List Entry ===== Key = 10318 Value = 10318
  104. Selection List Entry ===== Key = 10215 Value = 10215
  105. Selection List Entry ===== Key = 10319 Value = 10319
  106. Selection List Entry ===== Key = 10210 Value = 10210
  107. Selection List Entry ===== Key = 10211 Value = 10211
  108. Selection List Entry ===== Key = 10244 Value = 10244
  109. Selection List Entry ===== Key = 10243 Value = 10243
  110. Selection List Entry ===== Key = 10242 Value = 10242
  111. Selection List Entry ===== Key = 10241 Value = 10241
  112. Selection List Entry ===== Key = 10248 Value = 10248
  113. Selection List Entry ===== Key = 10247 Value = 10247
  114. Selection List Entry ===== Key = 10246 Value = 10246
  115. Selection List Entry ===== Key = 10245 Value = 10245
  116. Selection List Entry ===== Key = 10389 Value = 10389
  117. Selection List Entry ===== Key = 10388 Value = 10388
  118. Selection List Entry ===== Key = 10249 Value = 10249
  119. Selection List Entry ===== Key = 10387 Value = 10387
  120. Selection List Entry ===== Key = 10386 Value = 10386
  121. Selection List Entry ===== Key = 10385 Value = 10385
  122. Selection List Entry ===== Key = 10384 Value = 10384
  123. Selection List Entry ===== Key = 10382 Value = 10382
  124. Selection List Entry ===== Key = 10383 Value = 10383
  125. Selection List Entry ===== Key = 10380 Value = 10380
  126. Selection List Entry ===== Key = 10381 Value = 10381
  127. Selection List Entry ===== Key = 10240 Value = 10240
  128. Selection List Entry ===== Key = 10231 Value = 10231
  129. Selection List Entry ===== Key = 10230 Value = 10230
  130. Selection List Entry ===== Key = 10233 Value = 10233
  131. Selection List Entry ===== Key = 10232 Value = 10232
  132. Selection List Entry ===== Key = 10235 Value = 10235
  133. Selection List Entry ===== Key = 10234 Value = 10234
  134. Selection List Entry ===== Key = 10237 Value = 10237
  135. Selection List Entry ===== Key = 10236 Value = 10236
  136. Selection List Entry ===== Key = 10378 Value = 10378
  137. Selection List Entry ===== Key = 10239 Value = 10239
  138. Selection List Entry ===== Key = 10377 Value = 10377
  139. Selection List Entry ===== Key = 10238 Value = 10238
  140. Selection List Entry ===== Key = 10379 Value = 10379
  141. Selection List Entry ===== Key = 10374 Value = 10374
  142. Selection List Entry ===== Key = 10373 Value = 10373
  143. Selection List Entry ===== Key = 10376 Value = 10376
  144. Selection List Entry ===== Key = 10375 Value = 10375
  145. Selection List Entry ===== Key = 10370 Value = 10370
  146. Selection List Entry ===== Key = 10371 Value = 10371
  147. Selection List Entry ===== Key = 10372 Value = 10372
  148. Selection List Entry ===== Key = 10269 Value = 10269
  149. Selection List Entry ===== Key = 10268 Value = 10268
  150. Selection List Entry ===== Key = 10267 Value = 10267
  151. Selection List Entry ===== Key = 10266 Value = 10266
  152. Selection List Entry ===== Key = 10265 Value = 10265
  153. Selection List Entry ===== Key = 10264 Value = 10264
  154. Selection List Entry ===== Key = 10263 Value = 10263
  155. Selection List Entry ===== Key = 10365 Value = 10365
  156. Selection List Entry ===== Key = 10364 Value = 10364
  157. Selection List Entry ===== Key = 10363 Value = 10363
  158. Selection List Entry ===== Key = 10362 Value = 10362
  159. Selection List Entry ===== Key = 10369 Value = 10369
  160. Selection List Entry ===== Key = 10368 Value = 10368
  161. Selection List Entry ===== Key = 10367 Value = 10367
  162. Selection List Entry ===== Key = 10366 Value = 10366
  163. Selection List Entry ===== Key = 10360 Value = 10360
  164. Selection List Entry ===== Key = 10361 Value = 10361
  165. Selection List Entry ===== Key = 10261 Value = 10261
  166. Selection List Entry ===== Key = 10262 Value = 10262
  167. Selection List Entry ===== Key = 10260 Value = 10260
  168. Selection List Entry ===== Key = 10257 Value = 10257
  169. Selection List Entry ===== Key = 10359 Value = 10359
  170. Selection List Entry ===== Key = 10256 Value = 10256
  171. Selection List Entry ===== Key = 10259 Value = 10259
  172. Selection List Entry ===== Key = 10258 Value = 10258
  173. Selection List Entry ===== Key = 10253 Value = 10253
  174. Selection List Entry ===== Key = 10252 Value = 10252
  175. Selection List Entry ===== Key = 10255 Value = 10255
  176. Selection List Entry ===== Key = 10254 Value = 10254
  177. Selection List Entry ===== Key = 10352 Value = 10352
  178. Selection List Entry ===== Key = 10351 Value = 10351
  179. Selection List Entry ===== Key = 10354 Value = 10354
  180. Selection List Entry ===== Key = 10353 Value = 10353
  181. Selection List Entry ===== Key = 10356 Value = 10356
  182. Selection List Entry ===== Key = 10355 Value = 10355
  183. Selection List Entry ===== Key = 10358 Value = 10358
  184. Selection List Entry ===== Key = 10357 Value = 10357
  185. Selection List Entry ===== Key = 10350 Value = 10350
  186. Selection List Entry ===== Key = 10250 Value = 10250
  187. Selection List Entry ===== Key = 10251 Value = 10251
  188. Selection List Entry ===== Key = 10152 Value = 10152
  189. Selection List Entry ===== Key = 10151 Value = 10151
  190. Selection List Entry ===== Key = 10150 Value = 10150
  191. Selection List Entry ===== Key = 10130 Value = 10130
  192. Selection List Entry ===== Key = 10400 Value = 10400
  193. Selection List Entry ===== Key = 10402 Value = 10402
  194. Selection List Entry ===== Key = 10401 Value = 10401
  195. Selection List Entry ===== Key = 10404 Value = 10404
  196. Selection List Entry ===== Key = 10291 Value = 10291
  197. Selection List Entry ===== Key = 10403 Value = 10403
  198. Selection List Entry ===== Key = 10290 Value = 10290
  199. Selection List Entry ===== Key = 10406 Value = 10406
  200. Selection List Entry ===== Key = 10405 Value = 10405
  201. Selection List Entry ===== Key = 10408 Value = 10408
  202. Selection List Entry ===== Key = 10295 Value = 10295
  203. Selection List Entry ===== Key = 10407 Value = 10407
  204. Selection List Entry ===== Key = 10294 Value = 10294
  205. Selection List Entry ===== Key = 10293 Value = 10293
  206. Selection List Entry ===== Key = 10409 Value = 10409
  207. Selection List Entry ===== Key = 10292 Value = 10292
  208. Selection List Entry ===== Key = 10298 Value = 10298
  209. Selection List Entry ===== Key = 10299 Value = 10299
  210. Selection List Entry ===== Key = 10296 Value = 10296
  211. Selection List Entry ===== Key = 10297 Value = 10297
  212. Selection List Entry ===== Key = 10139 Value = 10139
  213. Selection List Entry ===== Key = 10159 Value = 10159
  214. Selection List Entry ===== Key = 10135 Value = 10135
  215. Selection List Entry ===== Key = 10136 Value = 10136
  216. Selection List Entry ===== Key = 10157 Value = 10157
  217. Selection List Entry ===== Key = 10137 Value = 10137
  218. Selection List Entry ===== Key = 10158 Value = 10158
  219. Selection List Entry ===== Key = 10138 Value = 10138
  220. Selection List Entry ===== Key = 10155 Value = 10155
  221. Selection List Entry ===== Key = 10131 Value = 10131
  222. Selection List Entry ===== Key = 10156 Value = 10156
  223. Selection List Entry ===== Key = 10132 Value = 10132
  224. Selection List Entry ===== Key = 10153 Value = 10153
  225. Selection List Entry ===== Key = 10133 Value = 10133
  226. Selection List Entry ===== Key = 10154 Value = 10154
  227. Selection List Entry ===== Key = 10134 Value = 10134
  228. Selection List Entry ===== Key = 10161 Value = 10161
  229. Selection List Entry ===== Key = 10141 Value = 10141
  230. Selection List Entry ===== Key = 10160 Value = 10160
  231. Selection List Entry ===== Key = 10140 Value = 10140
  232. Selection List Entry ===== Key = 10163 Value = 10163
  233. Selection List Entry ===== Key = 10162 Value = 10162
  234. Selection List Entry ===== Key = 10168 Value = 10168
  235. Selection List Entry ===== Key = 10148 Value = 10148
  236. Selection List Entry ===== Key = 10169 Value = 10169
  237. Selection List Entry ===== Key = 10149 Value = 10149
  238. Selection List Entry ===== Key = 10146 Value = 10146
  239. Selection List Entry ===== Key = 10147 Value = 10147
  240. Selection List Entry ===== Key = 10164 Value = 10164
  241. Selection List Entry ===== Key = 10144 Value = 10144
  242. Selection List Entry ===== Key = 10165 Value = 10165
  243. Selection List Entry ===== Key = 10145 Value = 10145
  244. Selection List Entry ===== Key = 10166 Value = 10166
  245. Selection List Entry ===== Key = 10142 Value = 10142
  246. Selection List Entry ===== Key = 10167 Value = 10167
  247. Selection List Entry ===== Key = 10143 Value = 10143
  248. Selection List Entry ===== Key = 10422 Value = 10422
  249. Selection List Entry ===== Key = 10170 Value = 10170
  250. Selection List Entry ===== Key = 10421 Value = 10421
  251. Selection List Entry ===== Key = 10424 Value = 10424
  252. Selection List Entry ===== Key = 10423 Value = 10423
  253. Selection List Entry ===== Key = 10174 Value = 10174
  254. Selection List Entry ===== Key = 10173 Value = 10173
  255. Selection List Entry ===== Key = 10420 Value = 10420
  256. Selection List Entry ===== Key = 10172 Value = 10172
  257. Selection List Entry ===== Key = 10171 Value = 10171
  258. Selection List Entry ===== Key = 10273 Value = 10273
  259. Selection List Entry ===== Key = 10272 Value = 10272
  260. Selection List Entry ===== Key = 10271 Value = 10271
  261. Selection List Entry ===== Key = 10270 Value = 10270
  262. Selection List Entry ===== Key = 10425 Value = 10425
  263. Selection List Entry ===== Key = 10117 Value = 10117
  264. Selection List Entry ===== Key = 10118 Value = 10118
  265. Selection List Entry ===== Key = 10119 Value = 10119
  266. Selection List Entry ===== Key = 10278 Value = 10278
  267. Selection List Entry ===== Key = 10279 Value = 10279
  268. Selection List Entry ===== Key = 10276 Value = 10276
  269. Selection List Entry ===== Key = 10277 Value = 10277
  270. Selection List Entry ===== Key = 10274 Value = 10274
  271. Selection List Entry ===== Key = 10275 Value = 10275
  272. Selection List Entry ===== Key = 10177 Value = 10177
  273. Selection List Entry ===== Key = 10178 Value = 10178
  274. Selection List Entry ===== Ke

十三、BIRT报表引擎API及报表API相关推荐

  1. 如何设计一个报表引擎

    编者按:流程的执行离不开报表数据,而报表引擎是处理报表数据的关键,那么如何设计一个报表引擎呢?它的应用场景有哪些? 报表引擎 重要变革 在报表历史上,有两次重要变革,第一次革命,针对进入中国市场的外国 ...

  2. 报表引擎 - 报表应用思路

    OpenExpressApp计划之内包括一个报表引擎OpenReport.2006年时在公司负责研究并实现了一个报表引擎,写了几篇博文(<交叉表的报表设计>.<研究润乾报表的实现&g ...

  3. 报表引擎API开发入门— EJB程序数据源

    2019独角兽企业重金招聘Python工程师标准>>> 我们前面讲了几个数据源,今天我们来讲一下EJB数据源,这篇讲完我们数据源这部分就讲完了.数据连接不需要直接访问数据库,而是使用 ...

  4. 报表引擎API开发入门—简单程序数据集

    小编最近接的项目是有关报表开发的,很想把这部分知识分享出来.希望大家能够支持我!不多说,马上进入我们今天的话题. API基本知识 小编最近项目所做的是关于一个报表软件-FineReport报表开发的一 ...

  5. birt java api_「Birt」birt api生成报表 | 学步园

    public class PDFReportServiceAccess { /** */ /** 初始化的状态 */ protected static boolean initStatus = fal ...

  6. JimuReport积木报表 — API数据源报表制作

    积木报表 ,一个开源免费的报表工具,像搭建积木一样在线设计报表!功能涵盖数据报表设计.打印设计.图表设计.大屏设计等! 领先的企业级Web报表平台软件,采用纯Web在线技术,专注于解决企业报表快速制作 ...

  7. vfp报表纸张设置_JimuReport积木报表 — API数据源报表制作

    积木报表 ,一个开源免费的报表工具,像搭建积木一样在线设计报表!功能涵盖数据报表设计.打印设计.图表设计.大屏设计等! 领先的企业级Web报表平台软件,采用纯Web在线技术,专注于解决企业报表快速制作 ...

  8. 如何开发一款报表引擎(一) 框架梳理

    最近大佬跟我说,你来开发一款报表引擎,不要多复杂,只要实现这些功能就行:当时我内心惶恐,因为光是理解这个引擎我就觉得挺费劲,毕竟跟我之前开发的东西不太一样,但是这件事情大佬发话了,那就是要想办法去倒腾 ...

  9. BIRT:基于 Eclipse 的报表

      胡键 , 西安交通大学硕士 2006 年 3 月 22 日 几乎在各种应用中,报表都具有其不可替代的作用.各类报表软件也是争奇斗艳,如今Eclipse也推出了自己的报表框架:BIRT.现在,让我们 ...

最新文章

  1. 华为系列交换机日志服务器的搭建
  2. Java 技术篇-用java自带的内存检测工具排查内存泄漏问题,查看java垃圾回收情况,监控java堆内存变化
  3. AB1601中volatile的使用
  4. Selenium 控制浏览器
  5. 006-JDK的安装测试
  6. 军用装备产品GJB150A淋雨试验检测机构
  7. 宇视监控摄像头使用什么工具批量修改IP地址
  8. 区块链相关技术学习总结(1)——区块链以及区块链技术入门详解
  9. 最新Permute 3 mac(万能音视频转换器)v3.9.6
  10. 对接第三方支付接口-支付宝方式对接(我这边对接的是ecpay公司支付接口)
  11. 领导想延长我的试用期,我该怎么办?
  12. PHR-search:一个基于预测蛋白质层次关系的蛋白质远程同源性检测搜索框
  13. mysql反思范文_MySQL学习笔记(一)
  14. 对称、群论与魔术(三)——常见的几何对称性简介
  15. 美国计算机留学直博几年,美国读博士需要几年才能毕业?
  16. 简智音科技:出色的抖音短视频需要以下几款辅助软件!
  17. java是什么?好学吗?
  18. 基于C语言设计的植物大战僵尸小游戏
  19. 深圳入户办理流程大致是怎样的?
  20. 使用余弦定理计算反三角函数却报超出定义域

热门文章

  1. MIT团队:开发自动化假新闻检测器|技术前沿洞察
  2. 3DES 密钥部分记录
  3. 赛桨PaddleScience v1.0正式版发布,飞桨科学计算能力全面升级!
  4. 原型和原型链原型继承_原型制作的最甜蜜的一面
  5. Java程序员惯性思维的一个错误
  6. 新公司法中增加股东诉讼的规定
  7. 【Java源码分析】String 比较 equals
  8. latex 调整作者间距
  9. Latex排版Algorithm之algorithmic,algorithmicx,algorithm2e
  10. java 带界面的小程序_JAVA 编写一个带有窗口的应用程序