润乾报表V3.0在WEB中的使用说明

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

润乾报表(新版)在WEB中的使用说明
1WEB服务器配置
使用本报表系统需要在WEB服务器中配置WEB应用和应用中用到的数据库连接池。

下面以TOMCA T为例进行说明:
1、修改[tomcat]/conf/server.xml文件,在</Host>行之前插入如下的一段标签:
/report" docBase="
<value>
</parameter>
<parameter>
<name>password</name>
<value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>
</parameter>
<parameter>
<name>url</name>
<value>
</parameter>
</ResourceParams>
</Context>
以上用粗体表示的部分为应进行修改的内容。

如果在应用中要用到多个数据库,则应重复<Resource …… </ResourceParams>之间的内容。

2、要将相应的数据库JDBC驱动程序包放入[tomcat]/common/lib目录中
2WEB应用配置
2.1文件部署
JA V A类的部署:如果报表系统提供的是jar文件,则将之放在WEB应用的WEB-INF/lib 目录中,如果提供的是呈目录结构的class文件,则将com目录和color.properties文件放到WEB应用的WEB-INF/classes目录中。

将runqianReport.tld文件放到WEB应用的WEB-INF目录中。

将xrq_license.dat文件放到WEB应用的WEB-INF目录中。

将runqianReportApplet.jar文件放到WEB应用的根目录中。

将lib目录中的以下jar文件复制到WEB-INF\lib目录中:itext_099.jar,iTextAsian.jar,
jai_codec.jar,jai_core.jar,jdom.jar,log4j_128.jar,poi.jar。

2.2web.xml文件的配置
在web.xml文件中要对报表系统中用到的servlet和taglib进行配置,请将报表系统提供的web.xml文件中的内容复制到你的应用的web.xml文件中相应的位置。

并对下面这段标签中的相关内容进行修改。

<servlet>
<servlet-name>com.runqian.report.view.DataServlet</servlet-name>
<servlet-class>com.runqian.report.view.DataServlet</servlet-class>
<init-param>
<param-name>reportFileHome</param-name>
<param-value>/reportFiles</param-value>
</init-param>
<init-param>
<param-name>JNDIPrefix</param-name>
<param-value>java:/comp/env</param-value>
</init-param>
<init-param>
<param-name>dataSource</param-name>
<param-value>jdbc/test,oracle,gb2312;jdbc/sw,sqlsvr,iso-8859-1</param-value>
</init-param>
<init-param>
<param-name>cachedParamsTimeout</param-name>
<param-value>120</param-value>
</init-param>
<init-param>
<param-name>cachedReportDir</param-name>
<param-value>E:\work\report\cached</param-value>
</init-param>
<init-param>
<param-name>cachedReportTimeout</param-name>
<param-value>120</param-value>
</init-param>
<init-param>
<param-name>logConfig</param-name>
<param-value>/WEB-INF/runqianReportLog.properties</param-value>
</init-param>
<init-param>
<param-name>certFile</param-name>
<param-value>C:\Documents and Settings\user\.keystore</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
以上参数说明如下:
(1)reportFileHome表示编辑好的报表文件部署的文件夹位置,其值相对于WEB应用根
目录。

(2)JNDIPrefix表示查找数据源时的环境串前缀,在不同的WEB服务器中不同,如
Tomcat中是java:/comp/env,而Weblogic和Websphere中均不需要,可以不填。

(3)dataSource表示用户在WEB应用中要用到的数据源配置,其格式如下:
数据源的JNDI名称,数据库类型,数据库字符集编码;[重复]……
数据库类型按下表填写:
第一个数据源配置为应用中的缺省数据源,即如果在报表的数据集定义中没有指定数据源名称,则使用此数据源。

(4)cachedParamsTimeout表示提交给报表的参数在缓存中保存的时间,以分钟为单位。

如果不设此参数,缺省值是120分。

(5)cachedReportDir表示报表缓存的文件夹,如在unix系统中,用户应对此文件夹有写
的权限,并根据报表的数量和访问量的大小以及缓存超时的时间,分配一个合理的空间大小。

