xhchc

危波帆墙,笑谈只在桃花上;与谁共尚,风吹万里浪; 相依相偎,不做黄泉想;莫惆怅,碧波潮生,一萧自狂放……

 

BIRT部署并利用API生成PDF

注:本文转自 http://blog.csdn.net/xujiaqiang/archive/2008/01/19/2052789.aspx

感谢作者分享。

 

Birt报表设计步骤:

1、下载birt all in one 2.2.1.1,包含eclipse,解开下载文件
      启动eclipse,必须使用JDK1.5启动eclipse,否则新建工程对话框中没有birt的相关选项


2、新建report project和report
      打开data explorer视图,新建一个data sources,定义数据库连接driver/url/用户名/密码,在"Manage Drivers..."中把jdbc的jar加进来


3、新建Report Parameter,设置参数名称、类型,参数值将来通过url传递或使用程序方式赋值


4、新建data sets,设置Query,即preparedStatement语句,设置data set的Pameters,即reparedStatement中的“?”,使之和report parameter关联; 如果data set的Parameter的值不是来自于Report Parameter,例如来自另外一个data set, 可不设置关联,而在报表内容中设置和其它data set字段的关联(见步骤8)

5、如果data set对应的sql是动态生成的,可以设置“property Binding”,在Query Text中输入sql和表达式,其中可以使用Report Parameter和javascript语句,运行时将执行Property Binding中的Query Text,而不执行Query中的preparedStatement,但是Query中的preparedStatement在设计报表时还是有用的,因为可以看到运行结果的字段列表,只要preparedStatement和Query Text返回相同的字段即可

6、将定义好的data set拖动到设计界面上,会自动在报表放置一个Table

7、如要对table的某列合计,从Palette视图中拖一个“Aggregation”到设计界面

8、如要Master-Sleve报表,则在Table中再放置一个Table。例如一个data set是客户基本信息,每个客户一条记录,另一个data set是客户交易明细,每个客户可能有多条记录,则先将客户基本信息的data set拖置设计界面,会自动放置一个Table,然后将客户交易明细的data set拖置前一个Table中适当位置,即生成一个Table中的Table。选中交易明细的Table,打开Property Editor视图,在binding栏中,选择交易明细的data set,按“Dataset Parameter Binding...”,选择“CUST_ID"字段,将其和客户基本信息data set的CUST_ID关联起来(row["CUST_ID"])

9、按需要调整报表的样式,从eclipse工具栏中选择“view report in web viewer”,如果设置了Report Parameter,会出现一个对话框,要求输入Report Parameter的值,按确定后生成报表内容

10、在web viewer中,鼠标右建点按生成的报表,选“属性”,获取url,开一个空白IE,复制url到地址栏,在url最后用“&参数名=参数值”方式,把Report Parameter加进url,按回车,直接出现报表结果,不再出现报表参数输入对话框。还可以pdf/doc/html等格式预览生成的报表

Birt报表部署步骤:

部署设计好的报表很简单,只需要下载Birt runtime,将Birt runtime部署为一个web应用,报表设计文件复制到该应用的根目录即可。为方便起见,以下将Birt runtime部属为一个独立的应用,当然也可以将Birt runtime整合到你的web应用中

1、下载birt runtime 2.2.1.1,解开下载文件
2、将birt rumtime解开后的目录下的部署为一个web应用,使用JDK1.4.2或以上版本
3、将报表设计步骤中生成的设计文件(*.retdesing文件)复制到web应用所在目录
4、确保以下文件在WEB-INF/lib目录下存在,如果没有,从all in one中搜索复制过来
       com.ibm.icu_3.6.1.v20070906.jar
       coreapi.jar
       engineapi.jar
       scriptapi.jar
5、将jdbc的jar或zip文件复制到WEB-INF\platform\plugins\org.eclipse.birt.report.data.oda.jdbc_2.2.1.r22x_v20070919\drivers目录下
6、删除WEB-INF\platform\org.eclipse.birt.report.data.oda.sampledb_2.2.1.r22x_v20070919目录(示例数据库,没什么用处),否则生成报表时有不必要的警告信息出现
7、启动web server,修改设计步骤第10步获得的url,使IP/端口/web应用名称符合你的Birt runtime部署,在IE中可以查看报表内容 

使用Birt提供API以程序方式生成报表结果,例如生成PDF格式的报表结果,代码片段如下:

Java代码 复制代码
  1. import java.util.HashMap;   
  2. import java.util.logging.Level;   
  3.   
  4. import java.io.OutputStream;   
  5. import java.io.FileOutputStream;   
  6. import java.io.ByteArrayOutputStream;   
  7.   
  8. import org.eclipse.<SPAN class=hilite1>birt</SPAN>.core.framework.Platform;   
  9. import org.eclipse.<SPAN class=hilite1>birt</SPAN>.report.engine.api.EngineConfig;   
  10. import org.eclipse.<SPAN class=hilite1>birt</SPAN>.report.engine.api.EngineConstants;   
  11. import org.eclipse.<SPAN class=hilite1>birt</SPAN>.report.engine.api.EngineException;   
  12. import org.eclipse.<SPAN class=hilite1>birt</SPAN>.report.engine.api.IReportEngine;   
  13. import org.eclipse.<SPAN class=hilite1>birt</SPAN>.report.engine.api.IReportEngineFactory;   
  14. import org.eclipse.<SPAN class=hilite1>birt</SPAN>.report.engine.api.IReportRunnable;   
  15. import org.eclipse.<SPAN class=hilite1>birt</SPAN>.report.engine.api.IRunAndRenderTask;   
  16. import org.eclipse.<SPAN class=hilite1>birt</SPAN>.report.engine.api.<SPAN class=hilite2>PDF</SPAN>RenderOption;   
  17.   
  18. public class <SPAN class=hilite2>PDF</SPAN>ReportServiceAccess   
  19. {   
  20.     /** *//** 初始化的状态 */  
  21.     protected static boolean initStatus = false;   
  22.   
  23.     private static IReportEngine engine = null;   
  24.   
  25.     private static EngineConfig config = null;   
  26.        
  27.     private static IReportRunnable design = null;   
  28.        
  29.     private static <SPAN class=hilite2>PDF</SPAN>RenderOption ro = null;   
  30.   
  31.     /** *//** 初始化资源 */  
  32.     public void initilize()   
  33.     {   
  34.     if ( initStatus == true )   
  35.         return;   
  36.   
  37.     try  
  38.     {   
  39.         config = new EngineConfig();   
  40.         config.setEngineHome( "C:/projects/<SPAN class=hilite1>birt</SPAN>/WEB-INF/platform" );  //<SPAN class=hilite1>birt</SPAN> runtime web应用中的报表引擎目录   
  41.         config.setLogConfig( "C:/projects/<SPAN class=hilite1>birt</SPAN>/logs", Level.FINE );   
  42.   
  43.         Platform.startup( config );   
  44.         IReportEngineFactory factory = ( IReportEngineFactory ) Platform   
  45.             .createFactoryObject( IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY );   
  46.         engine = factory.createReportEngine( config );   
  47.         engine.changeLogLevel( Level.WARNING );   
  48.   
  49.         ro = new <SPAN class=hilite2>PDF</SPAN>RenderOption();   
  50.       //  ro.setBaseURL( "http://localhost:8080/<SPAN class=hilite1>birt</SPAN>" ); //<SPAN class=hilite1>birt</SPAN> runtime web应用   
  51.         config.getEmitterConfigs().put( "<SPAN class=hilite2>pdf</SPAN>", ro ); //生成<SPAN class=hilite2>pdf</SPAN>格式   
  52.   
  53.         initStatus = true;   
  54.   
  55.     }   
  56.     catch ( Exception ex )   
  57.     {   
  58.         ex.printStackTrace();   
  59.         initStatus = false;   
  60.     }   
  61.     }   
  62.   
  63.     /** *//** 释放资源 */  
  64.     public void release()   
  65.     {   
  66.     engine.shutdown();   
  67.     Platform.shutdown();   
  68.   
  69.     initStatus = false;   
  70.     }   
  71.   
  72.     protected OutputStream run( String filename, HashMap parameters ) throws EngineException   
  73.     {   
  74.     design = engine.openReportDesign( filename );   
  75.        
  76.     // Create task to run and render the report,   
  77.     IRunAndRenderTask task = engine.createRunAndRenderTask( design );   
  78.     HashMap contextMap = new HashMap();   
  79.     contextMap.put( EngineConstants.APPCONTEXT_<SPAN class=hilite2>PDF</SPAN>_RENDER_CONTEXT, ro );   
  80.     task.setAppContext( contextMap );   
  81.     task.setParameterValues( parameters );   
  82.     task.validateParameters();   
  83.   
  84.     OutputStream os = new ByteArrayOutputStream();   
  85.     ro.setOutputStream( os );   
  86.     ro.setOutputFormat( "<SPAN class=hilite2>pdf</SPAN>" );   
  87.     task.setRenderOption( ro );   
  88.   
  89.     task.run();   
  90.     task.close();   
  91.   
  92.     return os;   
  93.     }   
  94.   
  95.     /** *//**  
  96.          * 生成<SPAN class=hilite2>PDF</SPAN>格式报表,以OutputStream格式返回  
  97.          *   
  98.          * @param filename 报表设计文件名全路径  
  99.          * @param parameters  
  100.          *                报表参数  
  101.          * @return ByteArrayOutputStream  
  102.          * @throws EngineException  
  103.          */  
  104.     public OutputStream call( String filename, HashMap parameters ) throws EngineException   
  105.     {   
  106.     initilize();   
  107.     OutputStream os = run( filename, parameters );   
  108.     release();   
  109.        
  110.     return os;   
  111.     }   
  112.   
  113.     /** *//**  
  114.          * @param args  
  115.          */  
  116.     public static void main( String[] args )   
  117.     {   
  118.     HashMap parameters = new HashMap();   
  119.                      //三个Report Parameters,名称必须在报表设计文件中预先定义好   
  120.     parameters.put( "begindate""2004/01/01" );   
  121.     parameters.put( "enddate""2007/12/31" );   
  122.     parameters.put(  "sql"" where cust_id = 1234567" );   
  123.        
  124.     ByteArrayOutputStream bos = null;   
  125.   
  126.     <SPAN class=hilite2>PDF</SPAN>ReportServiceAccess ebr = new <SPAN class=hilite2>PDF</SPAN>ReportServiceAccess();   
  127.   
  128.     String filename = "C:/projects/<SPAN class=hilite1>birt</SPAN>/batch_report.rptdesign";   
  129.     try  
  130.     {   
  131.         bos = ( ByteArrayOutputStream ) ebr.call( filename, parameters );   
  132.         OutputStream fis = new FileOutputStream( "c:/test.<SPAN class=hilite2>pdf</SPAN>" );   
  133.         bos.writeTo( fis );   
  134.     }   
  135.     catch ( Exception e )   
  136.     {   
  137.         e.printStackTrace();   
  138.     }   
  139.     }   
  140.   
  141. }  

posted on 2008-08-12 15:20 chu 阅读(1008) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

常用链接

留言簿(2)

随笔档案

我的链接

搜索

最新评论

阅读排行榜

评论排行榜