IRONSOFTWAREHOME
USING IRONXL

如何在不使用互通的情況下,使用 C# 在 Excel 中建立資料透視表

Curtis Chau
Curtis Chau
Updated: 2026年6月28日

使用C#在Excel中建立樞紐分析表很簡單,當您選擇正確的程式庫時 -- Excel Interop需要每台電腦上都安裝Office,而IronXL在任何.NET運行的地方都可以運作。 本指南透過完整的程式碼範例展示了兩種方法,涵蓋設置、資料聚合、欄位配置和部署考量,幫助您為您的專案制定正確的決策。

如何使用C# Interop和IronXL在Excel中建立樞紐分析表:圖像 1 - IronXL

Excel Interop和IronXL之間的區別是什麼?

在寫任何程式碼之前,瞭解每種方法在後臺的運作方式是有幫助的。 Excel Interop使用COM(組件物件模型)直接從C#驅動Microsoft Excel。 .NET進程與運行中的Excel實例通信,這意味著Excel本身必須安裝在機器上。您操作的每個物件 -- 工作簿、工作表、範圍、樞紐快取 -- 都是COM包裝器,必須明確釋放每一個,以避免進程洩漏。

IronXL採取了根本不同的路徑。 它直接讀取和寫入Open XML文件格式,完全不需啟動Excel。 結果是標準的.NET程式庫,具有熟悉的物件模式、垃圾回收記憶體,且不依賴於Office的安裝和授權。 這種架構使IronXL適合伺服器端工作負載、Docker容器、Linux主機以及任何.NET 6、.NET 8或.NET 10環境。

Excel Interop vs IronXL -- 一目了然
標準Excel InteropIronXL
需要 Office
僅限Windows否 -- 跨平台
記憶體管理手動COM釋放自動(.NET垃圾回收)
伺服器部署簡單
本機樞紐分析表完整的Excel樞紐API透過LINQ進行資料聚合
需要授權Office授權僅IronXL授權

如何使用C# Interop和IronXL在Excel中建立樞紐分析表:圖像 2 - 跨平台

如何安裝每個程式庫?

設置Excel Interop

Excel Interop作為NuGet包提供。 在專案中運行以下任一命令:

Install-Package Microsoft.Office.Interop.Excel
dotnet add package Microsoft.Office.Interop.Excel
SHELL

注意,僅有該包是不夠的 -- 目標機器必須安裝支持版本的 Microsoft Excel 並且具有適當的授權。 該依賴性排除了大多數伺服器、容器和雲端場景。

如何使用C# Interop和IronXL在Excel中建立樞紐分析表:圖像 3 - Excel Interop 安裝

設置IronXL

通過NuGet安裝IronXL,無需額外的系統要求:

PM > Install-Package IronXL.Excel

安裝後,您可以立即在任何支持.NET的平台上開始讀寫Excel文件。 無需Office授權,無需COM註冊,也無需伺服器配置。 查看IronXL安裝指南以獲取其他選項,包括離線安裝和專案引用設置。

如何使用C# Interop和IronXL在Excel中建立樞紐分析表:圖像 4 - 安裝

第一步:
arrow pointer

您如何使用C# Interop建立Excel樞紐分析表?

Interop樞紐分析表工作流程遵循嚴格的順序:從源範圍建立樞紐快取,然後在單獨的工作表上構建PivotTable物件,然後配置欄位方向。 下面的範例使用與.NET 10相容的頂層C#語句:

using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

// Launch Excel and set up workbooks
var excelApp = new Excel.Application();
excelApp.Visible = false;
var workbook = excelApp.Workbooks.Add();
var dataSheet = (Excel.Worksheet)workbook.Worksheets[1];
dataSheet.Name = "SalesData";
var pivotSheet = (Excel.Worksheet)workbook.Worksheets.Add();
pivotSheet.Name = "Pivot";

// Populate header row
dataSheet.Cells[1, 1] = "Product";
dataSheet.Cells[1, 2] = "Region";
dataSheet.Cells[1, 3] = "Sales";