如果不设此参数或设置错误,则采用JDK默认的临时文件夹。

(6)cachedReportTimeout表示报表缓存保存的时间,以分钟为单位。

如果不设此参数,
缺省值是120分。

此值应根据实际内存大小、缓存文件夹空间大小来调节,一般在1-3小时之间。

(7)logConfig表示报表系统日志记录配置属性文件。

如果不设此参数,则日志输出到系
统控制台。

日志属性文件的配置说明请参照runqianReportLog.properties文件中的说明,或者参考apache的log4j的相关文档。

(8)certFile表示使用HTTPS协议访问报表时,服务器安全证书文件的位置。

参数名均为大小写相关,用户必须根据自己应用的实际情况填写相应的参数值。

2.3报表缓存配置
本系统采用内存敏感型报表缓存设置,就是使用TAG标签发布报表时,将计算出的报表首先保存在内存中,当JA V A虚拟机发现内存余量会影响到系统的效率时,则会将某些缓存的报表从内存中转移到硬盘中我们指定的文件夹中,以释放出充裕的内存供系统使用。

报表缓存设置是用上一节的参数(5)和(6)来配置的。

当缓存的报表超过保存时间没有被访问时,就会从缓冲池中清除,同时,如果它已被写入到硬盘中,那么也要从硬盘中删除此文件。

应用服务器关闭时,缓冲池将不再存在,残留在硬盘中的文件将在应用服务器下次启动时被清除。

缓存的报表有什么作用呢?它可供在网页中翻页、打印、存为Excel、存为Pdf或填报提交时从缓冲池中提取已算好的报表,避免再计算一次。

提取的过程是这样的:(1)缓存报表还在内存中,直接取出;(2)缓存报表已存到硬盘中,从硬盘中读取出来;(3)报表已被从缓冲池清除,如果TAG中用的是RAQ文件,则重新根据参数计算出一个新的报表,否则显示异常“与服务器的连接超时,请重新访问!”,要求用户刷新页面后再执行这些操作。

3TAG及其属性说明
3.1html报表
html报表在JSP文件中用<prefix:html> 标签来发布,prefix是用户在JSP文件中指定的前缀名。

此标签的属性说明见下表:
(1)如要发布的报表源为报表文件,其值为file 。

(2)如要发布的报表源为经过API 处理的ermodel.ReportDefine 对象,则其值为defineBean 。

(3)如要发布的报表源为经过API 处理的ermodel.Report 对象,则其值为ReportBean 。

注2:connection 属性的格式为:
数据源名1=driver, url, user, password, dbType, dbEncode; 数据源名2=driver, url, user, password, dbType, dbEncode; ……
数据源名:报表中的数据集所用的数据源名,“数据源名1”为报表所用的缺省数据源。

driver :连接数据库的JDBC 驱动程序类名。

url :用JDBC 连接数据库时的url 。

user :用JDBC 连接数据库时的用户名。

password :用JDBC 连接数据库时的用户密码。

dbType :数据库类型,见上节“数据库类型表”。

dbEncode :数据库的字符集编码。

3.2 多表填报报表
多表填报报表在JSP 文件中用<prefix:sheets>
标签来发布,prefix 是用户在JSP 文件中指定的前缀名。

此标签的属性说明见下表:
(属性名都是大小写相关,属性值必须放在双引号中)
格式:报表文件名,报表id[,tab页中显示名]; 报表文件名,报表id[,tab页中显示名];……
表1表2
每表定义之间用英文分号隔开,表自身属性之间用英文逗号分开。

例子:sheet1.raq, sheet1, 学生情况表; jjzj.raq, jjzj, 基金增减; sheet3.raq, sheet3
注2:sheetsRelation定义:
格式:有效性表达式1@提示信息1; 有效性表达式2@提示信息2; ……
有效性表达式中报表单元格表示法:报表id_单元格名,如sheet1_B5
有效性表达式必须是合法的javascript表达式。

