BIRT(一)安装Birt报表工具
商业智能(十八) 安装BIRT 发现自己还上了javaeye的头版了,也算是灌水灌出了自己的特色了吧, 希望自己还是加紧时间学习,好为大家提供更多更好的优质纯净水.
|
如何构建一个Birt报表应用程序(一)
最近研究birt,资料太少,但是无意间找到了birt的官方教程,比较不错,闲来翻译整理了一些贴出来和大家分享。 |
如何构建一个Birt报表应用程序(二)
下面详细介绍如何构建一个报表应用程序
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已经提供了足够的图像文件接口因此一般情况下不需要我们进行扩展。
如何构建一个Birt报表应用程序(三)
启动平台 Java代码// Create an EngineConfig object.
// Create an EngineConfig object. EngineConfig config = new EngineConfig( ); // Set up the path to your BIRT home directory. config.setBIRTHome( "C:/Program Files/birt-runtime-2_2_1/ReportEngine" ); // Explicitly set up the stand-alone application IPlatformContext context = new PlatformFileContext( ); config.setEngineContext( context ); // Start the platform for a non-RCP application. Platform.startup( config ); IReportEngineFactory factory = ( IReportEngineFactory ) Platform.createFactoryObject ( IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY ); // Set up writing images or charts embedded in HTML output. HTMLRenderOption ho = new HTMLRenderOption( ); ho.setImageHandler( new HTMLCompleteImageHandler( )); config.setEmitterConfiguration( RenderOptionBase.OUTPUT_FORMAT_HTML, ho ); // Create the engine. IReportEngine engine = factory.createReportEngine( config );
Java代码 // Example class to create the report engine
// Example class to create the report engine public class BirtEngine { private static IReportEngine birtEngine = null; public static synchronized IReportEngine getBirtEngine( ServletContext sc ) { if (birtEngine == null) { EngineConfig config = new EngineConfig( ); config.setBIRTHome( "" ); IPlatformContext context = new PlatformServletContext( sc ); config.setPlatformContext( context ); try{ Platform.startup( config ); IReportEngineFactory factory = ( IReportEngineFactory ) Platform.createFactoryObject( IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY ); birtEngine = factory.createReportEngine( config ); }catch ( Exception e ) { e.printStackTrace( ); } } return birtEngine; } }
Java代码
// In a different class, get the report engine reportEngine = BirtEngine.getBirtEngine( request.getSession( ).getServletContext( )); // Set up the engine EngineConfig config = reportEngine.getConfig( ); HTMLRenderOption ho = new HTMLRenderOption( ); ho.setImageHandler( new HTMLServerImageHandler( )); ho.setImageDirectory("output/image"); ho.setBaseImageURL("http://myhost/prependme?image="); config.setEmitterConfiguration( RenderOptionBase.OUTPUT_FORMAT_HTML, ho );
Java代码
|
如何构建一个Birt报表应用程序(四)
二、打开报表资源文件 Java代码
String designName = "./SimpleReport.rptdesign"; IReportRunnable runnable = null; try { runnable = engine.openReportDesign( designName ); }catch ( EngineException e ) { System.err.println( "Design " + designName + " not found!" ); engine.destroy( ); System.exit( -1 ); } // Get the value of a simple property. String author = ( String ) runnable.getProperty( IReportRunnable.AUTHOR );
Java代码
|
如何构建一个Birt报表应用程序(五)
三、用程序处理报表参数 Java代码
// Create a parameter definition task. IGetParameterDefinitionTask task = engine.createGetParameterDefinitionTask( runnable ); // Instantiate a scalar parameter. IScalarParameterDefn param = (IScalarParameterDefn) task.getParameterDefn( "customerID" ); // Get the default value of the parameter. In this case, // the data type of the parameter, customerID, is Double. int customerID = ((Double) task.getDefaultValue( param )).intValue( ); // Get a value for the parameter. This example assumes that // this step creates a correctly typed object, inputValue. // Set the value of the parameter. task.setParameterValue( "customerID", inputValue ); // Get the values set by the application for all parameters. HashMap parameterValues = task.getParameterValues( ); // Close the parameter definition task. task.close( );
Java代码
// Create a parameter definition task. IGetParameterDefinitionTask task = engine.createGetParameterDefinitionTask( runnable ); // Create a collection of the parameters in the report design. Collection params = task.getParameterDefns( false ); // Get the default values of the parameters. HashMap parameterValues = task.getDefaultValues( ); // Get values for the parameters. Later code in this example // assumes that this step creates a HashMap object, // inputValues. The keys in the HashMap are the parameter // names and the values are those that the user provided. // Iterate through the report parameters, setting the values // in standard locale-independent format. Iterator iterOuter = params.iterator( ); ReportParameterConverter cfgConverter = new ReportParameterConverter( "", Locale.getDefault() ); while ( iterOuter.hasNext( ) ) { IParameterDefnBase param = (IParameterDefnBase) iterOuter.next( ); String value = (String) inputValues.get( param.getName( )); if ( value != null ) { parameterValues.put( param.getName( ), cfgConverter.parse( value, param.getDataType( ) ) ); } } // Close the parameter definition task. task.close( );
Java代码
|
如何构建一个Birt报表应用程序(六)
四、报表生成的准备工作 Java代码
configOrTask.getAppContext( ).put( EngineConstants.APPCONTEXT_CLASSLOADER_KEY, MyClass.class.getClassLoader( ));
Java代码
config.setProperty( EngineConstants.WEBAPP_CLASSPATH_KEY, "c:/myjars/jar1.jar;c:/myclasses" );
Java代码
System.setProperty(EngineConstants.WEBAPP_CLASSPATH_KEY, "c:/myjars/jar1.jar;c:/myclasses" );
Java代码
|
如何构建一个Birt报表应用程序(七)
设置rendering选项 Java代码
// Create a run and render task object. IRunAndRenderTask task = engine.createRunAndRenderTask( runnable ); // Set values for all parameters in a HashMap, parameterValues task.setParameterValues( parameterValues ); // Validate parameter values. boolean parametersAreGood = task.validateParameters( ); // Set the name of an output file. HTMLRenderOption options = new HTMLRenderOption( ); String output = name.replaceFirst( ".rptdesign", ".html" ); options.setOutputFileName( output ); options.setImageDirectory( "image" ); options.setHtmlRtLFlag( true ); options.setEmbeddable( false ); // Apply the rendering options to the task. task.setRenderOption( options ); // Run and close the task task.run(); task.close();
|
如何构建一个Birt报表应用程序(八)
五、生成报表 Java代码
try { task.run( ); System.out.println( "Created Report " + output + "." ); }catch ( EngineException e1 ) { System.err.println( "Report " + name + " run failed." ); System.err.println( e1.toString( ) ); } engine.destroy( );
Java代码
private class CancelReport extends Thread { private IEngineTask eTask; public CancelReport( String myName, IEngineTask task ) { super( myName ); eTask = task; } public void cancel( ) { try { Thread.currentThread( ).sleep( 100 ); eTask.cancel( ); System.out.println( "#### Report cancelled #####" ); }catch( Exception e ) { e.printStackTrace(); } } } CancelReport cancelThread = new CancelReport( "cancelReport", task); cancelThread.cancel( );
|
BIRT学习小结
自己写的birt学习笔记,由于是根据英文教材学习的,可能在理解上会出现一些偏差,见谅……,如需要示例,可以联系我 BIRT概述 BIRT (Business Intelligence and Reporting Tools), 是为 Web 应用程序开发的基于 Eclipse 的开源报表系统,特别之处在于它是以 Java 和 J2EE 为基础。BIRT 有两个主要组件:基于 Eclipse 的报表设计器,以及部署到应用服务器上的运行时组件。BIRT 也提供了图标引擎让你能为应用增加图表。 有了 BIRT,你可以为应用程序构建丰富的报表。 列表 - 列表是最简单的报表。当列表变长时,你可以把相关数据增加到同一分组(基于客户的订单分组,基于供应商的产品分组)。如果数据是数字类型的,你可以轻松的添加到“总数”、“平均”、或其他汇总中。 图表 - 当需要图表表现时,数字型数据比较好理解。BIRT 也提供饼状、线状以及柱状图标等。 交叉表 - 交叉表(也叫做十字表格或矩阵)用两种维度展示数据 信函和文档 - 通知、信件、以及其他文本文档都很容易通过 BIRT 方便建立。文档包括正文、格式、列表、图表等。 混合报表 - 很多报表需要联合以上所有的报表构成单一文档。例如,一份客户声明会列出客户所需要的信息,为当前促进(promotions)提供文本,以及提供并行的出帐和入帐列表。一份财政报表将包括声明、图表、表格,所有这些都将进行全方位的格式化,来匹配共有的配色方案。 BIRT开发流程概述 配置BIRT开发环境 我们可以基于eclipse进行birt的开发,在这里,我们在eclipse中集成了myeclipse7,由于myeclipse7已经集成了birt组件,所以我们只需要安装 myeclipse7插件即可。 配置数据源 数据源及报表所需要的数据的来源,报表展示的数据均来自数据源中。 BIRT目前支持多种数据源,具体包括数据库数据源 ,webservice数据源和xml数据源,和javascript数据源。目前最常见的数据源是数据库数据源。 配置报表用到的数据集 具体报表中用到的数据集合叫做数据集,数据集是按照一定的条件从数据源中获取到的数据集合。数据集中的数据可以被排序、过滤、以及分组。 设计报表 通过BIRT的开发平台,我们可以很方便快捷的设计出复杂、美观的报表。一个报表的信息存储在一个xml格式的报表文件中。 我们可以打开一个报表文件先看一下,在这里报表的文件看起来很复杂,所以,一般我们都是通过可视化开发工具进行报表文件的编辑。 部署报表到程序 当报表设计完成后,我们需要将其部署到相应的应用程序以供用户使用。BIRT提供了相应的运行时环境,可以将其整合到我们的web应用中,这样就可以运行报表了。 一个实例 实例说明 假设有这样一个报表设计开发要求:在mysql数据库中有一张与产品有关的数据表,其中包含产品分类名称、产品编号、产品名称、产品价格四个字段。 要求通过一张图表,按照产品的分类,罗列出各个分类下的产品详细信息。并统计每一分类下的产品数。 最后通过饼图将每个分类下的产品数量统计出来。 创建工程 首先我们创建一个工程,将其命名为reportShow;然后向其增加开发报表的报表功能。 选择file-new –reportProject,选择j2ee5.0,并将工程名称命名为:reportShow。我们先来看一下整个工程的结构:这个工程和普通的java web工程结构是一样的。不同的是多出了报表所用的运行时环境,主要是report web lib,以及在web.xml中添加了相应的servlet配置。 创建报表 下面我们将创建一个报表文件,将其命名为demoReport。 我们在reports文件夹下点击右键选择new -– report,输入报表名称:demoReport.rptdesign,选择空白报表一项;选择使用嵌入式标签进行展示;点击完成。这样就创建了一个报表文件。 现在我们来看一下,刚才的操作创建了两个文件,一个是/demoReport.jsp,用于演示报表jsp页面,另一个是:/reports/demoReport.rptdesign,使我们接下来需要编辑的报表文件。 数据库、数据源和数据集的配置 打开demoReport.rptdesign文件,我们现在首先要做的是配置数据源,以获取数据 我们使用数据库类型的数据源作为当前报表的数据源,我们使用mysql数据库,数据库名称为birtDemo,在其中有一名为product的表,包括4列:id 、name、price,categoryName分别代表主键,产品名称,价格,所属分类名称。 接下来,我们配置下birt数据源。在data explore面板中选择dataSource,右键选择new dataSource ,选择数据库数据源。选择:com.mysql.jdbc.driver.这个是已经配置好的数据源。由于时间有限,数据库数据源参数的具体配置请参见myeclipse 数据源的配置方式,在这里不再演示。 点击测试,检测是否能够连接到数据库中。若测试通过,则数据库数据源创建成功。 接下来我们创建数据集product,这里的product数据集,将包括birtDemo数据库的product表中的所有数据. 在dataSet上,右键选择new Data Set,输入数据集名称“product”,所属的数据源选择默认数据源即可。点击下一步,输入数据集查询语句:select * from birtdemo.product ,点击完成。接下来我们可以预览一下刚创建的数据集,如果有不满意的地方还可以对其进行修改。 预览一下,确实查询到了所有的数据。完成数据集的创建操作。 设计报表 我们首先将product数据集中的所有数据展示在一个表格中。 在 palette 面板中拖动一个table对象到右侧文件中,这样会在报表文件中添加一个列表对象。 选择列数。然后在data explore面板中,拖动product数据集的各个列到tabe中。切换到预览标签,我们可以看一下此时的展示效果:在table中列出了数据集的各个列的数据。 接下来,我们修改下列表的表头部分。分别改为:编号、名称、价格、分类。 下面,我们对报表进行按照分类进行分组操作。 首先我们调整一下各列的展示顺序,换成分类、编号、名称、价格。 然后在表格上按右键选择增加分组,选择分组列:categoryName。这样,就添加了一个分组到报表中。 接下来我们去掉多余的字段,并调整分组的样式【将分组改为对齐数据第一行并使其竖行剧中展示】。 下面我们对报表进行下美化。我们采取样式表的方式对列表进行美化。 先创建一个样式表文件:report.css,将其放置到css文件夹中。在其中添加上表格样式: .tables{ text-align:center; line-height:25px; font-size:14px; margin: 0; border: 1px solid #99CCCC; } .table-header{ color:red; } 我们在报表文件的out-line面板中导入这个文件:在Styles上按右键,选择Use Css File,选择我们刚才创建的文件,完成css文件的引入。 然后我们在报表的table上选择style—apply style 选择tables,这样就增加了样式到表格上了。我们可以预览一下效果。 我们接着给当前的报表增加一个图表,以饼图的形式,统计各个分类的产品数量。 我们先来定义一个数据集:叫做productStat,这里按照分类名称进行分组,取得分组名称以及分组中包含的数目。 select birtdemo.product.categoryName, count(birtdemo.product.price) from birtdemo.product group by birtdemo.product.categoryName 接下来,我们在报表文件中拖入一个Chart组件,我们选择chart的类型为pie,即饼图。在数据选择标签中,我们选择使用数据集的方式,选中刚创建的数据集productSta。 将分类名称部分拖动到分类部分;将总数部分拖动到左侧作为饼图的值。保存后点击报表的预览看一下效果。这样,一个简单的饼图就添加到报表中了。 发布 到目前为止,我们还只是在birt的开发环境中预览报表文件的效果,下面我们将在实际环境中运行报表看一下。 首先打开创建报表时自动生成的页面:demoReport.jsp 页面中使用了<birt:viewer>标签来访问我们刚才创建的报表,几个参数的意思很明显,分别指定了报表路径以及展示格式等。 最后,我们部署刚创建的应用,运行一下看一下实际效果。 |