我在最近主持开发的人力资源管理系统中遇到一个新的问题:就是最终用户要能够设计和编辑报表。在人力资源管理系统中有一个基本的功能,就是编辑和打印员工的工作证,不同职务的员工的工作证可能不一样,同一个员工不同工作时期(比如实习员工、正式员工)的工作证也可能不一样。项目方要求我们一定要做到操作员可以在线设计和修改工作证的格式(实际上就是报表),否则就一切免谈。客户是上帝!呵呵,努力做吧。于是大家搜罗了所有的Web打印软件,结果包括大名鼎鼎的水晶报表也没有这个功能。

      好在天无绝人之路,我在以前所设计的一个基于FastReport的Web打印控件之上进行了大量的修改,终于实现了最终用户的在线设计和编辑报表的功能,用户也比较满意。
报表的预览窗口如下图:

报表的最终用户在线设计和编辑窗口如下图:

       当然报表的在线编辑窗口有一点专业,操作员需要经过一点培训才会使用,不过一般情况是我们先帮用户设计好了模板,操作员平时只是要做一些微调,比如改个字或改个格式等。报表编辑好后,点击就可以自动把报表保存到服务器,且提示   。

     下面详细的讲解一下怎样利用我设计的Web打印控件实现最终用户的在线设计和修改报表,且自动把报表保存至服务器。讲解以ASP.NET为例,当然其它语言也可以举一反三,很容易实现。因为调用打印控件统一是JavaScirpt,提交服务器的数据是Http协议的Post方式,这些都是通用的。
最终用户在线设计和修改Web报表的部分代码如下:

调用Web打印控件
 
protected
void
BtnDepsitAmtDesignPost_Click(
object
sender, EventArgs e)
{
string
FileValue, PrintValue, ParaName, ParaValue;
FileValue
=
FileToString(
"
.\\Frp\\DepositAmt.fr3
"
);
ParaName
=
"
ShopName`~PrintDepositAdd`~PrintPaperNo`~Title
"
;
//
`~为各参数的分隔符
ParaValue
=
"
测试酒楼
"
+
"
`~说明:本单据为贵客押金收取凭证,盖章有效。退房时请出示,遗失者自负,请妥善保存。退房时间为12:00时,延时退房18:00时以前按半天房费收取,18:00时以后算全天房价。押金单有效期为一个月,过期作废。 贵重物品请交前台寄存,未寄存丢失自负。 谢谢!
"
+
"
`~×××:4325011980639512
"
+
"
`~押金单
"
;
SqlConnection ConPrintTest
=
new
SqlConnection(ConfigurationManager.ConnectionStrings[
"
PrintTestConnectionString
"
].ToString());
ConPrintTest.Open();
DataSet DsCashLog
=
new
DataSet();
SqlDataAdapter DaCashLog
=
new
SqlDataAdapter(
"
Select top 1 CashNo, CashDate, CashAmt, PayName, GuestName, RoomNo, ItemRemark, CashUserName, Remark From CashLog
"
, ConPrintTest);
DaCashLog.FillSchema(DsCashLog, SchemaType.Source,
"
CashLog
"
);
DaCashLog.Fill(DsCashLog,
"
CashLog
"
);
PrintValue
=
TableToXml(DsCashLog.Tables[
"
CashLog
"
]);
DsCashLog.Dispose();
ConPrintTest.Close();
string
ScriptStr;
ScriptStr
=
"
<script language='javascript'>window.onload = function() { try { var ObjPrintMange = new ActiveXObject('WebPrint.WebPrintUnit'); } catch(e) { if( confirm('打印控件未安装,现在下载吗?') ) { window.location='./PrintActivex.exe'; } return; } var OldVersion=ObjPrintMange.Version; NewVerion='3.5(2011-02-17)'; if(OldVersion < NewVerion) { ObjPrintMange = null; alert('打印控件需升级。请先进行下载,下载后关闭IE,然后安装升级版。'); window.location='./PrintActivex.exe'; return; }
"
+
"
ObjPrintMange.CheckReg('公司名称', '3B8E5B998A3125EE89983EA940BB2AEE');
"
//
注册码
+
"
ObjPrintMange.ReportFileName='DepositAmt.fr3';
"
+
"
ObjPrintMange.PostURL='http://www.xinyuerj.com/ASPPost/Show.asp?FileName=DepsitAmt.fr3';
"
+
"
ObjPrintMange.DesignReport('
"
+
FileValue
+
"
' , '
"
+
ParaName
+
"
', '
"
+
ParaValue
+
"
', '
"
+
PrintValue
+
"
', '', '', '', '', '');
"
+
"
ObjPrintMange = null; } </script>
"
;
ScriptStr
=
ScriptStr.Replace(System.Environment.NewLine,
string
.Empty);
Response.Write(ScriptStr);
}

        报表控件在以前的基础上增加了PostURL属性,设置此属性,则在报表在线编辑时,单击“保存”按钮或“保存”菜单项,则把报表内容组织为String,且通过Http的Post方式直接提交到所设置的URL页面,用户可以在URL接收报表内容,把报表内容保存在指定文件或数据库中。Post的字段名指定为ReportFileValue,用户可以通过接收此字段的值保存在线编辑的报表内容。报表的内容为String,打印或预览时可以直接调用此内容,无需用FileToStr函数进行转换。

       报表控件的DesignReport函数,功能为在线编辑报表,参数:报表文件字符串,报表参数名称字符串,报表参数值字符串,数据集1的字符串,数据集2的字符串,数据集3的字符串,数据集4的字符串,数据集5的字符串,数据集6的字符串。报表文件字符串调用FileToStr函数产生;报表参数名称字符串为报表中所使用的参数的名称,各名称之间以`~分隔;报表参数值字符串为报表中所使用的参数所对应的值,各参数值之间以`~分隔;数据集的字符串通过调用FileToStr函数产生,若没有数据则为空。
作为接收Http的Post数据的服务器的页面设计如下:

接收提交的报表内容
 
public
partial
class
Show : System.Web.UI.Page
{
protected
void
Page_Load(
object
sender, EventArgs e)
{
string
FileName, FileValue;
FileName
=
Request.QueryString[
"
FileName
"
];
FileValue
=
Request.Form[
"
ReportFileValue
"
];
WriteReportFile(FileName, FileValue);
Response.Write(
"
File Name
"
+
FileName);
Response.Write(
"
File Value
"
+
FileValue);
}
private
void
WriteReportFile(
string
FileName,
string
FileValue)
{
if
( FileName
==
null
||
FileName
==
""
||
FileValue
==
null
||
FileValue
==
""
)
return
;
File.WriteAllText(Server.MapPath(FileName), FileValue);
}
}

      FileName是PostURL中所设置的保存的报表文件名,ReportFileValue则为报表文件的内容。

      如果你的项目也需要最终用户在线设计和修改报表,我所设计这个Web打印控件是一种比较快捷方便的解决方法。Web打印控件目前对于个人可以申请免费注册,有什么问题请加入QQ群:135506194或者请直接Q我:12988672。

报表预览和编辑的网址: