利用BIRT ReportEngine API開發報表

 

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

		}

	}

}
相關文章
相關標籤/搜索