跳至頁尾內容
USING IRONXL

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

使用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 Interop IronXL
需要 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
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,無需額外的系統要求:

Install-Package IronXL.Excel

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

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

現在開始使用IronXL。
green 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);
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);
Imports Excel = Microsoft.Office.Interop.Excel
Imports System.Runtime.InteropServices

' Launch Excel and set up workbooks
Dim excelApp As New Excel.Application()
excelApp.Visible = False
Dim workbook As Excel.Workbook = excelApp.Workbooks.Add()
Dim dataSheet As Excel.Worksheet = CType(workbook.Worksheets(1), Excel.Worksheet)
dataSheet.Name = "SalesData"
Dim pivotSheet As Excel.Worksheet = CType(workbook.Worksheets.Add(), Excel.Worksheet)
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
Dim rows As Object(,) = {
    {"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 i As Integer = 0 To rows.GetLength(0) - 1
    dataSheet.Cells(i + 2, 1) = rows(i, 0)
    dataSheet.Cells(i + 2, 2) = rows(i, 1)
    dataSheet.Cells(i + 2, 3) = rows(i, 2)
Next

' Build pivot cache from source range
Dim dataRange As Excel.Range = dataSheet.Range("A1:C10")
Dim pivotCache As Excel.PivotCache = workbook.PivotCaches().Create(
    Excel.XlPivotTableSourceType.xlDatabase, dataRange)

' Create the PivotTable on the pivot sheet
Dim pivotTables As Excel.PivotTables = CType(pivotSheet.PivotTables(), Excel.PivotTables)
Dim pivotTable As Excel.PivotTable = pivotTables.Add(
    pivotCache, pivotSheet.Range("A3"), "SalesPivot")

' Assign field orientations
CType(pivotTable.PivotFields("Product"), Excel.PivotField).Orientation =
    Excel.XlPivotFieldOrientation.xlRowField
CType(pivotTable.PivotFields("Region"), Excel.PivotField).Orientation =
    Excel.XlPivotFieldOrientation.xlColumnField
CType(pivotTable.PivotFields("Sales"), Excel.PivotField).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)
$vbLabelText   $csharpLabel

每個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");
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");
Imports IronXL
Imports System.Data
Imports System.Linq

' Create workbook and populate source data
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim dataSheet As WorkSheet = workbook.CreateWorkSheet("SalesData")

dataSheet("A1").Value = "Product"
dataSheet("B1").Value = "Region"
dataSheet("C1").Value = "Sales"

Dim rows As Object(,) = {
    {"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 i As Integer = 0 To rows.GetLength(0) - 1
    dataSheet($"A{i + 2}").Value = rows(i, 0)
    dataSheet($"B{i + 2}").Value = rows(i, 1)
    dataSheet($"C{i + 2}").Value = rows(i, 2)
Next

' Aggregate data with LINQ -- equivalent to a pivot table row/column/value layout
Dim table As DataTable = dataSheet("A1:C10").ToDataTable(True)
Dim summary = table.AsEnumerable() _
    .GroupBy(Function(row) row.Field(Of String)("Product")) _
    .Select(Function(group, idx) New With {
        .Product = group.Key,
        .TotalSales = group.Sum(Function(r) Convert.ToDecimal(r("Sales"))),
        .RegionCount = group.Select(Function(r) r.Field(Of String)("Region")).Distinct().Count(),
        .RowIndex = idx + 2
    }) _
    .OrderByDescending(Function(x) x.TotalSales)

' Write the summary sheet
Dim summarySheet As WorkSheet = workbook.CreateWorkSheet("Summary")
summarySheet("A1").Value = "Product"
summarySheet("B1").Value = "Total Sales"
summarySheet("C1").Value = "Regions"

For Each item In summary
    summarySheet($"A{item.RowIndex}").Value = item.Product
    summarySheet($"B{item.RowIndex}").Value = CDbl(item.TotalSales)
    summarySheet($"C{item.RowIndex}").Value = item.RegionCount
Next

' 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")
$vbLabelText   $csharpLabel

沒有需要釋放的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}");
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}");
Imports IronXL

Dim existing As WorkBook = WorkBook.Load("C:\data\sales_report.xlsx")
Dim sheet As WorkSheet = existing.WorkSheets(0)

' Read column C starting at row 2
Dim salesValues = sheet("C2:C100") _
    .Where(Function(cell) cell.Value IsNot Nothing AndAlso cell.Value.ToString() <> String.Empty) _
    .Select(Function(cell) cell.DecimalValue) _
    .ToList()

Dim total As Decimal = salesValues.Sum()
Console.WriteLine($"Total sales from file: {total:C}")
$vbLabelText   $csharpLabel

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

匯出到CSV

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

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

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

如何免費開始使用IronXL?

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

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

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

IronXL.License.LicenseKey = "YOUR-LICENSE-KEY-HERE"
$vbLabelText   $csharpLabel

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

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

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

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

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

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

常見問題

使用IronXL相比Excel Interop在建立樞紐分析表中的優勢是什麼?

IronXL提供了一種更現代化且高效的方法來在Excel文件中建立樞紐分析表,相較於傳統的Excel Interop。它簡化了過程並減少了所需的樣板程式碼量。

我可以使用IronXL在Excel中使用C#建立樞紐分析表嗎?

是的,IronXL提供了一種簡單的方法來使用C#在Excel中建立樞紐分析表。它允許開發人員輕鬆操作Excel文件而無需依賴Excel Interop。

IronXL是否與.NET應用程式相容?

IronXL與.NET應用程式完美相容,對於尋求將Excel功能整合到其C#專案中的開發人員來說,這是不錯的選擇。

IronXL是否需要在系統上安裝Excel?

不,IronXL不需要在系統上安裝Microsoft Excel。它獨立運作,這是相較於需要安裝Excel的Excel Interop的一個重要優勢。

IronXL如何簡化建立樞紐分析表的過程?

IronXL簡化過程,提供使用者友好的API,減少對大量樣板程式碼的需求,使開發流程更快且更高效。

使用IronXL的系統需求是什麼?

IronXL需要一個與.NET框架相容的環境,但不需要安裝Microsoft Excel,從而簡化了部署並減少了依賴性。

IronXL能否有效處理大型Excel文件?

是的,IronXL專為有效處理大型Excel文件而設計,使其適合要求擷取大量資料的商業應用。

相較於Excel Interop,使用IronXL是否有學習曲線?

IronXL採用直觀且易於學習的設計,擁有全面的文件和範例,與更複雜的Excel Interop相比更易採用。

除了建立樞紐分析表外,IronXL還能執行哪些型別的Excel操作?

IronXL可以執行各種Excel操作,包括讀取和寫入Excel文件、格式化單元格和應用公式等。

IronXL能否導出樞紐分析表到其他非Excel格式?

雖然IronXL主要專注於Excel操作,但它也支援將資料導出到如CSV和PDF等其他格式,具體取決於您的專案要求。

Curtis Chau
技術作家

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

除了開發,Curtis對物聯網(IoT)有濃厚的興趣,探索創新的方法來整合硬體和軟體。在空閒時間,他喜歡玩遊戲和建立Discord機器人,結合他對技術的熱愛與創造力。

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話