一.最終結果展示:
二.搭建環境:
MyEclipse9.0(裡面已有Birt相關包)
jboss-4.2.2.GA
1.MyEclipse建立Report Web Project項目名:Birt
其中: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.檔案最終效果
2.建立檔案
在reports目錄中建立一個空白的Report檔案取名為test_report.rptdesign。下一步即可。
3.制作
(1)new Data Source
(2)new Data set
next:這裡add的column要與前面的InfoBean中的屬性一緻。
最終:
編寫script: open
編寫script: fetch
(3)正式制作:
建立一個五行一列的Gird
如下:
還記得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 其中第一行為大标題,第二行為二級标題 ,這裡隻截圖一個
在第二個ROW中直接Insert一個Data。操作方式如上
在第三個ROW中插入一個Table,InfoBean中資料将在這裡展現
結果:
拖拽Data set 中資料到Table中Detail Row中。由于業務需要 省份(province) 不能直接拖拽,另有操作。
對省份province的操作,需要在insert一個group:
結果:
直接在省份上面的一格中Insert一個label寫入省份。就不截圖了。
在footer row 最後一格中Insert一個Aggreation 第一格中插入一個label作為标題内容為總計
結果:
第四個Row空着
第五個Row中Insert一個Chart
next:
next:
結果:
到此.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/
點選:最終結果
很素,沒有任何樣式。這個 我就不弄了。
該部分參考文章:
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/