把EXCEL当成数据库来读要有很严格的格式限制,还会出现很多问题... '=================== 'Ⅰ)将Excel97或Excel2000生成的XLS文件(book)看成一个数据库,其中的每一个工作表(sheet)看成数据库表 'Ⅱ)ADO假设Excel中的第一行为字段名.所以你定义的范围中必须要包括第一行的内容 'Ⅲ)Excel中的行标题(即字段名)不能够包含数字. Excel的驱动在遇到这种问题时就会出错的。例如你的行标题名为"F1" 'Ⅳ)如果Excel表中某一列同时包含了文本和数字的话,那么Excel的ODBC驱动将不能够正常处理这一行的数据类型,你必须要保证该列的数据类型一致(加入预设符号强制转成文本,后台再作处理) 'Ⅴ)日期型时,整列不能有空格,否则读不出 '============================攻略:=============== 1、通过filefield获得文件 2、验证.xls文件 3、建立连接 '建立excel连接 set excelconn=server.createobject("adodb.connection") strAddr = Server.MapPath(uploadpath&filename) '输出源文件名 Response.Write "源文件:"&strAddr&"" excelconn.open "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & strAddr '建立excel记录集 set excelrs=server.createobject("adodb.recordset") sql="select * from [Sheet1$]" excelrs.open sql,excelconn,1,1 ............ excelrs.close() set excelrs=nothing excelconn.Close() set excelconn=nothing ================================ <%Option Explicit%> <html> <head> <title>操纵Excel</title> </head> <body> <h2 align="center">显示Excel文件示例</h2> <table border="1" width="90%" align="center"> <tr align="center" bgcolor="#E6E6E6"> <td>学号</td><td>姓名</td><td>数学</td><td>语文</td><td>英语</td><td>总分</td> </tr> <% '建立Connection对象 Dim db,rs,strSql Set db = Server.CreateObject("ADODB.Connection") db.Open "Driver={Microsoft Excel Driver (*.xls)};Dbq=" & Server.MapPath("Mark.xls") '打开记录集,表名一定要以"[表名$]"的格式 strSql="Select * From [Sheet1$]" Set rs=db.Execute(strSql) '循环读取所有行 Do While Not rs.EOF Response.Write "<tr align='center'>" Response.Write "<td>" & rs("学号") & "</td>" Response.Write "<td>" & rs("姓名") & "</td>" Response.Write "<td>" & rs("数学") & "</td>" Response.Write "<td>" & rs("语文") & "</td>" Response.Write "<td>" & rs("英语") & "</td>" Response.Write "<td>" & rs("总分") & "</td>" Response.Write "</tr>" rs.MoveNext Loop '关闭对象 rs.Close Set rs=nothing db.Close Set db=Nothing %> </table> </body> </html>
<% set rs=server.createobject("adodb.recordset") sql="select * from provinceinfo where 1=1" rs.open sql,objconn,1,1 Set ExcelApp =CreateObject("Excel.Application") ExcelApp.Application.Visible = True Set ExcelBook = ExcelApp.Workbooks.Add ExcelBook.WorkSheets(1).cells(1,1).value ="用户表" ExcelBook.WorkSheets(1).cells(2,1).value = "用户编号" ExcelBook.WorkSheets(1).cells(2,2).value = "登陆名" ExcelBook.WorkSheets(1).cells(2,3).value = "真实姓名" ExcelBook.WorkSheets(1).cells(2,4).value = "密码" cnt =3 do while not rs.eof ExcelBook.WorkSheets(1).cells(cnt,1).value = rs("provinceid") ExcelBook.WorkSheets(1).cells(cnt,2).value = rs("province") ExcelBook.WorkSheets(1).cells(cnt,3).value = rs("flag") ExcelBook.WorkSheets(1).cells(cnt,4).value = rs("id") rs.movenext cnt = cint(cnt) + 1 loop Excelbook.SaveAs "d:\yourfile.xls" '这个是数据导出完毕以后在D盘存成文件 ExcelApp.Application.Quit '导出以后退出Excel Set ExcelApp = Nothing '注销Excel对象 %>
<% Set xlApplication = Server.CreateObject("Excel.Application") '调用excel对象 xlApplication.Visible = False '无需打开excel xlApplication.SheetsInNewWorkbook=1 '指定excel中表的数量 xlApplication.Workbooks.Add '添加工作簿 Set xlWorksheet = xlApplication.Worksheets(1) '生成第1个工作表的子对象 xlWorksheet.name="统计" '指定工作表名称 '指定列的宽度以及对齐方式 xlApplication.ActiveSheet.Columns(1).ColumnWidth=5 xlApplication.ActiveSheet.Columns(1).HorizontalAlignment=3 xlApplication.ActiveSheet.Columns(2).ColumnWidth=40 xlApplication.ActiveSheet.Columns(2).HorizontalAlignment=1 xlApplication.ActiveSheet.Columns(3).ColumnWidth=5 xlApplication.ActiveSheet.Columns(3).HorizontalAlignment=3 xlApplication.ActiveSheet.Columns(4).ColumnWidth=15 xlApplication.ActiveSheet.Columns(4).HorizontalAlignment=1 xlApplication.ActiveSheet.Columns(5).ColumnWidth=12 xlApplication.ActiveSheet.Columns(5).HorizontalAlignment=1 xlApplication.ActiveSheet.Columns(6).ColumnWidth=12 xlApplication.ActiveSheet.Columns(6).HorizontalAlignment=3 'xlApplication.ActiveSheet.Rows(i).RowHeight = 30'行的高度 '指定列的高度以及特定列 xlWorksheet.Range(xlWorksheet.Cells(1,1), xlWorksheet.Cells(1,6)).MergeCells =True '合并列 xlWorksheet.Range("A1").value="2005年统计" xlWorksheet.Range("A1").font.Size=14'字体大小 xlWorksheet.Range("A1").font.bold=true'粗体 xlWorksheet.Range("A1").HorizontalAlignment=3'水平对齐 xlWorksheet.Range("A1").VerticalAlignment=3'垂直对齐
xlWorksheet.Cells(2,1).Value = "序号" xlWorksheet.Cells(2,2).Value = "标题" xlWorksheet.Cells(2,3).Value = "图" xlWorksheet.Cells(2,4).Value = "部门" xlWorksheet.Cells(2,5).Value = "作者" xlWorksheet.Cells(2,6).Value = "时间"
xlWorksheet.Range("A2:F2").Borders.LineStyle=1
'--------------------------------------------------自己可做循环i=i+1(数据库数据) 'xlWorksheet.Cells(2+i,1).Value = i 'xlWorksheet.Cells(2+i,2).Value = topic 'xlWorksheet.Cells(2+i,3).Value = img_str 'xlWorksheet.Cells(2+i,4).Value = nfrom 'xlWorksheet.Cells(2+i,5).Value = writer 'xlWorksheet.Cells(2+i,6).Value = ntime '-------------------------------------------------- Set fs = CreateObject("Scripting.FileSystemObject") tfile=Server.MapPath("test.xls") if fs.FileExists(tfile) then Set f = fs.GetFile(tfile) f.delete true Set f = nothing end if Set fs = nothing xlWorksheet.SaveAs tfile '保存文件 xlApplication.Quit '释放对象 Set xlWorksheet = Nothing Set xlApplication = Nothing %> <p align="center"><a href="downfile.asp?fileSpec=<%=tfile%>">下载</a></p>
downfile.asp <% Function downLoadFile(FileSpec) on error resume next Const ForReading=1 Const TristateTrue=-1 Const FILE_TRANSFER_SIZE=1024 '16384 Dim objFileSystem, objFile, objStream Dim char Dim sent Set objFileSystem = CreateObject("Scripting.FileSystemObject") If objFileSystem.FileExists(fileSpec)=false Then response.write("<Script>alert(""请求文件不存在!"");history.back();</script>") Exit Function End If FileName = objFileSystem.GetFileName(FileSpec) send=0 TransferFile = True Set objFileSystem = Server.CreateObject("Scripting.FileSystemObject") Set objFile = objFileSystem.GetFile(FileSpec) Set objStream = objFile.OpenAsTextStream(ForReading, TristateTrue) Response.AddHeader "content-type", "application/octet-stream" Response.AddHeader "Content-Disposition","attachment;filename=" & filename
Response.AddHeader "content-length", objFile.Size Do While Not objStream.AtEndOfStream char = objStream.Read(1) Response.BinaryWrite(char) sent = sent + 1 If (sent MOD FILE_TRANSFER_SIZE) = 0 Then Response.Flush If Not Response.IsClientConnected Then TransferFile = False Exit Do End If End If Loop Response.Flush If Not Response.IsClientConnected Then TransferFile = False objStream.Close Set objStream = Nothing Set objFileSystem = Nothing End Function fileSpec =Lcase(Cstr(Trim(Request("fileSpec")))) downLoadFile(fileSpec) %> 环境配置 服务器端的环境配置从参考资料上看,微软系列的配置应该都行,即: 1.Win9x+PWS+Office 2.Win2000 Professional+PWS+Office 3.Win2000 Server+IIS+Office 目前笔者测试成功的环境是后二者。Office的版本没有特殊要求,考虑到客户机配置的不确定性和下兼容特性,建议服务器端Office版本不要太高,以防止客户机下载后无法正确显示。 服务器端环境配置还有两个偶然的发现是: 1. 笔者开发机器上原来装有金山的WPS2002,结果Excel对象创建始终出现问题,卸载WPS2002后,错误消失。 2. 笔者开发ASP代码喜欢用FrontPage,结果发现如果FrontPage打开(服务器端),对象创建出现不稳定现象,时而成功时而不成功。扩展考察后发现,Office系列的软件如果在服务器端运行,则Excel对象的创建很难成功。 服务器端还必须要设置的一点是COM组件的操作权限。在命令行键入“DCOMCNFG”,则进入COM组件配置界面,选择Microsoft Excel后点击属性按钮,将三个单选项一律选择自定义,编辑中将Everyone加入所有权限。保存完毕后重新启动服务器。 客户端的环境配置没发现什么特别讲究的地方,只要装有Office和IE即可,版本通用的好象都可以。
二、 ASP对Excel的基本操作 1、 建立Excel对象 set objExcelApp = CreateObject("Excel.Application") objExcelApp.DisplayAlerts = false 不显示警告 objExcelApp.Application.Visible = false 不显示界面 2、 新建Excel文件 objExcelApp.WorkBooks.add set objExcelBook = objExcelApp.ActiveWorkBook set objExcelSheets = objExcelBook.Worksheets set objExcelSheet = objExcelBook.Sheets(1) 3、 读取已有Excel文件 strAddr = Server.MapPath(".") objExcelApp.WorkBooks.Open(strAddr & "TempletTable.xls") set objExcelBook = objExcelApp.ActiveWorkBook set objExcelSheets = objExcelBook.Worksheets set objExcelSheet = objExcelBook.Sheets(1) 4、 另存Excel文件 objExcelBook.SaveAs strAddr & "TempTable.xls" 5、 保存Excel文件 objExcelBook.Save (笔者测试时保存成功,页面报错。) 6、 退出Excel操作 objExcelApp.Quit 一定要退出 set objExcelApp = Nothing
三、 ASP操作Excel生成数据表 1、 在一个范围内插入数据 objExcelSheet.Range("B3:k3").Value = Array("67", "87", "5", "9", "7", "45", "45", "54", "54", "10") 2、 在一个单元格内插入数据 objExcelSheet.Cells(3,1).Value="Internet Explorer" 3、 选中一个范围 4、 单元格左边画粗线条 5、 单元格右边画粗线条 6、 单元格上边画粗线条 7、 单元格下边画粗线条 8、 单元格设定背景色 9、 合并单元格 10、 插入行 11、 插入列
四、 ASP操作Excel生成Chart图 1、 创建Chart图 objExcelApp.Charts.Add 2、 设定Chart图种类 objExcelApp.ActiveChart.ChartType = 97 注:二维折线图,4;二维饼图,5;二维柱形图,51 3、 设定Chart图标题 objExcelApp.ActiveChart.HasTitle = True objExcelApp.ActiveChart.ChartTitle.Text = "A test Chart" 4、 通过表格数据设定图形 objExcelApp.ActiveChart.SetSourceData objExcelSheet.Range("A1:k5"),1 5、 直接设定图形数据(推荐) objExcelApp.ActiveChart.SeriesCollection.NewSeries objExcelApp.ActiveChart.SeriesCollection(1).Name = "=""333""" objExcelApp.ActiveChart.SeriesCollection(1).Values = "={1,4,5,6,2}" 6、 绑定Chart图 objExcelApp.ActiveChart.Location 1 7、 显示数据表 objExcelApp.ActiveChart.HasDataTable = True 8、 显示图例 objExcelApp.ActiveChart.DataTable.ShowLegendKey = True
五、 服务器端Excel文件浏览、下载、删除方案 浏览的解决方法很多,“Location.href=”,“Navigate”,“Response.Redirect”都可以实现,建议用客户端的方法,原因是给服务器更多的时间生成Excel文件。 下载的实现要麻烦一些。用网上现成的服务器端下载组件或自己定制开发一个组件是比较好的方案。另外一种方法是在客户端操作Excel组件,由客户端操作服务器端Excel文件另存至客户端。这种方法要求客户端开放不安全ActiveX控件的操作权限,考虑到通知每个客户将服务器设置为可信站点的麻烦程度建议还是用第一个方法比较省事。 删除方案由三部分组成: A: 同一用户生成的Excel文件用同一个文件名,文件名可用用户ID号或SessionID号等可确信不重复字符串组成。这样新文件生成时自动覆盖上一文件。 B: 在Global.asa文件中设置Session_onEnd事件激发时,删除这个用户的Excel暂存文件。 C: 在Global.asa文件中设置Application_onStart事件激发时,删除暂存目录下的所有文件。 注:建议目录结构 Src 代码目录 Templet 模板目录 Temp 暂存目录
六、 附录 出错时Excel出现的死进程出现是一件很头疼的事情。在每个文件前加上“On Error Resume Next”将有助于改善这种情况,因为它会不管文件是否产生错误都坚持执行到“Application.Quit”,保证每次程序执行完不留下死进程 |