// Add sample data rows
object[,] rows = {
    { "Laptop",   "否rth", 1200 },
    { "Laptop",   "South", 1500 },
    { "Phone",    "否rth",  800 },
    { "Phone",    "South",  950 },
    { "Tablet",   "East",   600 },
    { "Tablet",   "West",   750 },
    { "Monitor",  "否rth",  400 },
    { "Monitor",  "South",  500 },
    { "Keyboard", "East",   300 },
};
for (int i = 0; i < rows.GetLength(0); i++)
{
    dataSheet.Cells[i + 2, 1] = rows[i, 0];
    dataSheet.Cells[i + 2, 2] = rows[i, 1];
    dataSheet.Cells[i + 2, 3] = rows[i, 2];
}

// Build pivot cache from source range
Excel.Range dataRange = dataSheet.Range["A1:C10"];
Excel.PivotCache pivotCache = workbook.PivotCaches().Create(
    Excel.XlPivotTableSourceType.xlDatabase, dataRange);

// Create the PivotTable on the pivot sheet
Excel.PivotTables pivotTables = (Excel.PivotTables)pivotSheet.PivotTables();
Excel.PivotTable pivotTable = pivotTables.Add(
    pivotCache, pivotSheet.Range["A3"], "SalesPivot");

// Assign field orientations
((Excel.PivotField)pivotTable.PivotFields("Product")).Orientation =
    Excel.XlPivotFieldOrientation.xlRowField;
((Excel.PivotField)pivotTable.PivotFields("Region")).Orientation =
    Excel.XlPivotFieldOrientation.xlColumnField;
((Excel.PivotField)pivotTable.PivotFields("Sales")).Orientation =
    Excel.XlPivotFieldOrientation.xlDataField;

// Enable grand totals
pivotTable.RowGrand = true;
pivotTable.ColumnGrand = true;

// Save and close
workbook.SaveAs(@"C:\output\pivot_interop.xlsx");
workbook.Close(false);
excelApp.Quit();

// Release every COM object -- skipping any of these causes Excel to stay in memory
Marshal.ReleaseComObject(pivotTable);
Marshal.ReleaseComObject(pivotTables);
Marshal.ReleaseComObject(pivotCache);
Marshal.ReleaseComObject(dataRange);
Marshal.ReleaseComObject(pivotSheet);
Marshal.ReleaseComObject(dataSheet);
Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(excelApp);
C#

每個COM包裝器需要匹配的Marshal.ReleaseComObject調用。 即便遺漏一個參考都會導致Excel進程持續在後台運行,消耗記憶體和文件句柄,直到主機進程結束。 隨著電子表格操作的複雜性增加,這一清理負擔也將上升。

您如何使用IronXL達成相同的結果?

IronXL不像Interop那樣公開本機樞紐API -- Open XML樞紐格式擁有數以百計的XML屬性,而大多數業務需求使用用純C#編寫的顯式LINQ聚合更可靠。 輸出是一個清晰的摘要表,文件打開時會自動重新計算,而不需依賴於Excel刷新樞紐快取。

using IronXL;
using System.Data;

// Create workbook and populate source data
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet dataSheet = workbook.CreateWorkSheet("SalesData");

dataSheet["A1"].Value = "Product";
dataSheet["B1"].Value = "Region";
dataSheet["C1"].Value = "Sales";

object[,] rows = {
    { "Laptop",   "否rth", 1200 },
    { "Laptop",   "South", 1500 },
    { "Phone",    "否rth",  800 },
    { "Phone",    "South",  950 },
    { "Tablet",   "East",   600 },
    { "Tablet",   "West",   750 },
    { "Monitor",  "否rth",  400 },
    { "Monitor",  "South",  500 },
    { "Keyboard", "East",   300 },
};
for (int i = 0; i < rows.GetLength(0); i++)
{
    dataSheet[$"A{i + 2}"].Value = rows[i, 0];
    dataSheet[$"B{i + 2}"].Value = rows[i, 1];
    dataSheet[$"C{i + 2}"].Value = rows[i, 2];
}

