2007年8月22日 星期三

ASP.NET使用Office Web Componet處理EXCEL file

開發環境

專案參考COM:Microsoft.Office.Interop.Owc11

若已有EXCEL範本檔則先轉成XML格式後載入並加入其他資料
程式範例如下(VB.NET)
Dim xlsheets As New Owc11.SpreadsheetClass()
xlsheets.XMLURL = Server.MapPath(".\ExcelFiles") & "\" & "交通住宿名單.xml"
之後便可對xlsheets物件進行操作
例如要處理sheet1則使用下列語法
Dim xlsheet As xlsheets.Worksheets.Item("sheet1")

如果要將最後的結果直接傳送到瀏覽器上讓使用者開啟或存檔, 則可以使用下面的做法
Response.Clear()
Response.Buffer = True
Response.HeaderEncoding = System.Text.Encoding.GetEncoding("big5")
Response.AppendHeader("Content-Disposition", "attachment;filename=" + "交通住宿名單.xml")
Response.ContentType = "application/vnd.ms-excel"
Response.Write(xlsheets.XMLData)
Response.End()

伺服器端

安裝Office Web Componet

優缺點

相對於前面某篇文章提到使用Microsoft Excel 11.0 object library的方式來處理的好處是不會造成excel處理程序殘留
且伺服器端不需要太複雜的環境設定
並且我實際使用Microsoft Excel 11.0 object library來開發時會出現不穩定的現象
有時候報表很順利的產出, 有時候卻因為時間太久造成無法顯示網頁的狀況
且微軟亦不建議使用office object來開發web程式
因為會有很多無法預期的現象, 例如處理程序無法釋放就是其中之一

缺點則是不支援部分格式化功能, 如自動換行、自動調整列高...
不過我發現有一個方法可以解決無法自動換行的問題
把xlsheets.XMLData中包含ss:alignment的字串取代成ss:alignment wraptext="1"
不過無法自動調整列高的問題無法比照辦理,殘念...

寫入cell需注意若欄位為字串型態但內容皆為數字則應於左邊加上"\t"
以確保不會被自動識別為數值型態而被自動格式化(例如去除左邊的0)
若為DateTime型態則需先轉為字串型態=>((DateTime)value).ToString("yyyy/MM/dd")

沒有留言:

自訂權限驗證機制

// 使用 filter [Route("api/[controller]")] [ApiController] [Authorize] [TypeFilter(typeof(CustomAsyncAuthorizationFilter))] public c...