![]() |
|
asp实现在web中显示电子表格数据
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
广告招租,e-mail:yesize@hotmail.com
关于这个应用 可供下载的例程代码中包括一个ASP文件ReadX1.asp,一个Excel文件TheWorkbook.xls。你也可以另外加入一些电子数据表文件。 执行ReadXl.asp页面,将显示出可用的电子数据表文件列表。选择好一个文件,并提交表单后,你将会看到: 一个下拉菜单,其中是工作表名称 可以选择工作簿文件中的另外一个工作表,或者输入符合Excel格式的单元格范围数值,比如:D20:E21 或者 Sheet3!F12:J22。注意:在ADO和ODBC驱动程序中,要用$符合替换分界符号!。 实现步骤 现在对这个应用程序已经有了初步的认识,下面开始讨论ASP代码,看看如何读取电子数据表的数据,如何找到电子数据簿 基本条件 下面将涉及到ADO对象、方法、属性、收集和常量。在服务器上安装IIS后,ADO就存在了,并且还有相关文档,地址是http://YourServer/IisHelp/ado210.chm (版本2.1),或者http://YourServer/IisHelp/ado/docs/(老版本1.5)。如果需要升级ADO,可以从http://www.microsoft.com/Data/download.htm下载最新版本的MDAC工具包进行安装。 实现“文件列表选择”使用到了内建的VBScript脚本对象,相关文档可以查看http://YourServer/IisHelp/vbscript/htm/vbstoc.htm,如果想查看最新的文档,请访问http://msdn.microsoft.com/scripting 读取电子数据表(Worksheet)数据 通过ADO读取电子数据表与读取数据库表的方法基本是一样的。从下图可以看到,电子数据表的行被称作记录Records,列被称作字段Fields。电子数据表或者单元格的范围可以被看成表Tables,并按照记录集recordsets进行存取。 Spreadsheet Database HTML 执行下面的步骤,从数据库表中读取数据并显示: 连接数据库(同样:打开数据簿文件) 在连接数据库或者打开文件前,需要了解一些信息。其中只要是设置名叫DSN的ODBC驱动,但为每一个数据表都建立这样的ODBC驱动,是非常麻烦的,因为这需要在服务器的控制台上通过“控制面板/ODBC设置”手工完成。 幸好,ASP提供了替代DSN的其他方法,它可以非常容易地在运行时建立连接。比如,字符串“DRIVER={Microsoft Excel Driver?*.xls)};ReadOnly=1;DBQ=C:dirfile.xls",表示了替代DSN打开文件c:dirfile.xls,因此通过这种方法仅仅需要提供给ASP程序一个文件名即可。执行下面的代码,将从表单中读取文件名,然后转换为全路径,接着生成连接字符串,最后建立并打开这个连接。 vXlFile = Request("XlBook") 读取记录集 连接上电子数据簿文件后,读取一定范围的单元格数据就很简单了。尽管不是必须的,但还是建议:用符合“[” 和 “]”包含住单元格的范围定义。只所以这么做,是以防在数据库的操作中产生非法的符合。 vXlRange = Request("XlRange") 执行上面的语句,将返回记录集对象,其中包括范围内单元格的所有可用信息, 记录集的数值和描述数据的元数据。 过程的最后一步是格式化数据并显示,就是建立一个HTML输出,步骤如下: 依次循环记录集(Recordset)中每一个字段(Field),写标题 DataTable = "< table >< tr >" 电子数据表的列的必要信息由记录集对象的Field集合产生,它包括了一系列字段对象,可以使用它们的Name属性建立标题行。 For Each oField in oRs.Fields 最新打开的记录集(recordset)自动将初始位置指向第一行,使用MoveNext方法移动记录指针,顺序存取每一行,直到整个记录集的末尾。当到记录集末尾时,属性Eof的值变成True,循环结束。在循环中,通过字段集合的列举以及对应的Value属性,从而达到单元格数据的存取。 Do While Not oRs.EOF For Each oField in oRs.Fields DataTable = DataTable & "< /tr >" 最后,加上HTML的表格结束标记,输出整个字符串到页面,形成了动态产生的表格。由于记录集对象不再需要,所以要释放它。 DataTable = DataTable & "< /table >" Response.Write DataTable 在总结前,有必要说明一个小的定义在电子数据表是如何解释的。 通常,在ADO中将一定范围内的第一行解释为一套列标题,尽管在ODBC中有明文定义的选项可以禁止这种解释,但我也不愿意在ADO中这么做。如果第一行包含数字信息,那么ADO中将返回通用的字段名,比如:F1,F2,等等...,这样就不能看到数字的值。而且,ADO也会将第一行中的“非字母、非数字”字符替换为符号#。 除了“读取Excel数据形成HTML表格”的技术外,你可能有兴趣想了解怎样用程序实现电子数据表和名字范围的下拉菜单列表。除了单元格的内容,用ADO还能知道更多的信息---在上面,已经讨论了用它得到字段名的列表。 调用OpenSchema方法,可以得到当前打开数据库(同样适用于电子数据簿)的特殊记录集,在这里讨论的例程中,是取回了当前电子数据簿的电子数据表和名字范围。在数据库的操作中,通过传递给ADO一个adSchemaTablesas命令参数,就可以得到所有表的信息。 Set oSchemaRs = oConn.OpenSchema(adSchemaTables) 上述调用将返回一个记录集信息,对于文件TheWorkbook.xls,结果是: TABLE_NAME TABLE_TYPE 和记录集相比较,电子数据工作簿中的电子数据表(worksheets)被当作系统表,名字范围被当作通常表。通常情况下,无名范围(可以使用!)不被记录集报告。 掌握了这些信息,创建字段下拉菜单就成了分离两个表类型和使用合适的标记的工作了。比如,可以执行下面的HTML/ASP代码段来创建工作表列表的下拉菜单: < select name="XlSheet" > 为简单起见,例程假设电子数据表文件和ASP文件位于同一个目录下。通过vServerFolder= Server.MapPath(".") 获取当前目录名称,并将之转换到folder对象,从而找出目录中的文件。 FileSystem对象的.GetFolder方法使用如下: Set oFs = Server.CreateObject("Scripting.FileSystemObject") < select name="XlBook" > 同样的,实际的ReadX1.asp代码要复杂些,因为有一些JavaScript脚本要取回上一次的选择。 总结 上面介绍了如何通过ADO读取Excel工作簿的方法,以及内建对象FileSystem的使用技巧。除了广泛地应用于数据库领域,ADO能处理许多不同格式的数据,其方式就象处理数据库一样。这里只是接触到ADO的一点基本功能,还有更多更强大的方面有待开发。
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||