// Aggregate data with LINQ -- equivalent to a pivot table row/column/value layout
DataTable table = dataSheet["A1:C10"].ToDataTable(true);
var summary = table.AsEnumerable()
    .GroupBy(row => row.Field<string>("Product"))
    .Select((group, idx) => new
    {
        Product    = group.Key,
        TotalSales = group.Sum(r => Convert.ToDecimal(r["Sales"])),
        RegionCount = group.Select(r => r.Field<string>("Region")).Distinct().Count(),
        RowIndex   = idx + 2
    })
    .OrderByDescending(x => x.TotalSales);

// Write the summary sheet
WorkSheet summarySheet = workbook.CreateWorkSheet("Summary");
summarySheet["A1"].Value = "Product";
summarySheet["B1"].Value = "Total Sales";
summarySheet["C1"].Value = "Regions";

foreach (var item in summary)
{
    summarySheet[$"A{item.RowIndex}"].Value = item.Product;
    summarySheet[$"B{item.RowIndex}"].Value = (double)item.TotalSales;
    summarySheet[$"C{item.RowIndex}"].Value = item.RegionCount;
}

// Apply currency format to the sales column
summarySheet["B:B"].FormatString = "$#,##0.00";

// Bold the header row
summarySheet["A1:C1"].Style.Font.Bold = true;

// Save -- no COM cleanup needed
workbook.SaveAs(@"C:\output\analysis_ironxl.xlsx");
C#

沒有需要釋放的COM物件,沒有需要終止的Excel進程,也無需管理Office授權。 相同的程式碼可以在Linux、macOS和Windows上不作修改地編譯和運行。 有關聚合API的更多詳細資訊,請存取IronXL WorkSheet文件

輸出

如何使用C# Interop和IronXL在Excel中建立樞紐分析表:圖像 6 - IronXL輸出

如何使用C# Interop和IronXL在Excel中建立樞紐分析表:圖像 7 - 摘要輸出

部署和維護上的關鍵差異是什麼?

部署需求

部署基於Interop的應用程式涉及驗證目標環境是否運行Windows,是否安裝了正確的Office版本,以及伺服器上是否配置了COM自動化權限。 雲託管的環境和容器化的工作負載通常無法滿足這些要求,除非新增虛擬化的Windows桌面基礎設施,這會顯著增加成本和操作複雜性。

IronXL沒有這樣的限制。 新增NuGet包,將目標框架設置為.NET 6或更高版本,應用程式可以部署到任何主機 -- 包括Linux容器、Linux上的Azure App Service、AWS Lambda和內部部署的Windows伺服器。 IronXL系統要求頁面列出了完整的相容性矩陣。

錯誤處理和除錯

Interop失敗顯示為難以映射到使用者可見消息的COM例外(COMException)。 安裝的Office版本與Interop程式集之間的不匹配增加了另一種失敗模式。 除錯這些問題通常需要在開發機器上重新建立確切的Office版本。

IronXL拋出具有描述性消息的標準System.Exception子類。 您可以將文件操作包裹在try-catch塊中,並提供有意義的反饋,而無需了解COM錯誤程式碼。 IronXL故障排除指南涵蓋常見例外及其解決方案。

記憶體和性能

COM物件持有非管理的記憶體。 如果您的程式碼處理許多工作表或在迴圈中運行,未正確釋放每個引用會導致記憶體隨時間增長 -- 這是一個在它導致生產事故之前難以檢測到的問題。 Interop本質上也是單執行緒的,因為它驅動單個Excel窗口。

IronXL使用由.NET垃圾回收器支持的管理物件。 物件超出範疇時,記憶體自動回收。 並行處理多個工作簿很簡單,因為沒有需要鎖保護的共享COM狀態。

您如何在這兩種方法之間進行選擇?

合適的工具取決於兩個限制:程式碼運行的地方以及是否需要本機樞紐分析表XML。

在以下情況選擇Excel Interop:

  • 工作負載僅在已安裝Office的Windows桌面機器上運行
  • 輸出文件中需要精確的本機樞紐格式(切片、分組日期字段、計算項目)
  • 您維護現有的Interop程式碼庫,而完整重寫不合理

在以下情況選擇IronXL:

  • 應用程式在伺服器、容器或雲函式上運行
  • 需要跨平台或Linux部署
  • 您希望資料聚合邏輯可以用單元測試進行測試,而不是依賴於Excel進程
  • 您需要在大規模或並行處理Excel文件

對於大多數新的.NET 10專案,IronXL是實際的預設選擇。 IronXL程式庫還涵蓋C#中讀取Excel文件建立圖表應用單元格樣式操作公式將Excel資料匯出到DataTable,從而減少您堆棧中多個程式庫的需求。

如何使用C# Interop和IronXL在Excel中建立樞紐分析表:圖像 8 - 特性

哪些IronXL功能支持資料分析?

除了基本的聚合外,IronXL還提供一些支持更豐富的資料分析工作流程的功能:

排序和過濾資料

您可以在寫入摘要表之前按升序或降序排列範圍。 這可確保輸出始終以一致的順序呈現資料,從而使下游處理更具預測性。 請參閱IronXL排序文件以獲取範圍級別的排序選項。

應用條件格式化

透過程式化應用條件格式規則來突出顯示異常值或閾值。 例如,當銷售額低於目標時,您可以將摘要表中的單元格著色為紅色,從而無需最終使用者手動配置規則即可一目了然地查看。

讀取現有Excel文件

如果源資料來自現有的電子表格而不是資料庫,您可以透過WorkBook.Load直接載入它:

using IronXL;

WorkBook existing = WorkBook.Load(@"C:\data\sales_report.xlsx");
WorkSheet sheet = existing.WorkSheets[0];

// Read column C starting at row 2
var salesValues = sheet["C2:C100"]
    .Where(cell => cell.Value != null && cell.Value.ToString() != string.Empty)
    .Select(cell => cell.DecimalValue)
    .ToList();

decimal total = salesValues.Sum();
Console.WriteLine($"Total sales from file: {total:C}");

此模式適用於.csv以及IronXL支持的其他格式。 支持格式的詳細資訊顯示在IronXL文件格式文件中。

匯出到CSV

生成摘要工作表後,您可以將其匯出到CSV,供不接受Excel的下游系統使用:

workbook.SaveAsCsv(@"C:\output\summary.csv");

這在ETL管道中特別有用,其中最終消費者是資料庫匯入工具或資料倉庫載入器。

如何免費開始使用IronXL?

IronXL提供免費試用授權,讓您在不需訂閱的情況下評估完整的功能集。 試用版會在輸出文件上新增浮水印,當您應用正式授權金鑰時則可移除該浮水印。

要在程式碼中啟用授權金鑰,請在執行任何IronXL操作之前設置它:

IronXL.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";

您還可以透過環境變數(IRONXL_LICENSEKEY)或在ASP.NET Core專案中透過appsettings.json設置金鑰。 IronXL授權頁面描述了所有可用的層級選項,包括團隊和組織選項。

對於生產部署,請查看IronXL部署文件和更廣泛的IronXL教程,其中涵蓋ASP.NET Core、Azure Functions和Docker的模式。

您該如何採取下一步行動?

用C#編寫的Excel樞紐分析表不必依賴Office和COM複雜性。 使用IronXL,您可以撰寫運行在任何平台上的純.NET程式碼,自動管理記憶體,並自然而然地與單元測試框架和CI/CD管道整合。

下載免費IronXL試用版,並使用自己的資料運行本指南中的範例。 如果您遇到問題,IronXL社區論壇支援入口對於試用和擁有授權的使用者都有開放。 一旦您準備好部署,查看授權選項,以找到適合您的團隊規模和使用量的方案。

Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

...
閱讀更多

相關文章

Key in blue circle

立即免費取得 30 天試用金鑰

Your trial license will be sent to your email address

無任何限制。100% 解鎖。無需信用卡。

bullet_checked無需信用卡或建立帳號無任何限制。100% 解鎖。無需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
預約您的免費即時演示
Booking Badge

全球數百萬工程師的信賴

Iron Software的客戶標誌
獲得無義務諮詢
填寫以下表格或電郵sales@ironsoftware.com
您的資料將始終保密。
全球數百萬工程師的信賴
Iron Software的客戶標誌
立即獲取您的30天試用金鑰
無需信用卡或帳戶建立