表达式与相应的提示信息之间用@隔开,多条表达式间用英文分号隔开
例子:sheet3_a1.length > sheet1_D2.length @sheet3中第一格的值长度必须大于'学生情况表'中'姓名'的长度!; sheet3_b1 > jjzj_g8 @sheet3中第二格的数值必须大于基金增减表中第一行的上年结余合计!
3.3打印模式的报表
就是直接在浏览器中以打印预览的方式显示报表。

下表中的属性如未说明,则与html 报表的相应属性相同。

3.4参数表单
生成一个输入报表参数进行报表查询的html form表单。

4报表在JSP文件中发布
4.1html报表
在要发布报表的JSP文件的前面,必须写上下面这一句:
<%@ taglib uri="/WEB-INF/runqianReport.tld" prefix="report" %>
然后在要发布报表的地方用上面介绍的tag标签来发布,如:
<report:html name="…" reportFileName="…"…… />
其中prefix的值可以自己指定,但tag标签中的前缀必须与其保持一致。

4.2多表填报报表
在要发布报表的JSP文件的前面,必须写上下面这一句:
<%@ taglib uri="/WEB-INF/runqianReport.tld" prefix="report" %>
然后在要发布报表的地方用上面介绍的tag标签来发布,如:
<report:sheets name="…" sheets="…"…… />
其中prefix的值可以自己指定,但tag标签中的前缀必须与其保持一致。

4.3打印模式的报表
在要发布报表的JSP文件的前面,必须写上下面这一句:
<%@ taglib uri="/WEB-INF/runqianReport.tld" prefix="report" %>
然后在要发布报表的地方用上面介绍的tag标签来发布,如:
<report:print name="…" reportFileName="…"…… />
其中prefix的值可以自己指定,但tag标签中的前缀必须与其保持一致。

4.4使用非TAG生成的功能按钮
用TAG生成的HTML报表,可以让系统自动生成打印、存为Excel、存为PDF、从Excel 导入等功能按钮,其位置固定在功能条中,如果不想使用这些按钮而想用自己在JSP文件中放的HTML元素来实现这些功能,那么让鼠标单击该元素时执行下面的JavaScript函数则可:
(1)打印:reportName_print()
(2)存为Excel:reportName_saveAsExcel()
(3)存为PDF:reportName_saveAsPdf()
(4)从Excel导入:reportName_importExcel()
reportName是指生成报表时的TAG标签中的name指定的报表ID。

4.5填报报表中的自定义数据有效性函数
填报报表支持用户在JSP文件中编写自定义的javascript数据有效性验证函数,函数名为“tag中的name_userDefineV alidScript()”,当所有数据都满足要求时,此函数返回true,否则返回false。

对报表中单元格(html的table的cell)的引用格式为“报表id_单元格名”,其中单元格名必须大写,如“report1_D7”。

现举例说明如下:
(1)单表填报:<report:html name=myReport reportFileName="…"…… />,此时自定义函数名为myReport_userDefineV alidScript(),对单元格引用方式为“myReport_A1”。

(2)多表填报:<report:sheets name=mySheets sheets="a.raq,sheet1;b.raq,sheet2"…/>,此
时自定义函数名为mySheets_userDefineV alidScript(),对单元格引用方式为“sheet1_A1”、“sheet2_B1”等。

4.6自定义填报报表中的编辑器边框
缺省的编辑器边框是红色的矩形框,可以采取在JSP文件中报表标签之前设置如下JavaScript变量,来定义编辑器的四个边框样式,取值采用HTML中的边框取值:<script language=javascript>
var _editorBorderLeft = "black thin inset";
var _editorBorderTop = "black thin inset";
var _editorBorderRight = "cadetblue thin inset";
var _editorBorderBottom = "cadetblue thin inset";
</script>
5报表参数及宏输入
5.1Tag中输入参数
前面介绍的报表Tag标签中有一个params属性,可以用来为报表输入参数或宏的值。

其格式为:
<report:html ……
params="param1=value1;param2=value2;……;macro1=value1;……"
……
/>
参数及宏的个数应该与报表中的参数及宏个数相同,参数名及宏名大小写一致。

