Intro
關於 Excel API 操作
◆ 如果單只是要匯出Excel表, 只要把副檔名設成xls
html(UI)就放個Table就好
反正Excel可以幫你轉換
Response.AddHeader("content-disposition", "attachment;filename=MyExcel.xls");
◆ 如果是要匯入資料的話, 用OleDb就可以了
◆ 如果有些格式, 公式 等等要求的話
還是得乖乖的用 Excel 的 API
下面就來講這塊
Context
基本上步驟就是很常見的
1. 加入參考
2. 寫Code
3. 設定權限
◆ 加入參考
把 Microsoft.Office.Interop.Excel 加到專案來
(有安裝Office的話, 應該都找的到)
再引用, 為方便就把 namespace 設成 Excel
using Excel = Microsoft.Office.Interop.Excel; using System.Runtime.InteropServices;
第二行的引用, 是為了 Marshal.ReleaseComObject(object) 這個方法
這裡我們需要很注意釋放記憶體
每個 Excel 物件 都要釋放
在執行時你可以把工作管理員打開來看
會出現EXCEL.exe的處理序
執行完如果還在的話, 就是有物件沒被釋放掉
◆ 寫Code
從一般辦公使用Excel來看
我們通常會
1. 開啟 Excel 應用程式
2. 新增(開啟)活頁簿
3. 選擇要使用的Sheet
用程式寫也差不多, 感覺像在下指令XD
protected void Page_Load(object sender, EventArgs e) { ExcelHandler(Server.MapPath("~/myexcel.xls")); } void ExcelHandler(string path) { Excel.Application eApp = null; Excel.Workbook eBook = null; Excel.Worksheet eSheet = null; Excel.Range eRange = null; Excel.Style eStyle = null; try { eApp = new Excel.Application(); eBook = eApp.Workbooks.Add();//Or .Open(file path) eSheet = eBook.Sheets[1] as Excel.Worksheet;
前面幾行沒啥好講的
最後那3行就是前面講的
新開一個Application
新增活頁簿
選擇Sheet
eStyle = eBook.Styles.Add("style1"); eStyle.Font.Color = System.Drawing.Color.Blue; eStyle.Font.Size = 24;
這邊是設定格式
eRange = eSheet.Rows[2] as Excel.Range; eRange.Cells[1, 3] = "ABC"; eRange.Style = eStyle;
填資料和指定格式
Range 可以當做在使用Excel時, 選擇一個範圍
eBook.SaveAs(path, Excel.XlFileFormat.xlExcel8);
如果是"開啟"活頁簿, 可以用 .Save() 儲存就好
}finally { /*if (eSheet != null) { Marshal.ReleaseComObject(eSheet); }*/ /*if (eBook != null) { eBook.Close(); Marshal.ReleaseComObject(eBook); }*/ if (eStyle != null) { Marshal.ReleaseComObject(eStyle); } if (eApp != null) { eApp.DisplayAlerts = false; //eApp.Workbooks.Close(); //Marshal.ReleaseComObject(eApp.Workbooks); eApp.Quit(); Marshal.ReleaseComObject(eApp); }
接著是要釋放所有記憶體
這邊只有開一個Book, 一個Sheet
沒啥特殊需求, 只要 eApp 離開後釋放就沒問題了(eStyle 也要)
總之, 最好是全部都做釋放的動作
各位看倌就開啟工作管理員來看就對了XD
eStyle = null; eRange = null; eSheet = null; eBook = null; eApp = null; GC.Collect(); } }
最後就是呼叫 GC.Collect()
Manage Code 就是有個傢伙在管記憶體
它覺得沒必要就不回收 XD
所以就下個御旨吧!
不呼叫也行, EXCEL.exe 處理序就會呆著
到那傢伙想清理時
至於把所有變數都設成null
也是為了回收機制
有人指向那個物件, 就不會被回收
◆ 設定權限
到目前為止
按 F5 執行, 不會有啥問題
但掛到IIS上就可以看到下述的訊息
「擷取元件 (CLSID 為 {00024500-0000-0000-C000-000000000046}) 的 COM Class Factory 失敗,因為發生下列錯誤: 80070005 存取被拒。」
請使用 Window+R
=> 執行 dcomcnfg
=> 左邊視窗的主控台根目錄
=> 元件服務
=> 電腦
=> 我的電腦
=> DCOM 設定
=> 在右邊視窗找到 Microsoft Excel Application
=> 右鍵 內容
=> 安全性 頁籤
=> 「啟動和啟用權限」設為自訂, 編輯加入 IIS/IUSERS, 給予本機啟動/啟用權限
=> 「存取權限」設為自訂, 編輯加入 IIS/IUSERS, 給予本機存取權限
沒記錯的話, 到此應該可以在XP / Server2003 上跑吧?(沒測)
Win7 的話再繼續下去吧
=> 在 識別身份 頁籤 選擇互動式使用者
The End
Related
在MS Server 2008 : 無法存取檔案
沒有留言:
張貼留言