2009年5月28日 星期四

C#-.NET調用Excel API

寫程式需要輸出資料的時候,希望能夠整理的很漂亮,常常會希望能夠輸出成xls或xlsx的Excel檔案,
雖然也可以使用csv檔案格式,但是觀看的時候,沒辦法直接用Excel開啟,用記事本打開又不漂亮。

過去微軟沒有直接提供調用Excel函式的功能,不過在.NET時代,微軟總算整合進去了。

下面將要介紹簡單的Excel操作方法,包括開檔、存檔,以及填入表格的功能。
範例是利用WinForm去選擇欄位,並填入資料,最後會再存成一個xlsx檔案(Excel 2007格式)。

  1. 要使用Excel,需要先引入Excel的DLL檔案(Microsoft.Office.Interop.Excel)
    VS.NET2008有兩個DLL檔,11.0版為Excel 2003;12.0版為Excel 2007的。
    匯入Excel的DLL檔案
  2. Excel的架構是活頁簿(Excel的檔案)、工作表(一個檔案可以有多個工作表Sheet)、欄位(由欄、列來組成)。
    因此,使用上需要幾個類別實體來操作:
    (A) Application
    (B) Workbook - 操作活頁簿
    (C) Worksheet - 操作工作表
    (D) Range - 操作欄位(可以為某個矩形範圍,如 A3-C5

    using Microsoft.Office.Interop.Excel;
    //引用Excel Application類別
    _Application myExcel = null;
    //引用活頁簿類別
    _Workbook myBook = null;
    //引用工作表類別
    _Worksheet mySheet = null;
    

  3. 首先,在範例裡面,我在載入WinForm後,將Excel的實體初始化。動作上就如前面說的,依序把Application, 活頁簿, 工作表初始化,並且設定焦點。

    private void InitExcel()
    {
          //開啟一個新的應用程式
          myExcel = new Microsoft.Office.Interop.Excel.Application();
          //加入新的活頁簿
          myExcel.Workbooks.Add(true);
          //停用警告訊息
          myExcel.DisplayAlerts = false;
          //讓Excel文件可見 
          myExcel.Visible = true;
          //引用第一個活頁簿
          myBook = myExcel.Workbooks[1];
          //設定活頁簿焦點
          myBook.Activate();
          //引用第一個工作表
          mySheet = (_Worksheet)myBook.Worksheets[1];
          //命名工作表的名稱為 "Array"
          mySheet.Name = "測試";
          //設工作表焦點
          mySheet.Activate();
    }
    

  4. 需要設定欄位資料的時候,再調用Range來做事。
    範例中,是利用兩個Textbox來選定欄位(.get_Range),再利用第三個Textbox來給定值(.Value2)。

    private void buttonSet_Click(object sender, EventArgs e)
    {
    string col = (string)comboBoxCol.SelectedItem;
    string row = (string)comboBoxRow.SelectedItem;
    Range myRange = null;
    myRange = mySheet.get_Range(col + row, Type.Missing);
    myRange.Value2 = textBoxData.Text;
    }
    

  5. 最後,在程式終了時,將Excel存檔(.SaveAs),並釋放資源。

    private void button1_Click(object sender, EventArgs e)
    {
          //另存活頁簿
          myBook.SaveAs(filename, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
          //關閉活頁簿
          myBook.Close(false, Type.Missing, Type.Missing);
          //關閉Excel
          myExcel.Quit();
          //釋放Excel資源
          System.Runtime.InteropServices.Marshal.ReleaseComObject(myExcel);
          myBook = null;
          mySheet = null;
          myExcel = null;
          GC.Collect();
    }
    


範例程式畫面如下:

範例程式

範例程式下載:Excel範例程式