今日是:
  小新技术网 -=> 网页编程 -=> asp专区 -=> 正文

巧用ASP实现Web数据统计、报表和打印

作者:[本站编辑] 来源:[本站] 浏览:[] 评论:[]  【字体:

关键词: ASP,数据统计,报表,打印,Word



1、 引言

随着Internet的飞速发展,基于Web开发的业务应用系统越来越多,如办公自动化、电子商务和管理信息系统(MIS)等。这些Web业务应用系统经常涉及到数据的统计、报表和打印。ASP在实施动态交互和生成动态页面方面具有很大的优势,但在处理复杂数据统计、报表和打印时却遇到不小的麻烦。本文阐述一种利用ASP实现Web数据统计、报表的基本思路和实现方法,同时提供一种巧妙调用Word打印报表的解决方案。



2、 应用实例

假设有一家公司利用网络MIS系统对公司员工进行管理,必然会涉及到各部门的员工统计。为了简单起见,假设最终的统计报表如下:



公司员工统计表

部门
合计
员工姓名

市场部
2
张三


  
李四

研发部
3
王五


  
赵六


  
刘七

员工合计
5
  




与传统单机MIS系统相比,在网络MIS系统中使用ASP实现以上数据统计、报表和打印会遇到以下问题:

(1)       数据统计时需要按部门进行分类统计,同时要记下各部门员工的具体名单。

(2)       报表生成时需按具体要求动态绘制几行几列表格,同时在适当的地方保持空白。

(3)       表格打印可以简单地按网页打印,但效果不好,而且不容易控制。



3、 实现方法简述

基于Web的业务应用一般采用三层结构,客户端是普通的Web浏览器,中间业务逻辑应用层存放于Web服务器上,由Web服务器上的数据库接口访问后台数据库。利用ASP实现Web数据统计、报表和打印的过程如图所示:


浏览器

HTML

VBScript

统计

报表

Word

对象

Web服务器

业务逻辑实现

数据库

访问接口







Word本地打印












(1)       客户端向Web服务器发送数据统计请求。

(2)       Web服务器执行SQL语句,从后台数据库取得统计数据,在页面上动态生成报表。

(3)       在客户端运行脚本,使用VBScript脚本函数CreateObject在本地创建Word的Document对象的实例,也就是在客户端创建Word文档,设定表格属性,然后将页面上的报表数据填入本地Word表格,最后保存文档,执行本地Word打印。



4、 实现过程分析

(1)数据库连接

首先建立数据库(data.mdb),简单的员工资料表(personnel)结构如下:

personnel:department,文本;name,文本;

然后建立一个ODBC数据源(DSN),利用DSN指向ODBC数据库

(2)程序代码分析(在此只分析统计报表程序tongji.asp)

<%

sql = "Select department,count(department) From personnel group by department" //将记录按部门分类统计

Set Cnn = Server.CreateObject("ADODB.Connection")  //连接数据库

Cnn.Open "data"

Set Rs = Server.CreateObject("ADODB.Recordset")

Rs.CursorType = 3

Rs.LockType = 3

Rs.Open sql, Cnn

If Rs.EOF Then          //如果没有记录就结束

   Response.End

End If

%>

<html>

//以下显示表格标题和输出表头

<p align="center"><b><font size="4">公司员工统计表</font></b></p>

<div align="center">

  <table id="data" border="1" width="606" height="53" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111">  //注意:此处标明表格的id为data

    <tr>

      <td width="93" height="24">

        <p align="center"><font size="2">部门</font></td>

      <td width="78" height="24">

        <p align="center"><font size="2">合计</font></td>

      <td width="413" height="24">

        <p align="center"><font size="2">员工姓名</font></td>

    </tr>

       

<%

hj=0  //设置变量,总人数合计初始值为0

//以下While循环按部门依次完成统计和报表

while (not rs.eof)

departmenttmp=rs("department")  //设置临时变量,保存当前部门名称

sqlstr="select * from personnel where department='"&departmenttmp&"'"  //找出当前部门的所有员工

Set conn = Server.CreateObject("ADODB.Connection")  //再次连接数据库

