首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# Excel 程式設計完整指南:COM Interop 操作試算表資料匯出

     編輯:關於C語言

為何選擇 Excel 作為報表輸出方案?

企業應用中,列印需求千差萬別。若程式內建列印邏輯,維護成本極高。利用幾乎普及的 Excel,將資料匯出至試算表,讓使用者善用 Excel 強大的排版、圖表、篩選、列印功能自行定製,兼顧開發效率與使用者彈性。

Excel 物件模型四大核心物件

  • Application:頂層物件,代表 Excel 應用程式本身
  • Workbook:工作簿(.xls/.xlsx 檔案),含多張工作表
  • Worksheet:單一工作表,由儲存格網格組成
  • Range:一個或多個儲存格區塊,資料讀寫的基本單位

受控與非受控代碼邊界:COM Interop 機制

.NET 執行環境(CLR)管理記憶體、型別安全,稱為受控代碼。Excel COM 元件屬於非受控代碼。C# 呼叫 Excel 必須透過RCW (Runtime Callable Wrapper) 包裝,將 COM 介面轉為 .NET 型別。Visual Studio 「加入參考」→「COM」→選取 Microsoft Excel XX.0 Object Library 即可自動生成 Interop 組件(命名空間 Microsoft.Office.Interop.Excel)。

核心操作程式碼範例

啟動 Excel 並建立活頁簿

var excel = new Excel.Application();
excel.Workbooks.Add(Type.Missing);  // 新增空白活頁簿
excel.Visible = true;               // 顯示視窗

寫入儲存格資料

excel.Cells[1, 1] = "第一欄標題";
excel.Cells[1, 2] = "第二欄標題";
excel.Cells[2, 1] = "資料列1";
excel.Cells[2, 2] = "資料列2";

完整範例:Oracle 資料匯出 Excel

string connStr = "Provider=msdaora.1;Data Source=MyDB;User ID=usr;Password=pwd;";
using (var cn = new OleDbConnection(connStr))
{
    cn.Open();
    using (var cmd = new OleDbCommand("SELECT * FROM Schema.Table", cn))
    using (var dr = cmd.ExecuteReader())
    {
        var xlApp = new Excel.Application();
        if (xlApp == null) { MessageBox.Show("無法啟動 Excel"); return; }
        
        xlApp.Workbooks.Add(true);
        int row = 2, colCount = dr.FieldCount;
        
        // 寫入標題列
        for (int c = 0; c < colCount; c++)
            xlApp.Cells[1, c + 1] = dr.GetName(c);
        
        // 寫入資料列
        while (dr.Read())
        {
            for (int c = 0; c < colCount; c++)
                xlApp.Cells[row, c + 1] = dr.GetValue(c)?.ToString();
            row++;
        }
        xlApp.Visible = true;
    }
}

部署注意事項:三大必要條件

  1. 目標機安裝 .NET Runtime
  2. 目標機安裝 Microsoft Excel(提供 COM 元件)
  3. Interop 組件 DLL 隨應用程式部署(置於輸出目錄或 GAC)

效能與最佳實務提醒

  • 大量資料寫入時,建議先組成二維陣列 object[,],一次寫入 Range.Value2 = arr,避免頻繁跨程序呼叫
  • 使用完畢務必釋放 COM 物件:Marshal.ReleaseComObject,並呼叫 GC.Collect(),防止 Excel 進程殘留
  • 考慮使用 OpenXML SDK (純 .NET、無需安裝 Excel) 或 EPPlus/NPOI 等第三方庫,獲得更好效能與伺服器端相容性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved