天天看點

Birt報表Script Data Source示例

一.最終結果展示:

Birt報表Script Data Source示例
Birt報表Script Data Source示例

二.搭建環境:

                    MyEclipse9.0(裡面已有Birt相關包)

                    jboss-4.2.2.GA

    1.MyEclipse建立Report Web Project項目名:Birt

Birt報表Script Data Source示例
Birt報表Script Data Source示例

其中:reports檔案夾中存放報表.rptdesign檔案。jboss-web.xml是我放進去的最後再寫。我們先寫好代碼,最後制作.rptdesign檔案。

2.建立類InfoBean用于封裝每一條記錄。

package test;
public class InfoBean
{
	String city;
	String province;
	Long num;

	public InfoBean()
	{
		super();
	}

	public InfoBean(String province, String city, Long num)
	{
		super();
		this.city = city;
		this.province = province;
		this.num = num;
	}

	public String getCity()
	{
		return city;
	}

	public void setCity(String city)
	{
		this.city = city;
	}

	public String getProvince()
	{
		return province;
	}

	public void setProvince(String province)
	{
		this.province = province;
	}

	public Long getNum()
	{
		return num;
	}

	public void setNum(Long num)
	{
		this.num = num;
	}
}
           

3.建一個工具類用于建立報表生成引擎

package test;
import java.util.logging.Level;
import javax.servlet.ServletContext;
import org.eclipse.birt.core.exception.BirtException;
import org.eclipse.birt.core.framework.Platform;
import org.eclipse.birt.core.framework.PlatformServletContext;
import org.eclipse.birt.report.engine.api.EngineConfig;
import org.eclipse.birt.report.engine.api.IReportEngine;
import org.eclipse.birt.report.engine.api.IReportEngineFactory;

public class BirtEngine
{
	private static IReportEngine birtEngine = null;
	private static EngineConfig config = null;

	public static synchronized IReportEngine getBirtEngine(ServletContext sc)
	{
		if (birtEngine == null)
		{
			config = new EngineConfig();//建立一個報表引擎配置對象
			config.setLogConfig("/report-engine/logs", Level.INFO);
			config.setEngineHome("/report-engine");//設定 BIRT報表引擎的安裝路徑
			config.setPlatformContext(new PlatformServletContext(sc));
			try
			{
				Platform.startup(config);
			}
			catch (BirtException e)
			{
				e.printStackTrace();
			}
			IReportEngineFactory factory = (IReportEngineFactory) Platform.createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);
			birtEngine = factory.createReportEngine(config);//建立一個報表生成引擎
		}
		return birtEngine;
	}
}
           

4.建立一個servlet

package test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Properties;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.birt.report.engine.api.EngineConstants;
import org.eclipse.birt.report.engine.api.EngineException;
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.IReportRunnable;
import org.eclipse.birt.report.engine.api.IRunAndRenderTask;

public class ReportServlet extends HttpServlet
{
	private static final long serialVersionUID = 1L;
	private static final Log log = LogFactory.getLog(ReportServlet.class);
	Properties properties = new Properties();

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		doGet(request, response);
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		try
		{
			response.setContentType("text/html");
			ServletContext sc = request.getSession().getServletContext();
			IReportEngine birtReportEngine = BirtEngine.getBirtEngine(sc);
			try
			{
				//資料準備
				HashMap<String, Object> paramMap = new HashMap<String, Object>();
				paramMap.put("currTime", "2015-01-16 11:30");
				paramMap.put("secTitle", "2015-01-01至2015-01-08");
				paramMap.put("title", "網站注冊來源人數統計 ");
				// list中的資料可通過資料庫查詢出來封裝到InfoBean中,這裡從簡
				List<InfoBean> list = new ArrayList<InfoBean>();
				InfoBean Info1 = new InfoBean("湖南", "長沙", Long.valueOf("171"));
				InfoBean Info2 = new InfoBean("湖北", "武漢", Long.valueOf("102"));
				InfoBean Info3 = new InfoBean("廣東", "廣州", Long.valueOf("100"));
				InfoBean Info4 = new InfoBean("廣東", "深圳", Long.valueOf("50"));
				list.add(Info1);
				list.add(Info2);
				list.add(Info3);
				list.add(Info4);
				request.setAttribute("dataSet", list);
				//打開一個報表.rptdesign設計檔案在report目錄中
				IReportRunnable design = birtReportEngine.openReportDesign(sc.getRealPath("/reports") + "/test_report.rptdesign");// 
				IRunAndRenderTask task = birtReportEngine.createRunAndRenderTask(design);
				HashMap<String, Object> contextMap = new HashMap<String, Object>();
				contextMap.put(EngineConstants.APPCONTEXT_BIRT_VIEWER_HTTPSERVET_REQUEST, request);
				task.setAppContext(contextMap);
				task.setParameterValues(paramMap);
				task.validateParameters();

				//set output options
				HTMLRenderOption options = new HTMLRenderOption();
				options.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_HTML);
				options.setOutputStream(response.getOutputStream());
				options.setImageHandler(new HTMLServerImageHandler());
				options.setBaseImageURL(request.getContextPath() <span style="font-family: Arial, Helvetica, sans-serif;">+ "/images");</span>
				options.setImageDirectory(sc.getRealPath("/images"));

				task.setRenderOption(options);

				//run report
				task.run();
				task.close();
			}
			catch (EngineException e)
			{
				e.printStackTrace();
			}
		}
		catch (Exception e)
		{
			log.error("ReportProxy doGet failed!", e);
		}
	}
}
           