conn.Open "data"

Set rss = Server.CreateObject("ADODB.Recordset")

rss.CursorType = 3

rss.LockType = 3

rss.Open sqlstr, conn

number=0  //设置变量,当前部门人数合计初始值为0

//以下While循环计算出当前部门人数合计

while(not rss.eof)

rss.movenext

number=number+1

  wend

hj=hj+number  //总人数合计为各部门人数之和

rss.movefirst

flag=0  //设置变量,flag用来判断当前部门是否首次出现,初始值为0

//以下While循环输出当前部门统计数据和员工名单

  while(not rss.eof)%>

        <tr>

        <%if (flag=0) then%>

//如果flag为0,表示该部门是首次出现,表格此处就应该输出部门名称,部门员工合计人数

<td width="93" height="24"><p align="center"><font size=2><%=departmenttmp%></font></td>

              <td width="78" height="24"><p align="center"><font size=2><%=number%></font></td>

        <%else%>

//如果flag不为0,表示该部门不是首次出现,表格此处就应该输出空白

              <td width="93" height="24"><p align="center">&nbsp;</td>

              <td width="78" height="24"><p align="center">&nbsp;</td>

        <%end if%>

//无论该部门是否首次出现,此处输出员工姓名

         <td width="413" height="24"><p align="center"><font size=2><%=rss("name")%></font></td>

        <%rss.movenext   //当前部门员工记录指针rss指向下一个员工记录

        flag=flag+1     //flag加1

  wend%>

  </tr>

  <%rs.movenext  //部门记录指针rs指向下一个部门记录

wend%>

<tr>

//表格最后一行输出总人数合计

       <td width="93" height="24"><p align="center"><font size=2>员工合计</font></td>

       <td width="78" height="24"><p align="center"><font size=2><%=hj%></font></td>

    <td width="413" height="24"><p align="center"><font size=2>&nbsp;</font></td>

    </tr>

  </table>

</div>

<input type=button onclick="vbscript:buildDoc" value="打印">  //点击“打印”按钮,调用vbscript函数buildDoc生成本地Word文档,实现本地打印。

</html>

//以下VBScript代码实现buildDoc函数

<script language="vbscript">

Sub buildDoc

set table = document.all.data   //把html文档中的表格data的结构和数据赋值给table

row = table.rows.length   //row为table的行数

column = table.rows(1).cells.length   //colnum为table的列数

Set objWordDoc = CreateObject("Word.Document")  //创建一个Word.Document的对象

Dim theArray(10,10000)   //定义数组变量,存放表格中的数据,10是虚拟列数,10000是虚拟行数

//以下两层for循环将html文档的表格中的纯文本数据赋值给数组

for i=0 to row-1

for j=0 to column-1

theArray(j+1,i+1) = table.rows(i).cells(j).innerTEXT  

next

next



objWordDoc.Application.ActiveDocument.Paragraphs.Add.Range.InsertBefore("公司员工统计表")   //显示表格标题

objWordDoc.Application.ActiveDocument.Paragraphs.Add.Range.InsertBefore("") //输出标题后回车换行



Set rngPara = objWordDoc.Application.ActiveDocument.Paragraphs(1).Range

//以下With代码段设置标题属性

With rngPara

.Bold = True   //将标题设为粗体

.ParagraphFormat.Alignment = 1   //将标题居中

.Font.Name = "Arial"    //设定标题字体

.Font.Size = 12    //设定标题字体大小

End With



Set rngCurrent = objWordDoc.Application.ActiveDocument.Paragraphs(3).Range

Set tabCurrent = ObjWordDoc.Application.ActiveDocument.Tables.Add(rngCurrent,row,column)

//以下for循环输出表头

for i = 1 to column

objWordDoc.Application.ActiveDocument.Tables(1).Rows(1).Cells(i).Range.InsertAfter theArray(i,1)

objWordDoc.Application.ActiveDocument.Tables(1).Rows(1).Cells(i).Range.ParagraphFormat.alignment=1

next

//以下两层for循环输出表格实际内容

For i =1 to column

For j = 2 to row

