最近處理的一個案例:

ASP+VB COM的程式,會由資料庫提取Excel、Word、PowerPoint檔案,加上處理後放在暫存區供使用者連結下載。在某一部Windows 2000主機上,發生下載Word、Excel需一分鐘才能完成,PowerPoint卻只要幾秒鐘的狀況,而在其他主機上,幾秒鐘才是合理的速度。

依我的經驗,使用ASP呼叫Office Application是件危險的事,因為Office是為了前景作業而設計,雖然可以在ASP中以CreateObject("Excel.Application")的ActiveX Control模式叫用,但在背景環境下卻容易發生不可預期的結果,我就幹過在記憶體中留下上百個Excel.exe Process的輝煌記錄(汗)。(遇到這類狀況,我喜歡借重Excel可包容CSV、HTML的特性,直接Response.Write內容,再修改Response.ContentType為application/vnd.ms-excel,命令IE呼叫Excel解析呈現內容,例如這個範例)

面對這個問題,有點懷疑會不會是掃毒軟體搞的鬼。要驗證很簡單,拿出茶包射手吃飯的傢伙---萬用瑞士刀: Process Monitor,在LCD的鏡面反光前擺幾個Pose,覺得自己愈來愈像馬蓋先,帥呀~~~ 自High夠了,開啟ProcMon,設定Path Filter鎖定寫入Excel檔的目錄,接著啟動IE進行下載,果然要等上一分鐘才看得到Excel內容。

由ProcMon所觀察的檔案存取記錄發現幾點:

1.DLLHOST寫入Blah.xls,這是寫入Excel檔的程序
2.EXCEL.EXE讀取及寫入Blah.xls,這應是呼叫Excel.Application處理檔案的結果。
3.未發現掃毒軟體讀取Blah.xls的證據。
4有個MSIEXEC.EXE在EXCEL.EXE啟動後跳出來執行。

MSIEXEC.EXE是微軟的安裝程式,怎麼會沒事跑出來逛大街? 我想起一件事,從Office 2000/XP起,每個使用者第一次使用Word/Excel時,需要歷經一段初始化的過桯,有Progress Bar顯示進度,甚至會要求讀取Office的安裝光碟;但每個人只需初始化一次,以後就可直接開啟Word/Excel。而MSIEXEC.EXE,極有可能就是初始化動作背後的程序之一。由於初始化發生在背景,可能缺少了必要的互動,因此始終不能順利完成,導致了每一次叫用Excel.Application都要經歷一次初始化失敗的過程,這似乎就解釋了開Word/Excel特別耗時的原因。

解決方法很簡單,搞清楚呼叫Excel.Application的COM+ Application執行身份,使用該帳號登入Windows本機,分別啟動一次Word及Excel,果然彈出了要初始化的訊息。完成後,ASP處理Word/Excel的過程就快得跟飛的一樣了。

Case Closed!


Comments

# by Kichi

感謝大大幫忙破案!

# by steve

我處理過這個問題 但是.....沒有留下KB 在這裡放馬後炮... 對不起..... 要提防另一個問題 有些Excel內含有巨集,或者連結 手動開啟的時候會有一些問你是不是要更新或者告訴你巨集停用的對話視窗 這也會對用程式開啟Excel造成影響 在Open的時候有一堆參數可以帶,參考一下 http://msdn2.microsoft.com/en-us/library/Bb179167.aspx

Post a comment