5.将servlet配置到web.xml中

<servlet>
    <servlet-name>ReportServlet</servlet-name>
    <servlet-class>test.ReportServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ReportServlet</servlet-name>
    <url-pattern>/reportServlet/*</url-pattern>
  </servlet-mapping>
           

6.寫index.jsp。一切從簡隻有一句話

<body>
      <a href="/reportServlet" target="_blank" rel="external nofollow" >展現報表</a><br/>
 </body>
           

到此為止代碼已寫好。

 三.設計.rptdesign檔案

此時将myeclipse切換到MyEclipse Report Design  perspective

1.檔案最終效果

Birt報表Script Data Source示例
Birt報表Script Data Source示例

2.建立檔案

在reports目錄中建立一個空白的Report檔案取名為test_report.rptdesign。下一步即可。

3.制作

(1)new Data Source

Birt報表Script Data Source示例
Birt報表Script Data Source示例

(2)new Data set

Birt報表Script Data Source示例
Birt報表Script Data Source示例

next:這裡add的column要與前面的InfoBean中的屬性一緻。

Birt報表Script Data Source示例
Birt報表Script Data Source示例

最終:

Birt報表Script Data Source示例
Birt報表Script Data Source示例

編寫script:  open

Birt報表Script Data Source示例
Birt報表Script Data Source示例

編寫script: fetch

Birt報表Script Data Source示例
Birt報表Script Data Source示例

(3)正式制作:

建立一個五行一列的Gird

Birt報表Script Data Source示例
Birt報表Script Data Source示例

如下:

Birt報表Script Data Source示例
Birt報表Script Data Source示例

還記得ReportServlet中的代碼嗎?

paramMap.put("currTime", "2015-01-16 11:30");
paramMap.put("secTitle", "2015-01-01至2015-01-08");
paramMap.put("title", "網站注冊來源人數統計 ");
           

Insert三個Data

分别對應Expression中params["title"] ,params["currTime"] ,params["secTitle"] ,

在第一個ROW中插入一個Gird兩行一列的Gird 其中第一行為大标題,第二行為二級标題 ,這裡隻截圖一個

Birt報表Script Data Source示例
Birt報表Script Data Source示例

在第二個ROW中直接Insert一個Data。操作方式如上

Birt報表Script Data Source示例

在第三個ROW中插入一個Table,InfoBean中資料将在這裡展現

Birt報表Script Data Source示例
Birt報表Script Data Source示例

結果:

Birt報表Script Data Source示例
Birt報表Script Data Source示例

拖拽Data set 中資料到Table中Detail Row中。由于業務需要 省份(province) 不能直接拖拽,另有操作。

Birt報表Script Data Source示例
Birt報表Script Data Source示例

對省份province的操作,需要在insert一個group:

Birt報表Script Data Source示例
Birt報表Script Data Source示例

結果:

Birt報表Script Data Source示例
Birt報表Script Data Source示例

直接在省份上面的一格中Insert一個label寫入省份。就不截圖了。

在footer row 最後一格中Insert一個Aggreation    第一格中插入一個label作為标題内容為總計

Birt報表Script Data Source示例
Birt報表Script Data Source示例

結果:

Birt報表Script Data Source示例
Birt報表Script Data Source示例

第四個Row空着

第五個Row中Insert一個Chart

Birt報表Script Data Source示例
Birt報表Script Data Source示例

next:

Birt報表Script Data Source示例
Birt報表Script Data Source示例

next:

Birt報表Script Data Source示例
Birt報表Script Data Source示例

結果:

Birt報表Script Data Source示例
Birt報表Script Data Source示例

到此.rptdesign制作基本結束。

四.測試結果

在web-inf目錄下加入jboss-web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss-web PUBLIC "-//JBoss//DTD Web Application 2.4//EN" "http://www.jboss.org/j2ee/dtd/jboss-web_4_0.dtd">
<jboss-web>
	<context-root></context-root>	
</jboss-web>
           

部署項目,在浏覽器輸入http://localhost:8080/

Birt報表Script Data Source示例
Birt報表Script Data Source示例

點選:最終結果

Birt報表Script Data Source示例
Birt報表Script Data Source示例

很素,沒有任何樣式。這個 我就不弄了。

該部分參考文章:

http://www.360doc.com/content/10/0311/13/939230_18347601.shtml

http://blog.sina.com.cn/s/blog_843736e7010131ak.html

http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-birt/

繼續閱讀