objWordDoc.Application.ActiveDocument.Tables(1).Rows(j).Cells(i).Range.InsertAfter theArray(i,j)

objWordDoc.Application.ActiveDocument.Tables(1).Rows(j).Cells(i).Range.ParagraphFormat.alignment=1

Next

Next

objWordDoc.Application.ActiveDocument.SaveAs

End Sub

</script>



5、 结束语

以上程序在Windows2000及IIS5.0下运行通过,数据库采用Access2000。执行打印之前,需要将浏览器的安全级别设为低,或在中级安全级别下将ActiveX控件设为启用。该方法的优点在于实现统计报表十分简单,调用Word打印非常方便,并且可以按用户要求对表格属性进行设置;不足之处是需要调节浏览器的安全设置,且不支持图片和特殊字体的打印,同时客户端必须安装Microsoft Word软件。



参考文献:

[1]《Active Server Page & WEB数据库》,王国荣著,人民邮电出版社,2000。

[2] MSDN Library Visual Basic文档
]]>
下一篇:ASP小偷(远程数据获取)程序入门教程
上一篇:ASP网页访问权的控制
IP查询、IP签名
打印 】【 收藏 】【 评论 】【 推荐
相关文章 栏目推荐文章 栏目热门文章
 推荐文章 ASP系列讲座(一)关于 Active Se.. 
 推荐文章 ASP 编程中20个非常有用的例子 
 推荐文章 精华代码集 
 推荐文章 一个不太让人讨厌的自动弹出窗口 
 推荐文章 如何用ASP编写网站统计系统 
 推荐文章 用Asp隐藏文件路径实现防盗链 
 推荐文章 巧用ASP实现Web数据统计、报表和打.. 
 推荐文章 纯ASP上传图像文件到数据库的最佳.. 
 普通文章 1小时ASP入门,非常简单 
 普通文章 ASP基本语法 
 普通文章 使用ASP生成HTML文件 
 普通文章 ASP防注入简单易行 
 普通文章 实现有管理功能的ASP留言板 
 普通文章 Asp深度揭密 
 普通文章 用ASP打开远端MDB文件的方法 
 推荐文章 巧用ASP实现Web数据统计、报表和打.. 
最新文章 最新推荐文章 热门文章
 普通文章 简历封面 
 普通文章 简历封皮(二) 
 推荐文章 用好Windows共享 确保安全 
 推荐文章 多点出发:消除局域网遗留共享痕迹.. 
 普通文章 只需三步!闪盘立刻变成启动盘 
 普通文章 战无不胜 一目了然看穿局域网 
 普通文章 Win 2000/XP在局域网内批量升级 
 普通文章 黑客经常更改的系统配置文件及注册.. 
 推荐文章 用好Windows共享 确保安全 
 推荐文章 多点出发:消除局域网遗留共享痕迹.. 
 推荐文章 Ghost二十个鲜为人知的实用参数 
 推荐文章 ASP.NET程序中常用的三十三种代码.. 
 推荐文章 黑客利用Ms05002溢出找“肉鸡” 
 推荐文章 C# 3.0语言详解之基本的语言增强 .. 
 推荐文章 Ghost所有运行错误代码完全大揭秘.. 
 推荐文章 利用Java Swing 实现游戏开发 
 推荐文章 秘籍:QQ头像任意换 
 普通文章 提升QQ等级 QQ挂机升级外挂  
 普通文章 QQ100个经典个性签名!可爱经典贴图.. 
 推荐文章 BIOS设置图解教程(多图) 
 普通文章 惊现腾讯QQ刷等级漏洞 
 普通文章 求职简历封皮  
 普通文章 突破在线观看电影 
 普通文章 GIF动画图片制作教程 
点击查看更多评论
笔名:
评论:
[评论将在5分钟内被审核,请耐心等待]
【注】 发表评论必需遵守以下条例:
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款
  • 本站大部分为网络转载,如有版权问题,请通知我们,我们立即更正!

设置首页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyright ©2003-2005 xker.com All rights reserved. 网站合作、广告联系QQ:12231446
小新技术网  冀ICP备05002857号