报表制作过程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

报表编辑过程

报表的部署过程

1.首先,如果是第一次部署报表,首先拷贝报表引擎所需的文件:

•从%安装路径%\Deployment\JSP下拷贝Ming.tld到Web应用程序的WEB-INF目录下

•从%安装路径%\Deployment\JSP下拷贝mr.jar(文件名可能不同,可能如mr_Trial.jar等)到Web应用程序的WEB-INF/lib目录下,如果lib目录不存在则创建。

•选择一个目录作为报表根目录(RootPath),如/YourApp/Reports/,从%安装路径%\Deployment\JSP\下拷贝ReportCenter.jsp到报表根目录/YourApp/Reports/。

•从%安装路径%\Deployment\JSP\下拷贝文件MREngine.prop到目录/YourApp/WEB-INF/下。

MREngine.prop文件中包含一个MRViewerVersion参数,类似MRViewerVersion=2,1,1,0,“2,1,1,0”描述

的是报表浏览器的版本号码,浏览器升级之后,需要在此指定新版本的版本号,这样客户端才可以自动

下载新版本的浏览器插件。关于配置文件MREngine.prop中参数的详细说明请参考配置文件里面注释。

•从%安装路径%\Deployment下拷贝Viewer文件夹到报表根目录/YourApp/Reports/下,Viewer文件夹中有MRViewer.cab文件,这就是报表浏览器插件。

2.拷贝已经用报表设计器设计好的报表模板到报表根目录或者根目录下的子文件夹下面

注意:如果你的应用程序是YourApp,那么你可以指定这个应用程序YourApp下的目录“/Reports/”作为你的报表的根目录。即:“/Reports/”。

3. 创建JSP页面,嵌入报表浏览器、为报表准备数据:

新建一个JSP文件,用于显示报表,如FirstReport.jsp,加入下面代码:

•引用Tag Library

<%@ taglib uri="Ming.tld" prefix="ming" %>

•引用需要的包

<%@ page import="com.ming.webreport.*" %>

•创建MREngine对象

MREngine engine = new MREngine(pageContext);

•设置报表根路径

engine.setRootPath("/Reports/");

注意此处不应该包含应用程序的虚拟目录“YourApp”,而是从虚拟目录的根开始,应该是“/Reports/”。

•添加数据集

在数据组件中添加一个数据集,其中"titles"用来指定数据集名称,这个名称与用报表设计器设计报表模板时指定的数据集名称对应;rs可以是一个com.ming.webReport.DataRecord和com.ming.webReport.MRDataSet,或者java.sql.ResultSet,包含了报表所需数据:

engine.addMRDataSet("titles",rs);

1.可以将其他类型的数据转换成MRDataSet对象,然后使用addMRDataSet添加数据集,下面

的代码展示如何将一个java.sql.ResultSet转换为com.ming.webReport.MRDataSet(addMRDataSet方法可以

直接使用ResultSet,以下代码仅作为演示):

ArrayList ary = new ArrayList();

while(rs.next()) //rs为一个现有非空的ResultSet对象

{

DataRecord rec = new DataRecord();

for(int i=1;i<=rs.getMetaData().getColumnCount();i++){

Object val = rs.getObject(i);

rec.setValue(rs.getMetaData().getColumnName(i),val);

}

ary.add(rec);

}

MRDataSet mrds =new MRDataSet();

mrds.addRows(mrds);

engine.addMRDataSet("titles",mrds);

如果报表用到的数据集超过一个,则可以继续加入这些数据集:

engine.addMRDataSet("roysched",rs2);

如果数据集之间存在关联,用下面代码设置数据集之间的关联,其中"titles"是主数据集的名称,"roysched"是子数据集的名称,而"title_id=title_id"是两个数据集之间的关联表达式,表示使用各自表中的title_id字段对应关联。如果关联字段超过一组时用分号(;)分隔:

engine.addRelation("titles", "roysched", "title_id=title_id");

2.如果从数据库从数据库查询出来的数据被封装成了一个对象,并返回。报表并不支持对象显示

数据,以下方法可以将对象转换成DataRecord数据集:

//o为需要转换成DataRecord数据集的对象

//c为o对象运行时类

public MRDataSet objcetToDataRecord(HttpServletRequest request,

Object o,Class c) throws Exception {

DataRecord rec = new DataRecord();

MRDataSet mrds = new MRDataSet();

BeanInfo beanInfo = Introspector.getBeanInfo(c);

PropertyDescriptor[] descriptors =

beanInfo.getPropertyDescriptors();

for (PropertyDescriptor descriptor : descriptors) {

Method method = descriptor.getReadMethod();

Object obj = method.invoke(o, new Object[] {});

rec.setValue(descriptor.getName().toUpperCase(), obj);

}

mrds.addRow(rec);

return mrds;

}

3.如果从数据库从数据库查询出来的数据被封装成了一个对象集合,并返回。报表并不支持集合

显示数据,以下方法可以将该集合转换成含有DataRecord数据集的集合:

//list为需要转换的集合

//为o对象运行时类

public List buildDataRecord(List list,Class c)

throws Exception {

List ary = new ArrayList();

BeanInfo beanInfo = Introspector.getBeanInfo(c);

PropertyDescriptor[] descriptors =

beanInfo.getPropertyDescriptors();

for (Object o : list) {

DataRecord rec = new DataRecord();

for (PropertyDescriptor descriptor : descriptors) {

Method method = descriptor.getReadMethod();

Object obj = method.invoke(o, new Object[] {});

rec.setValue(descriptor.getName().toUpperCase(), obj);

}

ary.add(rec);

}

return ary;

}

4.有时候我们需要一些空记录,以下方法是创建一个包含n条空记录的数据集: