一、 環境配置 服務器端的環境配置從參考數據上看,微軟系列的配置應該都行,即: 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 & "\Templet\Table.xls") set objExcelBook = objExcelApp.ActiveWorkBook set objExcelSheets = objExcelBook.Worksheets set objExcelSheet = objExcelBook.Sheets(1) 4、 另存Excel文件 objExcelBook.SaveAs strAddr & "\Temp\Table.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”,保證每次程序執行完不留下死進程。 補充兩點: 1、其它Excel具體操作可以通過錄制宏來解決。 2、服務器端打開SQL企業管理器也會產生問題。
七、例子 <% On Error Resume Next strAddr = Server.MapPath(".") set objExcelApp = CreateObject("Excel.Application") objExcelApp.DisplayAlerts = false objExcelApp.Application.Visible = false objExcelApp.WorkBooks.Open(strAddr & "\Templet\Null.xls") set objExcelBook = objExcelApp.ActiveWorkBook set objExcelSheets = objExcelBook.Worksheets set objExcelSheet = objExcelBook.Sheets(1) objExcelSheet.Range("B2:k2").Value = Array("Week1", "Week2", "Week3", "Week4", "Week5", "Week6", "Week7", "Week8", "Week9", "Week10") objExcelSheet.Range("B3:k3").Value = Array("67", "87", "5", "9", "7", "45", "45", "54", "54", "10") objExcelSheet.Range("B4:k4").Value = Array("10", "10", "8", "27", "33", "37", "50", "54", "10", "10") objExcelSheet.Range("B5:k5").Value = Array("23", "3", "86", "64", "60", "18", "5", "1", "36", "80") objExcelSheet.Cells(3,1).Value="Internet Explorer" objExcelSheet.Cells(4,1).Value="Netscape" objExcelSheet.Cells(5,1).Value="Other" objExcelSheet.Range("b2:k5").Select objExcelApp.Charts.Add objExcelApp.ActiveChart.ChartType = 97 objExcelApp.ActiveChart.BarShape =3 objExcelApp.ActiveChart.HasTitle = True objExcelApp.ActiveChart.ChartTitle.Text = "Visitors log for each week shown in browsers percentage" objExcelApp.ActiveChart.SetSourceData objExcelSheet.Range("A1:k5"),1 objExcelApp.ActiveChart.Location 1 'objExcelApp.ActiveChart.HasDataTable = True 'objExcelApp.ActiveChart.DataTable.ShowLegendKey = True objExcelBook.SaveAs strAddr & "\Temp\Excel.xls" objExcelApp.Quit set objExcelApp = Nothing %> <!DOCTYPE Html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> New Document </TITLE> <META NAME="Generator" CONTENT="Microsoft FrontPage 5.0"> <META NAME="Author" CONTENT=""> <META NAME="KeyWords" CONTENT=""> <META NAME="Description" CONTENT=""> </HEAD> <BODY> </BODY> </HTML> 我在這兒再提供。將網頁中表格,保存的方法。 例如:TABLE 的 ID=MYTABLE <!--生成EXCEL檔--> sub BTnExport_onclick() dim objExcel on error resume next Set objExcel = CreateObject("excel.application") With objExcel .visible =true .workbooks.add .sheets("sheet1").select End with m_row="0" for a=0 to document.all.mytable.rows.length-1 m_row = cstr(int (m_row)+1) for b=0 to document.all.mytable.rows(a).cells.length-1 m_col = chr(asc("A")+b) objexcel.range(m_col&m_row).select M_value = document.all.mytable.rows(a).cells(b).innerText objexcel.activecell.value=cstr(m_value) next next objexcel.visible=true objexcel.range("A1").select End sub