BIRT报表

来源:百度文库 编辑:神马文学网 时间:2024/05/03 11:37:23

BIRT报表

作者: 江南白衣, efa

1.概述

网站: http://www.eclipse.org/birt/phoenix/

BIRT报表 拥有和Dreamweaver一般的操作界面,可以像画table一样画报表,生成图片,导出Excel,html分页样样齐全,样式和script设置简单,貌似还有OLAP导航功能,JasperReport注定要被打入冷宫了。

特别留意,SpringSide里仿照Spring集成JasperReport的做法,集成了Birt View。

另外特别Demo了把查询语句统一写在SaleReportManager里,对查询语句综合处理与重用,而不是默认的在每个模版文件里面写SQL。

学习资料:

     1.Birt的IBM DW的中文教程:http://www-128.ibm.com/developerworks/cn/opensource/os-ecl-birt/,
     2.最权威、详细的莫过于birt 官方文档 
     3.难得的比较全面的 BIRT 中文指南
     4.Flash Demo

2.部署BIRT2.1

2.1. 拷贝文件

 将/plugins, /configuration两个目录复制到webapp 根目录, 将lib复制到webapp/WEB-INF/lib

2.2. 瘦身

     Birt实在太过庞大,如果将以上三个目录全拷的话几十M.因此,可以参考SS里对/lib/birt 和 webapp/plugins目录反复试验后的精简。
     另外,/lib和/plugins有好多jar是重复的,只要在编译时把jar 从一个目录copy过去就行。又要注意两个目录里相同的jar的命名并不相同,而/plugins里面的文件名很严格,可参考build.xml里的这段复制命令

        
       
       
       
           
               
             

       

3.将spring与birt集成在一起

3.1 why not 说明

      3.1.1 为什么没有使用 birt report viewer

BIRT Report Viewer 貌似做得很周到,提供如浏览,打印,export to CSV ,过滤参数的传入等一系列的快速操作.

然而细心思考过,这个viewer还是存在不少问题:

如不适用的报表传入参数方式(无输入验证,无日期控件);代码复杂,可扩展性差......

发现不少功能形同虚设,所以决心抛弃.

     3.1.2 为什么不在.rptdesign里写sql

往往实际项目的业务总是复杂的,不希望将复杂的逻辑通过几个简单的参数传入拼凑sql来实现,再说这样调试sql也是一件麻烦的事情,也不利于SQL管理

所以我们提倡 将查询的商业逻辑放回java Manager类,然后designer负责设计数据如何排列。这样子更适和实际项目.

3.2 自己实现的BirtReportsView的原理

    实现Spring MVC的View,关键是重载它的protected void renderMergedOutputModel(Map model, HttpServletRequest request, HttpServletResponse response) 函数

   3.2.1 创建 EngineConfig 与 ReportEngine  实例
  public class BirtReportsView extends AbstractUrlBasedView {


  
   private String engineHome;
   private ReportEngine engine;
    
public BirtReportsView() {
        engineHome = System.getProperty("bookstore.root"); //engine home
        EngineConfig birtConfig = new EngineConfig();
        birtConfig.setEngineHome(engineHome);
        engine = new ReportEngine(birtConfig);
    }




}
    3.2.2  设定报表文件
    public void openReportDesign(String filePath) throws IOException, EngineException {
        File reportFilte = new File(engineHome + "/" + filePath);
        IReportRunnable design = engine.openReportDesign(reportFilte.getAbsolutePath());
        task = engine.createRunAndRenderTask(design);
    }
     3.2.3  配置 htmlrendercontext
 private String scriptableJOName = "dsFactory"; //dsFactory 自由定义,主要在rptdesign中调用
private String imageDirectory = "/report/images";
private String baseImageUrl = "images";


private void run(OutputStream outputStream) throws EngineException {

HTMLRenderContext renderContext = new HTMLRenderContext();


//chart 生成图片目录
        renderContext.setImageDirectory(this.engineHome + "/" + imageDirectory);


//web页面浏览 base url
        renderContext.setBaseImageURL(baseImageUrl);
        HashMap contextMap = new HashMap();
        contextMap.put(EngineConstants.APPCONTEXT_HTML_RENDER_CONTEXT, renderContext);


        task.setAppContext(contextMap);




        BirtDataSourceObject birtDataSourceObject = new BirtDataSourceObject();
        HTMLRenderOption options = new HTMLRenderOption();
        birtDataSourceObject.setResultList(resultList);
        options.setOutputStream(outputStream);
        task.setRenderOption(options);

//增加api级别的java对象,以方便报表中调用获取报表数据
        task.addScriptableJavaObject (scriptableJOName, birtDataSourceObject);
        task.run();
 }

相关文章:
1.BIRT and POJOs as datasources example
2.详细的 Report Engine API 请见[官方 ]

3.3 Birt View的使用

见SaleReprontController.

public ModelAndView view(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String status = request.getParameter("status");
        String beginDate = request.getParameter("beginDate");
        String endDate = request.getParameter("endDate");
        List bookList = saleReportManager.findBooksByReportParam(status,
                DateUtil.parse(beginDate, "yyyy-M-d"), DateUtil.parse(endDate, "yyyy-M-d"));
       BirtReportView view = new BirtReportView();
        view.openReportDesign("/report/sale_report.rptdesign");
        view.putModel(bookList);
        return new ModelAndView(view);
    }