看看ASP是怎样生成Excel报表的

1.  简介
       报表打印通常是管理信息系统中的一个重要模块,而excel凭借它功能强大、应用灵活、通用性强等的优势在报表打印中获得了广泛的应用。
最初的管理信息系统基本上是采用客户机/服务器(c/s)模式开发的,但随着www的广泛应用,目前的管理信息系统已经逐渐开始从c/s模式向浏览器/服务器(b/s)模式转变。b/s模式具有传统c/s模式所不及的很多特点,如更加开放、与软硬件无关、应用扩充和系统维护升级方便等等,目前已成为企业网上首选的计算模式,原先在c/s下的很多软件都开始移植到b/s模式下。由于b/s模式的特殊性,在c/s下相对较易实现的excel报表打印功能在b/s下却成为一个难点。本文根据在实际的项目中总结的经验,以asp为例,给出了一个较好的通用方法。
2. 功能实现
       为了说明问题,这里举一个例子。系统平台是Windows 2000+SQL Server 2000+IIS 5.0+asp 3,报表采用的是excel,要求按照给定的报表格式生成图书销售统计的报表,并能够打印。
2.1 excel报表模板的制作
首先根据给定的报表格式,制作一个excel模板(就是要打印的报表的表格),当然其中需要从数据库中动态统计生成的数据留着空白。这个报表先在excel中画好,然后保存为模板,存放在起来,这里为\test\book1.xlt。
2.2 excel报表的生成与打印
       这里采用了excel的application组件,该组件在安装excel时安装到系统中。我们的操作也都是针对该组件。
(1) 建立excel.application对象
set objexcel=createobject("excel.application")
(2) 打开excel模板
objexcel.workbooks.open(server.mappath("\test")&"\book1.xlt") ’打开excel模板
objexcel.sheets(1).select ’选中工作页
set sheetactive=objexcel.activeworkbook.activesheet 
(3) excel的常规添加操作
例如sheetactive.range("g4").value=date() ‘这里添加的是时间,当然也可以是你指定的任何数据
(4) excel中添加数据库中的纪录
     这里假设已有一个数据集adorset,存放由sql操作生成的统计数据。
num=7 ‘从excel的第七行开始
do until adorset.eof ‘循环直至数据集中的数据写完
strrange="d"&num&":f"&num ‘设定要填写内容的单元区域
sheetactive.range(strrange).font.size=10 ‘设定字体大小
sheetactive.range(strrange).wraptext=false ‘设定文字回卷
sheetactive.range(strrange).shrinktofit=true ‘设定是否自动适应表格单元大小
sheetactive.range(strrange).value=array(adorset("bookid"),adorset("bookname"),adorset("author")) ‘把数据集中的数据填写到相应的单元中
num=num+1
adorset.movenext
loop
(5) excel临时报表文件的保存及处理
        实际运行中应该注意每次一个用户进行报表打印时都采用一个临时的excel文件,而不是硬性规定文件名,因为如果用固定的文件名的话,只有第一次生成是成功的,后面的操作都会因为已存在同名文件而导致失败。所以我们需要每次都产生一个临时的而且不重复的文件名,这里可以采用自定义的gettemporaryfile()函数由来生成,然后存放在变量filename中,用变量filepos表示这些临时文件的路径。
此外如果这些临时文件不处理的话久而久之会成为文件垃圾,因此在每个用户提交excel报表打印请求时要先删除临时目录下所有原先产生的临时打印文件。
临时文件的处理主要代码如下:
function gettemporaryfile(myfilesystem) 
dim tempfile,dotpos
tempfile=myfilesystem.gettempname
dotpos=instr(1,tempfile,".")
gettemporaryfile=mid(tempfile,1,dotpos)&"xls"
end function 
set myfs=createobject("scripting.filesystemobject")
filepos=server.mappath("\test") & "\tmp\" ’要存放打印临时文件的临时目录
filename=gettemporaryfile(myfs) ’取得一个临时文件名
myfs.deletefile filepos&"*.xls" ’删除该目录下所有原先产生的临时打印文件
set myfs=nothing
excel临时文件的保存代码为:
objexcel.activeworkbook.saveas filepos&filename 
(6) 退出excel应用
objexcel.quit
set objexcel=nothing
(7) excel报表的打印
        前面的步骤已经生成了excel报表,下一步进行打印,采用的策略可以有两种:
方案一:提供上面生成的excel报表临时文件链接给用户,用户可以直接点击在浏览器中打开excel报表并通过浏览器的打印功能进行打印,也可以点击右键然后另存到本地后再作打印等相关处理。
方案二:生成excel报表后直接在客户端加载到浏览器
陕西弈聪软件信息技术股份有限公司
电话:13679229477    02989322522
陕西省西安航天基地神州四路科为城墅20栋4301