一.最终结果展示:
二.搭建环境:
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/