如果参数值或宏值是变化的,那么应该先在JSP代码中将参数串拼好,再传入Tag中,如下所示:
<%
String params = "param1=" + value1 + ";param2=" + value2 + ";" ……";macro1=" + value1 + ……
%>
<report:html ……
params="<%=params%>"
……
/>
5.2用表单输入参数
(1)缺省参数及宏输入表单:根据设置的参数及宏个数,生成相同个数的文本输入框及
中文提示,参数值必须用户手动输入,不能下拉选择。

要生成此表单只需在tag标签中加入参数generateParamForm="yes"即可。

(2)自己编写参数及宏输入表单
自己编写的表单是一个html的form元素,其大致如下所示:
<form method=post action="<%=request.getContextPath()%>/setReportParams"> <table><tr style="FONT-SIZE: 13px; FONT-FAMILY: 宋体">
<td style="COLOR: cornflowerblue">&nbsp;性别</td><td>
<select name="sex" style="WIDTH: 70px">
<option value=1>男</option>
<option value=2>女</option>
</select>
</td>
<td style="COLOR: dodgerblue">&nbsp;班级</td><td>
<select name="class" style="WIDTH: 70px">
<option value=1>一班</option>
<option value=2>二班</option>
</select>
</td>
<td>&nbsp;<input type=submit value=查询style="FONT-SIZE: 13px;
WIDTH: 40px; COLOR: mediumblue; FONT-FAMILY: 宋体; HEIGHT: 22px;
BACKGROUND-COLOR: wheat"></td>
</tr></table>
<input type=hidden name=resultPage value="/selfArg.jsp">
</form>
说明:
1、form的action必须与此示例相同
2、参数个数必须与要显示的报表所设计的参数及宏个数一致(如未输入
则使用报表设计时填的缺省值),参数名称也大小写相同
3、form中必须有一个隐藏的参数名叫resultPage,其值为相对于应用根
目录的报表显示页面路径。

5.3用TAG生成参数表单
5.3.1一个简单例子
假如有一张显示学生成绩的报表,名为student.raq,此报表有三个参数:性别(sex)、班级(class)、出生月份(month)。

性别的输入方式为下拉列表框(1代表男,2代表女),班级的输入方式为下拉数据窗口,月份的输入方式为简单输入框。

下面我们先来定义一个参数表单:
运行报表设计器,新建一张“填报或参数表单”报表,如下图所示:
在此报表中,输入参数名标签,删除多余的行列后,如下图所示:
使A1、C1、E1单元格的“是否可写”属性为false,将此报表存为studentParam.raq。

选中B1单元格,在右边的属性列表中“参数名/JSP引用变量名”填入此格对应的报表参数名sex,如下图所示。

同样,对D1填入class,F1填入month。

选中B1单元格,点击右键在弹出菜单中选择“数据类型及编辑风格”,在弹出窗口中设置其编辑风格为“下拉列表框”,编辑代码值和显示值如下图所示:
选中D1单元格,点击右键在弹出菜单中选择“数据类型及编辑风格”,在弹出窗口中设置其编辑风格为“下拉数据窗口”,编辑各项如下图所示:
最后保存此报表,完成参数表单的定制。

