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); }