JS + Xml + Excel 做报表(客户端生成)
2007-12-03 16:38
完成的项目计划要补充一个报表子系统。考虑到我们系统的服务器压力较大,因材我考虑使用Js + xml + Excel 在客户端生成报表。
★ 在Server端产生数据: 1> 生成一个DataSet,ds.GetXml()方法返回一个xml格式的字符串. 2> 用一个XmlDocument对象,使用LoadXml(str)方法加载以上的字符串. 3> 将结果组合为一个xml数据岛格式的字符成,并利用LiteralControl写在页面. 4> 写在页面.最后注册客户端方法. Dim ds As New System.Data.DataSet Dim doc As New XmlDocument Dim strXml As New System.Web.UI.LiteralControl .................... doc.LoadXml(ds.GetXml()) strXml.Text = "<XML id=xmlData><?xml version=""1.0"" ?><DataSet>" + doc.DocumentElement.InnerXml + "</DataSet></XML>" PlaceHolder1.Controls.Add(strXml) Me.Page.ClientScript.RegisterStartupScript(Me.GetType, "Case", "Print();", True) ★ 在Client端产生Excel报表: 1> 首先写了一个Excel.js文件.写出公用的方法. 2> 在产生报表的页面引入该文件<script language="javascript" src="Excel.js"></script> 3> 写Print()方法 function Print() { //初始化xmlDoc, 及Excel.Application InitApp() //初始化表格头部 strHead = "地区|SIID|SI名称|学校ID|学校名称|使用用户数|计费用户数|学校下行流量|每计费数|每使数" ; InitHead(strHead,xlsheet) //填充表格 for (i=0;i<nodes.length ;i++ ){ for (j=0;j<nodes[i].childNodes.length ;j++) { xlsheet.Cells(i+2,j+1).Value= nodes(i).childNodes(j).text ; } } //格式化表格 FormatRangeLine(nodes.length+1,strHead.split("|").length) ; //退出 Quit() return false; } /*************************Excel.js **************************************/ var xmlDoc //xml对象 var nodes //数据节点 var xls //Excle对象 var xlBook //工作博对象 var xlsheet //工作表 var strHead //工作表头 //初始化应用程序 function InitApp() { try { xmlDoc = new ActiveXObject("Microsoft.XMLDOM") xmlDoc.async="false" xmlDoc.load(document.getElementById("xmlData")) nodes=xmlDoc.documentElement.childNodes } catch(e) { alert( "要打印该表,您的浏览器须使用“ActiveX 控件”,您的浏览器须允许执行控件。 请点击【帮助】了解浏览器设置方法!"); return false; } try { xls = new ActiveXObject("Excel.Application" ); } catch(e) { alert( "要打印该表,您必须安装Excel电子表格软件,同时浏览器须使用“ActiveX 控件”,您的浏览器须允许执行控件。 请点击【帮助】了解浏览器设置方法!"); return false; } xlBook = xls.Workbooks.Add; xlsheet = xlBook.Worksheets(1); xls.visible = true; } //初始化表头 function InitHead(strHead,xlsheet) { var ArrayHead = strHead.split("|"); for(var i=0;i<ArrayHead.length;i++) { xlsheet.Cells(1,i+1).Value = ArrayHead[i] ; xlsheet.Cells(1,i+1).Interior.ColorIndex = 35; xlsheet.Cells(1,i+1).Font.Bold = true; xlsheet.Columns(i+1).NumberFormatLocal = "@" ; xlsheet.Columns(i+1).HorizontalAlignment = -4152 ; } } //格式化有数据的单元格 function FormatRangeLine(ros,cons) { var m_range = xlsheet.Range(xlsheet.Cells(1,1),xlsheet.Cells(ros,cons)) for(var i=7;i<13;i++) { m_range.Borders(i).LineStyle = 1 ; m_range.Borders(i).Weight = 2 ; m_range.Borders(i).ColorIndex = -4105 ; } xlsheet.Columns.AutoFit; } //释放控件 function Quit() { xls.UserControl = true ; xls=null; xlBook=null; xlsheet=null; } /**************End*********************************/ |