现在来看如何在网页中发布,如下JSP文件所示:
<%@ page contentType="text/html;charset=gb2312" %>
<%@ taglib uri="/WEB-INF/runqianReport.tld" prefix="report" %>
<html>
<body>
<report:param name="studentParam" paramFileName="studentParam.raq" />
<report:html name="student" reportFileName="student.raq"
funcBarLocation="boTh"
needPageMark="yes"
functionBarColor="#fff5ee"
funcBarFontSize="9pt"
funcBarFontColor="blue"
separator="&nbsp;&nbsp;"
needSaveAsExcel="yes"
needSaveAsPdf="yes"
needPrint="yes"
pageMarkLabel="页号{currpage}/{totalPage}"
printLabel="打印"
displayNoLinkPageMark="yes"
params="class=2;sex=1"
saveAsName="学生成绩表"
/>
</body>
</html>
运行结果如下图所示:
5.3.2更多TAG属性
1、上面例子是参数表单和报表在同一页面中,如果报表结果在另外一个JSP页面
中,如在[应用根目录]\myReport\student.jsp中,则应该指定resultPage属性,
如下:
<report:param name="studentParam" paramFileName="studentParam.raq"
resultPage="/myReport/student.jsp"
/>
2、如果想将报表结果在新窗口或框架网页的某框架frame中显示,则应指定target
属性,如下
<report:param name="studentParam" paramFileName="studentParam.raq"
resultPage="/myReport/student.jsp"
target="_blank"
/>
3、如果想用一个图片来代替“查询”按钮,则可指定submitLabel属性,如下
<report:param name="studentParam" paramFileName="studentParam.raq"
resultPage="/myReport/student.jsp"
submitLabel="<img src=’images/query.jpg"
/>
4、自动生成的提交链接总是位于表单的最下面一行,如果想自定义链接在页面中
的位置,需要指定needSubmit="no",然后有两个办法。

(1)在JSP文件中指定,如下:
<table><tr><td>
<report:param name="studentParam" paramFileName="studentParam.raq"
needSubmit="no"
/></td>
<td><a href="javascript:_submit( studentParam )"><img src="images/query.jpg"
border=no></a></td>
</tr></table>
上面红色的部分就是定义查询按钮的,只要鼠标单击时执行
_submit( formName )脚本函数即可,函数的参数是参数表单的名字,即
<report:param name="studentParam" …/>中的studentParam,所以也可以将上面
的红色部分定义成如下:
<td><img src="images/query.jpg" onclick="_submit( studentParam ) "></td>
显示效果如下:
(2)在设计参数表单时定义:
如下图所示,在参数表单中增加一列,选中G1单元格,设置其数据类型为
“HTML文本”,输入其单元格值为:
<img src="images/query.jpg" onclick="_submit( studentParam ) ">
这样也可达到与(1)同样的效果。

5.3.3参数提交时的控制
如果需要对提交的参数作一些处理,那么可以写一个java类,此类应从com.runqian.report.input.AbstractParamProcessor类继承,并在process()方法中实现你的处理。

然后在TAG中指定processor属性为你的java类名,如:
<report:param name="studentParam" paramFileName="studentParam.raq"
resultPage="/myReport/student.jsp"
processor="test.MyParamProcessor"
/>
在此类中可以直接使用HttpSession对象session,可以获得应用中的数据库连接,可以获得提交的参数,可以增加或修改参数。

举例如下:
package test;
import java.sql.*;
import com.runqian.report.input.*;
public class MyParamProcessor extends AbstractParamProcessor {
public boolean process() {
//获取登录应用的用户名
String userId = ( String ) session.getAttribute( "userId" );
//到数据库查询此用户查看学生成绩的权限,假如查出他只能看男生的成绩
boolean canLookupGirlScore = true;
Connection con = null;
try {
con = getConnection(); //获取缺省数据库连接
//con = getConnection( "jdbc/test" ); //获取指定数据源名的连接
//数据库查询权限,略去
canLookupGirlScore = false;
}
catch( Exception e ) {
setErrorMsg( e.getMessage() );
return false;
}
finally {
try { if( con != null ) con.close(); }catch( Exception e ) {}
}
String sexV alue = getParamV alue( "sex" ); //获取提交的性别参数
if( ! canLookupGirlScore && sexV alue.equals( "2" ) ) {
setErrorMsg( "你不能查看女生的成绩!" );
return false;
}
putParam( "userId", userId ); //增加一个报表参数userId
putParam( "month", "2" ); //修改提交的出生月份参数为2月
return true;
}
}
5.3.3.1 com.runqian.report.input.AbstractParamProcessor
类的API说明
public class AbstractParamProcessor implements ParamProcessor
属性:
protected javax.servlet.http.HttpSession session:session对象
方法:
public boolean process()
说明:参数表单预处理方法, 此方法由用户类覆盖,系统调用此方法
返回值:满足预处理要求,返回true,由系统继续提交参数;否则返回false,设置不满足信息,由系统负责显示此信息,并终止提交参数
public java.sql.Connection getConnection()
说明:获得WEB应用中的缺省数据库连接
public java.sql.Connection getConnection( ng.String dsn )
说明:获得WEB应用中指定数据源名的数据库连接
参数:dsn - 数据源名
public ng.String getParamV alue( ng.String paramName )
说明:获得前端提交的参数值
参数:paramName –参数名
public void putParam( ng.String paramName, ng.String paramV alue ) 说明:获得前端提交的参数值
参数:paramName –参数名
paramV alue –参数值
public void setErrorMsg( ng.String msg )
说明:设置不满足预处理要求时的错误信息
参数:msg - 错误信息
5.3.4隐含参数的传递
WEB中一般有一些全局的变量,如登录用户名、用户角色等,而在报表中可能会用到这些作为参数值,那么在用参数表单时怎么将这些值传进去呢?
这时一种办法是可以通过设置hiddenParams属性来处理,例如:
<%
String userId = ( String ) session.getAttribute( "userId" );
String role = ( String ) session.getAttribute( "userRole" );
String hiddenParams = "userId=" + userId + ";userRole=" + role;
%>
<report:param name="studentParam" paramFileName="studentParam.raq"
resultPage="/myReport/student.jsp"
hiddenParams="<%=hiddenParams%>"
/>
另一种办法是在上小节中介绍的预处理中添加参数。

