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

原创 2002年03月07日 09:01:00
 

巧用ASP实现Web数据统计、报表和打印<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

  本文阐述一种利用ASP实现Web数据统计、报表的基本思路和实现方法,同时提供一种巧妙调用Word打印报表的解决方案。

关键词 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数据统计、报表和打印的过程如图所示:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

浏览器

HTML

VBScript

统计

报表

Word

对象

Web服务器

业务逻辑实现

数据库

访问接口

Word本地打印

 

 

 

 

 

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

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

(3)       在客户端运行脚本,使用VBScript脚本函数CreateObject在本地创建WordDocument对象的实例,也就是在客户端创建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">  //注意:此处标明表格的iddata

    <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%>

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

<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     //flag1

  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   //rowtable的行数

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

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文档

 

参考网址:

动感教育网  www.activeedu.net

VS2013自带报表+打印功能

VS自带报表控件和打印功能,这样就给我们这些编程者带来了很大的方便。下面就将我做程序的一些小经历来跟大家一起分享一下。 1,我们右击U层所在文件夹添加“新建项”。 ...
  • bigpudding24
  • bigpudding24
  • 2016年01月19日 11:23
  • 8397

Asp.net MVC3使用Reporting Services生成PDF解决Web在线打印

目前产品上一直使用的是微软的SQL Server Reporting Services给用户输出报表。可是在WEB打印上一直是一个心病,因为要调用微软的RSClient控件,可是这个控件在浏览器上存在...
  • fly_miss
  • fly_miss
  • 2016年02月01日 09:21
  • 1197

VS2013自带报表+打印功能

vs自带报表 vs打印报表
  • u010773667
  • u010773667
  • 2014年05月29日 17:57
  • 5276

ASP环境下轻松实现报表的打印 (转)

作者:zcg2000 一、前言 ASP在电子商务上应用广泛,报表的处理又有一些麻烦。本文介绍了在ASP中利用 本人写的Report Server Page脚本解释器实现报表的显示、打印。 二、...
  • tbmqzmavp
  • tbmqzmavp
  • 2014年05月11日 18:04
  • 831

报表 web 打印 asp

  • 2010年09月06日 11:27
  • 3.56MB
  • 下载

数据统计1(各种统计图形)

饼图:参与者太多,对比又不太明显的时候不适合使用饼图 条形图:可以比较直观的用于比较,适用于对类别的比较,但是不好看趋势 折线图:比较容易看趋势,折线图的横轴必须是数值型,也就是说横轴本身有一定的...
  • yu3000
  • yu3000
  • 2017年01月23日 10:41
  • 126

asp报表系统

  • 2007年09月30日 15:01
  • 182KB
  • 下载

ReportViewer动态报表开发完整步骤

在朋友的邀请下,给他们公司开发一个简单的公司门户网站。本人都多年没有写ASP.NET C#代码了。这几年都在做数据库和商务智能这块。反正朋友说网站不难,就个简单的展现网站,于是就答应了。如是就找了一天...
  • waterxcfg304
  • waterxcfg304
  • 2015年05月17日 16:08
  • 58135

ASP.NET报表简单使用示例

在ASP.NET应用程序中,有时我们需要将一些数据以统计图的方式显示在页面中,ASP.NET报表就为我们提供了这种便利。如下图所示,它是一个站点每天访问IP、PV的数量统计图: 下面我们...
  • tzjly
  • tzjly
  • 2011年09月17日 13:59
  • 9637

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

本文阐述一种利用ASP实现Web数据统计、报表的基本思路和实现方法,同时提供一种巧妙调用Word打印报表的解决方案。 关键词: ASP,数据统计,报表,打印,Word  1、 引言 随着Interne...
  • okfei
  • okfei
  • 2008年12月19日 00:03
  • 318
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:巧用ASP实现Web数据统计、报表和打印
举报原因:
原因补充:

(最多只允许输入30个字)