天天看点

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/

继续阅读