2009年4月15日

ASP產生Excel方法

報表是各種管理系統中一個重要的,而輸出的格式中Excel就佔有一席之地。
這裡舉一個例子。使用ASP輸出Excel,並能夠直接列印。
1.Excel報表模板的制作
首先根據給定的報表格式,製作一個Excel template,當然需要從DB中動態統計生成的資料留著空白。這個報表先在Excel中畫好,以此例子儲存路徑為\test\testTemplate1.xlt。

2.Excel報表的生成與打印
這裡採用了Excel的Application module,也就是必須安裝Excel到系統中。


(1) 建立Excel.Application
set objExcel=CreateObject("Excel.Application")

(2) 打開Excel template
objExcel.Workbooks.Open(server.mappath("\test")&"\testTemplate1.xlt") '打開Excel template
objExcel.Sheets(1).select '選定工作頁
set sheetActive=objExcel.ActiveWorkbook.ActiveSheet

(3) 加入資料到指定儲存格
例如sheetActive.range("g4").value=date() ‘這裡塞的是時間,當然也可以是任何資料

(4) 加入DB中的資料
這裡假設已有一個dataset名稱為adoRset。
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("aa"),adoRset("bb"),adoRset("cc")) ‘把Dataset中的Data填寫到相應的儲存格中
num=num+1
adoRset.MoveNext
loop

(5) Excel臨時報表文件的保存及處理
實際執行中應該注意每次一個user進行報表列印時都建立一個臨時的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
objExcel.ActiveWorkbook.saveas filePos&filename '儲存臨時檔案

'關閉Excel.Application
objExcel.quit
set objExcel=Nothing



3.系統設定與注意事項
雖然以上程式很簡單,但實際應用不當經常會出現錯誤,所以下面要講到的系統配置和注意事項非常關鍵。

(1) 千萬要保證以上程式輸入的正確性,否則一旦發生錯誤,Excel佔據記憶體,導致下一次呼叫時速度狂慢,並產生記憶體區段不可讀寫的Windows錯誤。

(2) 一定要設置好負責列印功能的asp文件的權限。方法是:在IIS管理中,選擇該asp文件,右鍵然後選“屬性”->“文件安全性”-> "匿名訪問和驗證控制“,在這裡IIS預設是匿名登入,應該選擇驗證登入(這裡基本驗證和Windows驗證兩種方式均可,但前者不夠安全),這一點無比重要,否則應用當中會出錯的。

(3) 有的時候報表分為多頁,而且我們希望每一頁有相同的表頭,要求表頭每頁都自動列印,可以在Excel template中進行設置。方法如下:選擇工具列"文件"->"頁面設置"->"工作表",然後在"頂端標題行"輸入你表頭的行數(如:表頭為1-3行即填入:$1:$3)。