5.3.5参数有效性验证
在参数提交以前,一般希望对参数的有效性进行一些检验,这可以在参数表单的设计时进行定义。

例如在前面的例子中,如果我们要求出生月份必须介于1和12之间,选中单元格F1,单击右键在弹出菜单中选择“填报属性”,在弹出窗口中选择“数据校验”,并增加一条如下图所示。

校验公式应该遵循JavaScript的语法和函数规则。

并在右边的属性列表“填报数据类型”中选择“整数型”。

6对HTML报表单元格值的引用
在报表编辑器中,选定某不可扩展单元格,在其“参数名/JSP引用变量名”属性中填入要在JSP文件中引用此单元格值的变量名(大小写相关)。

在JSP文件中可有两种使用方法(假如变量名为myV ar):
(1)在JSP代码中引用:
<%
String myV ar = request.getAttribute( "myV ar" );
%>
(2)使用tag标签引用:
<report:var name="myV ar" />
两种引用方式均需在报表标签<report:html …… />之后方可有效,或因报表分页之后,要引用的单元格不在此页中,引用的值将会是null。

7填报数据保存前的预处理
对于填报式报表,系统为程序员提供数据保存前的预处理接口,即用tag标签中processor属性指定一个java类名,此java类必须从com.runqian.report.input.AbstractProcessor类继承,并覆盖其中的process()方法,预处理的代码都写在此方法中,如满足预处理的要求,则返回true,否则返回false,并设置相应的信息。

如果没有指定processor属性,则不做任何预处理,直接保存数据。

预处理类中可以使用HttpSession对象、获得数据库连接、获得前端提交的数据,因此可以检查用户登录信息、操作权限、数据有效性或其他信息。

详细例子请参见后文“示例”一节。

