birt報表部署方式有兩種,一種是經過官方提供的WebViewerExample webapp去部署html 另外一種是經過ReportEngine API自行開發部署程序;java 採用第一種的好處是不須要編寫額外的代碼,直接就能部署,比較方便,可是限制不少web 若是採用第二種的話就很靈活了。數據庫 本日誌主要記錄採用ReportEngine API來進行報表的部署;api 編碼前準備:服務器 下載birt-runtime-version.zip(www.eclipse.org有下載)app 解壓,其中ReportEngine目錄存放着全部所需的東西eclipse 準備數據庫驅動webapp 編寫birt報表文件jsp 利用下邊的代碼就能夠執行報表文件並生成目標html文件 package report; import java.util.HashMap; import java.util.logging.Level; import org.eclipse.birt.core.framework.Platform; import org.eclipse.birt.report.engine.api.EngineConfig; import org.eclipse.birt.report.engine.api.EngineConstants; import org.eclipse.birt.report.engine.api.EngineException; import org.eclipse.birt.report.engine.api.HTMLActionHandler; import org.eclipse.birt.report.engine.api.HTMLEmitterConfig; import org.eclipse.birt.report.engine.api.HTMLRenderContext; import org.eclipse.birt.report.engine.api.HTMLRenderOption; import org.eclipse.birt.report.engine.api.HTMLServerImageHandler; import org.eclipse.birt.report.engine.api.IReportEngine; import org.eclipse.birt.report.engine.api.IReportEngineFactory; import org.eclipse.birt.report.engine.api.IReportRunnable; import org.eclipse.birt.report.engine.api.IRunAndRenderTask; public class ExecuteReport { static void executeReport() throws EngineException { HashMap<String, String> parameters = new HashMap<String, String>(); //報表的參數名稱 String name = "byCondition"; //報表的參數值,未來能夠作個jsp傳進來 String pvalue = "3"; //封裝成map parameters.put(name, pvalue); IReportEngine engine = null; EngineConfig config = null; try { // 設置Engine而且啓動報表平臺 config = new EngineConfig(); config.setEngineHome("E:/TDDOWNLOAD/birt-runtime-2_6_1/birt-runtime-2_6_1/ReportEngine"); // 設置報表日誌保存的位置和等級( null, Level ) 若是你不須要日誌能夠設置爲null config.setLogConfig("d:/birt/logs", Level.FINE); // 平臺初始化,啓用 Platform.startup(config); IReportEngineFactory factory = (IReportEngineFactory) Platform .createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY); engine = factory.createReportEngine(config); engine.changeLogLevel(Level.WARNING); } catch (Exception ex) { ex.printStackTrace(); } // 設置發起者的一些操做,好比顯示圖片,報表生成到html頁面,很關鍵的部分 HTMLEmitterConfig emitterConfig = new HTMLEmitterConfig(); emitterConfig.setActionHandler(new HTMLActionHandler()); HTMLServerImageHandler imageHandler = new HTMLServerImageHandler(); emitterConfig.setImageHandler(imageHandler); config.getEmitterConfigs().put("html", emitterConfig); //$NON-NLS-1$ IReportRunnable design = null; // 打開設計好的報表,取絕對路徑,最好使用context.getRealPath();這種方法實現,官方這個比較呆 design = engine .openReportDesign("D:/Java/eclipse/workspace/TestReport/WebContent/change_bettiems.rptdesign"); // 建立報表任務 IRunAndRenderTask task = engine.createRunAndRenderTask(design); // // 設置報表的路徑和圖片顯示的路徑 // HTMLRenderContext renderContext = new HTMLRenderContext(); // // 爲全部的actions設置Base URL,這個不寫就是默認服務器URL的 // renderContext.setBaseURL("http://localhost/"); // // 設置全部圖片顯示的URL - 若是以前沒有emitterConfig.setImageHandler( imageHandler // // );的話會形成顯示的URL是本地的絕對路徑,其實http://localhost不寫也是能夠的,會自動添加服務器的URL // renderContext.setBaseImageURL("http://localhost/myimages"); // // 設置全部圖片存放的位置,最好使用context.getRealPath(); // renderContext.setImageDirectory("C:/xampplite/htdocs/myimages"); // // 設置圖片支持的格式,據官方說必須有SVG,我沒寫也沒出錯 // renderContext.setSupportedImageFormats("JPG;PNG;BMP;SVG"); // HashMap<String, HTMLRenderContext> contextMap = new HashMap<String, HTMLRenderContext>(); // contextMap.put(EngineConstants.APPCONTEXT_HTML_RENDER_CONTEXT, // renderContext); // task.setAppContext(contextMap); // 設置參數 task.setParameterValues(parameters); // 要全部的參數一條一條的寫入,例如: task.setParameterValue("Top Count", new // Integer(12)); task.validateParameters(); // 增長scrpit參考下面的例子 // pFilter.myjavamethod() // ProcessFilter pf = new ProcessFilter(); // task.addScriptableJavaObject("pFilter", pf); // 設置rendering操做- 例如file or stream output, output format, whether it is // embeddable, etc HTMLRenderOption options = new HTMLRenderOption(); // 例如:Remove HTML and Body tags // options.setEmbeddable(true); // 設置輸出本地文件 options.setOutputFileName("C:/test/2.1/output.html"); // 設置輸出文件格式 options.setOutputFormat("html"); task.setRenderOption(options); // 運行report任務,而後關閉 // 若是要長期留駐的話能夠不關閉,我建議不關閉engine和Platform,要不每次打開報表都要等很久…… task.run(); task.close(); engine.shutdown(); Platform.shutdown(); System.out.println("Finished"); } /** * @param args */ public static void main(String[] args) { try { executeReport(); } catch (Exception e) { e.printStackTrace(); } } } |