網頁

2011年2月6日 星期日

Excel 操作

Last Update: 2011/03/13 02:50+08


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 : 無法存取檔案

沒有留言:

張貼留言