轉:birt報表

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裏的這段複製命令

        <copy file="lib/birt/com.ibm.icu-3.4.4.1.jar" tofile="${web.dir}/plugins/com.ibm.icu_3.4.4.1.jar"/>
        <copy file="lib/birt/js-2.1.jar" tofile="${web.dir}/plugins/org.mozilla.rhino/lib/js.jar"/>
        <copy file="lib/birt/chartengineapi-2.1.jar" tofile="${web.dir}/plugins/org.eclipse.birt.chart.engine_2.1.0.N20060628-1351.jar"/>
        <copy todir="${web.dir}/plugins">
            <fileset dir="lib/birt">
                <include name="org.eclipse.emf.*"/>
              </fileset>
        </copy>

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);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章