用ASP生成Excel数据

ASP最广泛的用途之一就是生成数据库驱动的Web 报告。通常,这只是在浏览器内的一个HTML 表格中观看报告,但对于某些用户来说是不够的。这些用户希望下载报告的数据,用他们自己的应用程序修改它们,这些应用程序包括电子表格软件(Microsoft Excel) 或本地数据库 (Microsoft Access)。我将用ASP 示范多种将数据输出到Microsoft Excel可读格式的技巧。通过使用一个或多个这些技巧,你就可以在你的web 页面上放置一个“输出到Excel”的选项以满足那些用户。



   测试环境



   我使用以下环境创建并测试本文提供的样本:



   Windows NT 4/SP5 与 IIS 4

   Windows 95

   Internet Explorer 4.x 和 5

   Interdev 6

   Homesite 4.0

   Access 97

   Excel 97



   这可能是将一个html 表格变成 Microsoft Excel 格式的最快方法。ContentType 属性通知浏览器数据要被格式化为何种格式,在这里我们要的格式是Microsoft Excel。当浏览器看到这个属性的值是Excel时,它就提示用户保存或打开这个文件。如果用户选择打开文件,就启动了Excel并在其中观看数据。为使其工作正确,必须在向Response对象写入任何内容之前设置ContentType 。此语法的例子如下:



   Line 1: 〈 %@ LANGUAGE="VBSCRIPT" % 〉

   Line 2: Response.ContentType = "application/msexcel"

   Line 3: % 〉



   点击这里可以得到有关ASP的Response 对象的ContentType属性的更多信息。



   当我试图用Internet Explorer 4.x.测试时发现了一个问题,在Microsoft文章 Q185978曾经提到过。 这篇知识库文章的内容可以概括如下:



   “如果Internet Explorer 与一个动态生成Word、 Excel或其它活动文档的Web服务器资源相连接时,Internet Explorer会为此资源发出两个GET 请求。第二个GET 通常没有session 状态信息、临时 cookies或者已经为客户指定的证明信息。这个错误可能影响到任何寄宿在Internet Explorer 结构窗口内的本地服务器(EXE) 的活动文档应用程序。它在ISAPI、 ASP或 CGI 应用程序中发生最为频繁,它们校验HTTP "Content Type" 头文件以识别所安装的应用程序”。



   因此如果你尝试使用session 变量或 cookies, 并使用IE4,就有可能遭遇到这个错误。经证实,在IE5中这个问题已经得到解决。

   一个用逗号分隔开的值文件是将web页面输出到Excel可读格式的第二种选择。这种格式比ContentType 属性有更大的灵活性。相对于其它方法,CSV还有两个优势:首先,不需要任何客户机或服务器上的 软件去创建它,第二,文件通常要比一个Excel 文件小。



   CSV格式的定义如下:逗号分隔列,回车分隔行。逗号作为分隔符, 也会与包含逗号的 域(如$1,234)引发一个问题; 这会在将要创建的行中导致一个额外的列。这个问题也很容易矫正, 方法是在每个结尾处用逗号将域封闭起来。



   在提供的例子中把 CreateCSVFile()函数过一遍,就能了解CSV文件是如何创建的。



    Line 1:    strFile = GenFileName()

    Line 2:    Set fs = CreateObject("Scripting.FileSystemObject")

    Line 3:    Set a = fs.CreateTextFile(server.MapPath(".") & "" & strFile & Line 4:    ".csv",True)

    Line 5:    If Not oRS.EOF Then

    Line 6:  strtext = chr(34) & "Year" & chr(34) & ","

    Line 7:  strtext = strtext & chr(34) & "Region" & chr(34) & ","

    Line 8:  strtext = strtext & chr(34) & "Sales" & chr(34) & ","

    Line 9:  a.WriteLine(strtext)

    Line 10:  Do Until oRS.EOF

    Line 11: For i = 0 To oRS.fields.Count-1

    Line 12:    strtext = chr(34) & oRS.fields(i) & chr(34) Line 13:  & ","

    Line 14:    a.Write(strtext)

    Line 15: Next

    Line 16: a.Writeline()

    Line 17: oRS.MoveNext

    Line 18:  Loop

    Line 19:    End If

    Line 20:    a.Close

    Line 21:    Set fs=Nothing    

    Line 22:    Response.Write("Click 〈 A HREF=" & strFile & ".csv 〉Here〈 /A 〉

    Line 23:    to get CSV file")    



   第一行调用GenFileName() 函数创建一个唯一的文件名,有关GenFileName() 函数将在稍后讨论。



   第2行到第4行,用FileSystemObject 对象和CreateTextFile函数将要写入的文本文件。在这个例子中, 所写入的文件与源文件在同一个路径下,在实际工作中,你也许想要创建一个单独的路径存储这些文件。



   第5-9行产生第一行的标题。因为报告通常都是相同的,我就把列名的代码固定下来,虽然也有可能读 数据库的列名并使用它们。注意我在各个域中是如何包含逗号的。使用WriteLine 函数将它们与一个回 车一起发送到文件中。



   第10行到18行在记录集中循环,用引号给每个域做出标志,后面跟着一个逗号。然后Write函数将每个 域发送到文件。WriteLine 用回车结束每一行。



   最后几行关闭文件、释放对象、在页面上放置一个链接以便能够找回它。



   当你点击生成的链接时,就会被提示保存或打开。如果选择打开,文件就在Excel 中打开(假设计算机 上已经安装)。如果选择了保存,就将这个文本文件保存到存储设备上并将它输入各个应用程序中。

   我所讨论的最后一种方法是用Microsoft Excel 对象创建一个实际的Excel(.xls ) 文件。要使用这些对象要求在Web 服务器上安装Excel。使用这些控制可以对格式化有更多的控制(如字体、颜色等), 并允许你进行一切在真正的Excel 应用程序中可以进行的操作。一定要监视你的服务器的性能,因为 Excel 可能成为一个相当大的对象并对性能造成冲击,这取决于你如何使用它以及服务器有多忙。



   我发现在Excel 对象上得到更多信息的最快最简便的方法是使用Visual Basic对象浏览器,观看对象 并使用上下文敏感帮助来得到更多细节。使用这个对象浏览器时:启动Visual Basic, 创建一个工程文件, 增加一个对Microsoft Excel对象库的引用。在 View 菜单下,可以选择一个对象浏览器然后指定Excel 库,看到所有可用的对象。按 F1可得到当前标题的上下文敏感帮助。



   在所提供的样本中把CreateXlsFile() 函数过一遍,就可以看到如何创建一个Excel文件。 基本步骤与 创建 CSV文件的基本相同,只是所创建的是一个Excel工作表。



Line 1:    Dim xlWorkSheet

Line 2:    Dim xlApplication

Line 3:    Set xlApplication = Server.CreateObject("Excel.Application")

Line 4:    xApplication.Visible = False

Line 5:    xlApplication.Workbooks.Add

Line 6:    Set xlWorksheet = xlApplication.Worksheets(1)

Line 7:    xlWorksheet.Cells(1,1).Value = "Year"

Line 8:    xlWorksheet.Cells(1,1).Interior.ColorIndex = 5    

Line 9:    xlWorksheet.Cells(1,2).Value = "Region"

Line 10:    xlWorksheet.Cells(1,2).Interior.ColorIndex = 5

Line 11:    xlWorksheet.Cells(1,3).Value = "Sales"

Line 12:    xlWorksheet.Cells(1,3).Interior.ColorIndex = 5

Line 13:    iRow = 2

Line 14:    If Not oRS.EOF Then

Line 15:  Do Until oRS.EOF

Line 16:  For i = 0 To oRS.fields.Count-1

Line 17:    xlWorksheet.Cells(iRow,i + 1).Value = oRS.fields(i)

Line 18:  xlWorkSheet.Cells(iRow,i + 1).Interior.ColorIndex = 4

Line 19:  Next

Line 20:  iRow = iRow + 1

Line 21:  oRS.MoveNext

Line 22:    Loop

Line 23:    End If

Line 24:    strFile = GenFileName()

Line 25:    xlWorksheet.SaveAs Server.MapPath(".") & "" & strFile & ".xls"

Line 26:    xlApplication.Quit    ' Close the Workbook

Line 27:    Set xlWorksheet = Nothing

Line 28:    Set xlApplication = Nothing

Line 29:    Response.Write("Click 〈 A HRef=" & strFile & ".xls 〉Here〈 /A 〉

 to Line 30:    get XLS file")    



   第1行和第2行,确定所使用的 Excel对象的维数。



   第3行,创建Excel对象。同样,为了工作正确,web服务器上也必须有Excel。



   第4行,将Excel的可见性设置为false,这样它就没有界面了。



   第5行和第6行,增加一个容纳工作表的工作簿,然后将当前工作表设置成第一个工作表(这是Excel 在默认状态下创建的)。 还可以用 Worksheet对象的Add 函数增加一个新的工作表, 这就允许你的 Excel 文件中有多个工作表。



   第8-12行,创建工作表的标题。在这个例子中,我们把每个单元的值都设置成适当的标题,而且把内部 颜色设置成兰色。你还可以用Range对象同时修改多个单元。



   第13-23行,提供从记录集装载所有数据的循环。因为第一行中包含标题,我就在电子数据表的 第二行开始数据。里面的 For循环把每一列装载到行中,并把内部颜色设置为绿色。外部循环则为 每一行在记录集中进行循环。



   第24行, 通过调用GenFileName()函数,与CSV用同样的函数来创建唯一的文件名。



   第25行,进行电子表格的实际保存。可以将表格存储为 Excel中指定的多种格式。



   下面的3行进行对象的整理。作为一个好的ASP程序员,就一定要整理所有的对象。



   最后,我把到 Excel文件的链接放在页面上以便下载。

   我创建了一个样本,对以上讨论过的每个技巧进行示范。要安装样本,只需要把所有的文件复制到服务器上,用 main.html 启动应用程序。在服务器上需要有 Excel以使用"Native Excel" 选项。 样本使用一个Access数据库 (无DSN链接)来存储销售数据。



   你可以选择一年或一个地区进行销售报告。最后的选项是你希望如何返回数据。可以看到以下的屏幕映象:



<p align="center">
   下面的表格中是对样本中提供的所有文件的描述。



文件名 描述

DSN-SQL.asp 包含无DSN链接字符串

adovbs.inc 包含ADO常量

TestDB.mdb  包含销售数据的一个Access97数据库。包含的销售表格有3个域:year--Text, region--Text,sales-amt--numeric

main.html 本文件创建画面的框架并装载初始页

welcome.html 本文件只在第一次创建结果通常所在的画面框架时使用

request.html  包含一个表单,用来收集用户的选择来建立报告

runquery.asp 应用程序的内脏。本文件建立SQL声明、确定客户机如何请求将被返回的数据、执行SQL并按照请求返回数据



   大部分代码都相当容易理解。但是我还是要讨论runquery.asp 文件中的一些函数。我已经演示过如何创建CSV和Excel 文件。



   GenHTML()函数建立一个被请求数据的HTML表格。这个函数既用来作为HTML返回也用于ContentType请求。为了 ContentType请求工作,你要注意 Response.ContentType = "application/msexcel" 是将要执行的最初几行之一。



   GenFileName()函数使用系统日期建立文件名的第一部分。这个文件名将是唯一的,这样当你试图存储 文件时就可以避免许多麻烦。扩展名( CSV或XLS )在存储文件时应用,这样就允许同一个函数产生两种类型的文件。



   BuildSQL()函数使用表单变量来建立一个SQL声明,与用户的请求相匹配,并将其返回调用者。



   Recordset在脚本的最顶部被打开,因为它对于所选择的显示类型是独立的。recordset处理从BuildSQL()函数调用生成的SQL声明,使用一个到Access 97的无DSN链接。



   〈 BODY 〉标记中包含的代码仅仅是两个 "if….then" 声明,确定用户所要求的显示方法。 if声明分流到生成正确返回类型的函数,该返回类型是基于用户的"ReturnAS" 选择。接着清除链接和记录集对象。



   注意: 这个样本没有涉及到用户下载web服务器上创建的文件之后,对这些文件的维护问题。我建议 这种维护要基于一段时间,时间到期后就删除这些文件。 我不主张把移走这些文件的负担转嫁到客户身上(通过页面上的链接),因为他们很容易忘记这些事情。



   结论


   本文演示了将数据输出到一个Excel可读格式的三种方法。 我相信根据用户的不同需要,这三种方法都有其可用之地。如果你愿意快速但不漂亮地输出到Excel,就用ContentType好了。如果你想要一个格式有限但能够装载到许多不同应用程序中的文件,那么CSV格式适合你。如果你更喜欢包含完整格式、图标或特殊Excel功能,那么创建一个完全的Excel电子表格是适合的途径。 但愿这些方法能帮助其他程序员满足客户的要求或者至少帮助你选择正确的途径。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值