下面是com.runqian.report.input.AbstractProcessor类的API文档:
public class AbstractProcessor implements com.runqian.report.input.InputProcessor
属性:
protected javax.servlet.http.HttpSession session:session对象
protected ng.String tableId多表填报时, 当前要保存的报表在网页中的ID名
方法:
public boolean process()
说明:填报预处理方法, 此方法由用户类覆盖,系统调用此方法
返回值:满足预处理要求,返回true,由系统继续保存数据;否则返回false,设置不满足信息,由系统负责显示此信息,并终止保存数据
public java.sql.Connection getConnection()
说明:获得WEB应用中的缺省数据库连接
public java.sql.Connection getConnection( ng.String dsn )
说明:获得WEB应用中指定数据源名的数据库连接
参数:dsn - 数据源名
public ng.String getCellData( ng.String cellName )
说明:获得前端提交的报表单元格数据
参数:cellName - 报表单元格名称,如A1, B2等
public void setErrorMsg( ng.String msg )
说明:设置不满足预处理要求时的错误信息
参数:msg - 错误信息
8示例
8.1由文件直接发布报表
8.1.1html报表
<%@ page contentType="text/html;charset=gb2312" %>
<%@ taglib uri="/WEB-INF/runqianReport.tld" prefix="report" %>
<html>
<body>
<report:html name="report1" reportFileName="print.raq"
width="600"
height="800"
columns="1"
funcBarLocation="both"
needPageMark="yes"
functionBarColor="#fff5ee"
funcBarFontFace="隶书"
funcBarFontSize="11pt"
funcBarFontColor="#00ff7f"
separator="|"
needSaveAsExcel="yes"
needPrint="yes"
pageMarkLabel="页号{currpage}/{totalPage}"
printLabel="<img src=images/print.gif>打印"
generateParamForm="yes"
/>
</body>
</html>
8.1.2单表填报报表
<%@ page contentType="text/html;charset=gb2312" %>
<%@ taglib uri="/WEB-INF/runqianReport.tld" prefix="report" %>
<html>
<body>
<report:html name="student" reportFileName="studentInput.raq"
funcBarLocation="bottom"
submit="提交到服务器"
needOfflineInput="yes"
saveAsName = "学生情况填报表"
processor="test.MyProcessor1"
/>
</body>
</html>
test.MyProcessor1.java:
package test;
import java.sql.*;
import com.runqian.report.input.*;
public class MyProcessor1 extends AbstractProcessor {
public boolean process() {
//检查用户是否登录
String userId = ( String ) session.getAttribute( "userId" );
if( userId == null ) {
setErrorMsg( "您还没有登录!" );
return false;
}
//检查是否有权限录入数据
Connection con = getConnection();
Statement stmt = null;
try {
String sql = "select * from inputUser where userId = '" + userId + "'";
stmt = con.createStatement();
ResultSet rs = stmt.executeQuery( sql );
if( ! rs.next() ) {
setErrorMsg( "您没有录入数据的权限!" );
return false;
}
}
catch( Exception e ) {
setErrorMsg( e.getMessage() );
return false;
}
finally {
try {
if ( stmt != null ) stmt.close();
if ( con != null ) con.close();
}catch( Exception e ) {}
}
//取某单元格数据
String cellData = getCellData( "D2" );
System.out.println( cellData );
if( cellData == null || cellData.trim().length() < 3 ) {
setErrorMsg( "姓名必须由3个以上字符组成!" );
return false;
}
return true;
}
}
8.1.3多表填报报表
<%@ page contentType="text/html;charset=gb2312" %>
<%@ taglib uri="/WEB-INF/runqianReport.tld" prefix="report" %>
<html>
<body leftMargin=20>
<report:sheets name="sheets1" sheets="sheet1.raq,sheet1,学生情况表;jjzj.raq,jjzj,基金增减;sheet3.raq,sheet3"
funcBarLocation="bottom"
submit="提交到服务器"
needOfflineInput="yes"
offline="保存到本机"
saveAsName="多表填报测试"
params="arg1=1999"
tabBackColor="lightskyblue"
tabHLBackColor="peachpuff"
tabFontColor="yellow"
tabHLFontColor="red"
tabFontName="隶书"
tabFontSize="18px"
border="4px double peachpuff"
margin="10"
separator="&nbsp;<font color=orange>|</font>&nbsp;"
sheetsRelation="sheet3_a1.length > sheet1_d2.length @sheet3中第一格的值长度必须大于'学生情况表'中'姓名'的长度!; sheet3_b1 > jjzj_g8 @sheet3中第二格的数值必须大于基金增减表中第一行的上年结余合计!"
processor="test.MyProcessor2"
/>
</body>
</html>
test.MyProcessor2.java:
package test;
import com.runqian.report.input.*;
public class MyProcessor2 extends AbstractProcessor {
public boolean process() {
//其他处理可同MyProcessor1.java
//取某单元格数据
if( tableId.equals( "sheet1" ) ) {
String cellData = getCellData( "D2" );
System.out.println( "学生姓名:" + cellData );
}
if( tableId.equals( "jjzj" ) ) {
String cellData = getCellData( "f8" );
System.out.println( "科目名称:" + cellData );
}
return true;
}
}
8.1.4打印模式的报表
<%@ page contentType="text/html;charset=gb2312" %>
<%@ taglib uri="/WEB-INF/runqianReport.tld" prefix="report" %>
<html>
<body >
<report:print name="report1" reportFileName="scores.raq"
width="800"
height="600"
generateParamForm="yes"
canModify="no"
params="class=2;sex=1"
/>
</body>
</html>
8.2API使用例子
8.2.1修改where条件再发布
<%@ page contentType="text/html;charset=gb2312" %>
<%@ taglib uri="/WEB-INF/runqianReport.tld" prefix="report" %>
<%@ page import="ermodel.*" %>
<%@ page import="com.runqian.base.util.*" %>
<%@ page import="com.runqian.base.module.*" %>
<%@ page import="com.runqian.report.cellset.*" %>
<html>
<body bgcolor=cyan>
<%
//从报表文件中构造一个报表定义对象
ReportDefine rd = new ReportDefine( application.getRealPath(
"/reportFiles/scores.raq" ) );
//获得报表定义中的数据集集合
ReportDataSetConfigs dscs = rd.getDataSetConfigs();
//取到需要修改的数据集对象
DataSetConfig dsc = dscs.get( "ds1" );
//取得数据集对象中的SQL
String sql = dsc.getSQL();
String where = "student.id=scores.id and student.class=2 and student.sex='1'";
//替换SQL中的where条件
sql = SQLParser.modify( sql, SQLParser.KEY_WHERE, where );
//将修改后的SQL设置到数据集对象中
dsc.setSQL( sql );
//删除原数据集对象中的SQL参数(如果原数据集对象没有参数,则不用写以下两句)
dsc.removeSQLArgument(1);
dsc.removeSQLArgument(0);
//将修改后的报表定义对象保存到request中,以供下面的Tag使用
request.setAttribute( "scores", rd );
%>
<report:html name="report1" srcType="defineBean" beanName="scores"
needPageMark="yes"
functionBarColor="#fff5ee"
funcBarFontFace="隶书"
funcBarFontSize="11pt"
funcBarFontColor="#00ff7f"
separator="|"
needSaveAsExcel="yes"
needSaveAsPdf="yes"
needPrint="yes"
pageMarkLabel="页号{currpage}/{totalPage}"
printLabel="打印"
generateParamForm="yes"
displayNoLinkPageMark="yes"
canModifyBeforePrint="yes"
/>
</body>
</html>
8.2.2自建数据库连接,调用报表引擎计算后再发布
<%@ page contentType="text/html;charset=gb2312" %>
<%@ taglib uri="/WEB-INF/runqianReport.tld" prefix="report" %>
<%@ page import="ermodel.*" %>
<%@ page import="com.runqian.base.util.*" %>
<%@ page import="com.runqian.report.cellset.*" %>
<%@ page import="java.sql.*" %>
<html>
<body bgcolor=cyan>
<%
Connection con = null;
try
{
//从报表文件中构造一个报表定义对象
ReportDefine rd = new ReportDefine( application.getRealPath(
"/reportFiles/scores.raq" ) );
//构造一个报表环境实例
Env env = new Env( rd );
//获取数据库连接
Class.forName( "oracle.jdbc.driver.OracleDriver" );
con = DriverManager.getConnection( "jdbc:oracle:thin:@192.168.0.27:1521:demo", "system", "manager" );
//为报表环境设置数据库连接、数据库类型、字符集编码
env.setConnection( con, "gb2312", DBTypes.ORACLE );
//设置报表参数(如果不需要参数,则不写以下两行)
env.putParam( "class", new Integer( 2 ) );
env.putParam( "sex", "1" );
//构造一个报表引擎实例
Engine e = new Engine( env );
//利用报表引擎计算得到报表实例
Report report = e.calc();。

相关文档
最新文档