[转载]最终用户在线设计和修改Web报表 – Web打印 – 博客园.
我在最近主持开发的人力资源管理系统中遇到一个新的问题:就是最终用户要能够设计和编辑报表。在人力资源管理系统中有一个基本的功能,就是编辑和打印员工 的工作证,不同职务的员工的工作证可能不一样,同一个员工不同工作时期(比如实习员工、正式员工)的工作证也可能不一样。项目方要求我们一定要做到操作员 可以在线设计和修改工作证的格式(实际上就是报表),否则就一切免谈。客户是上帝!呵呵,努力做吧。于是大家搜罗了所有的Web打印软件,结果包括大名鼎 鼎的水晶报表也没有这个功能。
好在天无绝人之路,我在以前所设计的一个基于FastReport的Web打印控件之上进行了大量的修改,终于实现了最终用户的在线设计和编辑报表的功能,用户也比较满意。
报表的预览窗口如下图:
报表的最终用户在线设计和编辑窗口如下图:
当然报表的在线编辑窗口有一点专业,操作员需要经过一点培训才会使用,不过一般情况是我们先帮用户设计好了模板,操作员平时只是要做一些微调,比如改个字或改个格式等。报表编辑好后,点击就可以自动把报表保存到服务器,且提示 。
下面详细的讲解一下怎样利用我设计的Web打印控件实现最终用户的在线设计和修改报表,且自动把报表保存至服务器。讲解以ASP.NET为例,当然其它语 言也可以举一反三,很容易实现。因为调用打印控件统一是JavaScirpt,提交服务器的数据是Http协议的Post方式,这些都是通用的。
最终用户在线设计和修改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。
报表预览和编辑的网址:http://www.xinyuerj.com/ASP/
http://www.xinyuerj.com/ASP.NET/