跳至页脚内容
使用 IRONXL

如何使用IronXL在 C# 中打开 Excel 文件

在C#中打开和处理Excel文件几乎是每个.NET开发人员迟早都会遇到的事情。无论您是在自动化每周报告、处理数据导入,还是构建动态生成电子表格的工具,所选择的库对速度、可靠性和部署灵活性都可以产生重大影响。

本教程介绍如何使用IronXL在C#中打开Excel文件——一个轻量级的Excel库,可以读取、编辑和写入工作簿,而无需安装Microsoft Office。 您将看到在您的C#应用程序中以编程方式加载数据、访问工作表和处理单元格是多么简单。

为何选择IronXL而不是Microsoft.Office.Interop.Excel?

虽然Microsoft.Office.Interop.Excel一直是Excel自动化的传统方法,但它存在显著的局限性,使得IronXL成为现代应用程序的更好选择。 微软建议不要在服务器上使用Office Interop,理由是存在不稳定性、扩展性问题和不受支持的部署场景。

IronXL与Microsoft.Office.Interop.Excel的功能对比
特征 IronXL Microsoft.Office.Interop.Excel
**需要安装Excel**
**跨平台支持** Windows、Linux、macOS 仅限 Windows
**服务器部署** 完全支持 微软不推荐
**内存管理** 自动翻译 需要手动清理 COM 对象
**API复杂性** 简单直观 复杂的COM接口
**文件格式支持** XLS, XLSX, CSV, TSV, JSON 仅限于Excel格式
**线程安全** 支持 仅单线程

IronXL消除了对Microsoft Excel的依赖,使其非常适合于服务器环境、Docker容器Azure等云平台。 该库提供了一个干净、现代的API,消除了处理COM对象或手动内存管理的需要。 除了打开文件,IronXL还处理从公式求值图表生成单元格样式的所有操作。

如何在.NET项目中安装IronXL?

开始使用IronXL很简单——可以通过NuGet包管理器在几分钟内将其添加到您的项目中。 在 Visual Studio 中打开软件包管理器控制台并运行:

Install-Package IronXL
dotnet add package IronXL
Install-Package IronXL
dotnet add package IronXL
SHELL

两个命令都安装相同的软件包。 在Visual Studio包管理器控制台使用第一个,在.NET CLI中使用第二个。 安装后,您可以在项目文件中的<PackageReference Include="IronXl.Excel" />下验证包引用。

立即开始使用 IronXL。
green arrow pointer

IronXL支持哪些.NET版本?

IronXL针对现代.NET版本的全谱支持,包括.NET 10、.NET 8、.NET 6、.NET Framework 4.6.2及以上版本,以及.NET Standard 2.0。这种广泛的支持意味着您可以在.NET 10的新项目中使用IronXL,也可以在运行传统.NET Framework的旧应用程序中使用。

该库作为一个单一的NuGet包提供,自动选择适合您的目标框架的正确二进制文件。 不需要额外的依赖项,不需要特定于平台的安装,也不需要Excel许可证。 访问IronXL兼容性指南以查看支持的运行时和平台的完整列表。

如何在C#中打开并读取现有的Excel文件?

使用IronXL打开现有的Excel文件只需几行代码。 该库支持通过统一的API读取XLS和XLSX文件,以及CSV和TSV格式。 以下示例演示了基本的工作流程:

// Load an existing Excel file
WorkBook workbook = WorkBook.Load("sales-data.xlsx");

// Access the first worksheet by index
WorkSheet sheet = workbook.WorkSheets[0];

// Or access a worksheet by name
WorkSheet namedSheet = workbook.GetWorkSheet("January Sales");

// Read a specific cell value
string cellValue = sheet["A1"].StringValue;
Console.WriteLine($"Cell A1 contains: {cellValue}");

// Read a numeric value
decimal revenue = sheet["B2"].DecimalValue;
Console.WriteLine($"Revenue: {revenue:C}");

// Check cell data type before reading
var cell = sheet["C3"];
Console.WriteLine($"Type: {cell.Type}, Value: {cell.Value}");
// Load an existing Excel file
WorkBook workbook = WorkBook.Load("sales-data.xlsx");

// Access the first worksheet by index
WorkSheet sheet = workbook.WorkSheets[0];

// Or access a worksheet by name
WorkSheet namedSheet = workbook.GetWorkSheet("January Sales");

// Read a specific cell value
string cellValue = sheet["A1"].StringValue;
Console.WriteLine($"Cell A1 contains: {cellValue}");

// Read a numeric value
decimal revenue = sheet["B2"].DecimalValue;
Console.WriteLine($"Revenue: {revenue:C}");

// Check cell data type before reading
var cell = sheet["C3"];
Console.WriteLine($"Type: {cell.Type}, Value: {cell.Value}");
$vbLabelText   $csharpLabel

WorkBook.Load()方法会自动检测文件格式——XLS、XLSX、CSV或TSV,并在不进行任何额外配置的情况下处理解析。 您可以使用索引通过GetWorkSheet()访问工作表。 单个单元格值可通过括号表示法sheet["A1"]读取,使代码简洁且富有表现力。有关支持的文件类型的完整列表,请参阅Open XML SDK文档中关于SpreadsheetML以及IronXL NuGet包页面

对于类型化访问,IronXL直接在单元格上暴露.DateTimeValue等属性。 这消除了基于通用对象的API常见的类型猜测。对于更复杂的场景,请参阅Excel范围选择指南单元格数据格式文档

输出

如何在C#中使用IronXL打开Excel文件应用程序:图1 - 打开并读取示例Excel文件

如何从流或字节数组加载Excel文件?

在网络应用程序和云函数中,您通常会接收文件数据作为流或字节数组,而不是文件路径。 IronXL处理这两种情况:

// Load from a byte array (e.g., from a database or HTTP response)
byte[] fileBytes = File.ReadAllBytes("sales-data.xlsx");
WorkBook workbookFromBytes = WorkBook.Load(fileBytes);

// Load from a MemoryStream
using var memStream = new MemoryStream(fileBytes);
WorkBook workbookFromStream = WorkBook.Load(memStream);

// Access data the same way regardless of source
WorkSheet sheet = workbookFromStream.DefaultWorkSheet;
Console.WriteLine(sheet["A1"].StringValue);
// Load from a byte array (e.g., from a database or HTTP response)
byte[] fileBytes = File.ReadAllBytes("sales-data.xlsx");
WorkBook workbookFromBytes = WorkBook.Load(fileBytes);

// Load from a MemoryStream
using var memStream = new MemoryStream(fileBytes);
WorkBook workbookFromStream = WorkBook.Load(memStream);

// Access data the same way regardless of source
WorkSheet sheet = workbookFromStream.DefaultWorkSheet;
Console.WriteLine(sheet["A1"].StringValue);
$vbLabelText   $csharpLabel

基于流的加载在ASP.NET Core控制器中特别有用,您在此接收IFormFile上传。 只需调用WorkBook.Load()。 有关完整的ASP.NET Core集成模式,请参阅ASP.NET Core Excel教程

如何在C#中创建新的Excel工作簿?

使用IronXL的电子表格创建功能同样可以简单地创建新的Excel文件。 以下示例构建了一个格式化的季度报告:

// Create a new workbook in XLSX format
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);

// Add metadata
workbook.Metadata.Author = "Sales Department";
workbook.Metadata.Title = "Q1 Revenue Report";

// Create a named worksheet
WorkSheet sheet = workbook.CreateWorkSheet("Q1 Report");

// Add header row
sheet["A1"].Value = "Product";
sheet["B1"].Value = "Units Sold";
sheet["C1"].Value = "Revenue";

// Add data rows
sheet["A2"].Value = "Software Licenses";
sheet["B2"].Value = 120;
sheet["C2"].Value = 45000;

sheet["A3"].Value = "Support Contracts";
sheet["B3"].Value = 55;
sheet["C3"].Value = 27500;

// Add a SUM formula
sheet["C4"].Formula = "=SUM(C2:C3)";

// Apply number formatting
sheet["C2:C4"].FormatString = "$#,##0.00";

// Save the workbook to disk
workbook.SaveAs("quarterly-report.xlsx");
Console.WriteLine("Workbook saved successfully.");
// Create a new workbook in XLSX format
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);

// Add metadata
workbook.Metadata.Author = "Sales Department";
workbook.Metadata.Title = "Q1 Revenue Report";

// Create a named worksheet
WorkSheet sheet = workbook.CreateWorkSheet("Q1 Report");

// Add header row
sheet["A1"].Value = "Product";
sheet["B1"].Value = "Units Sold";
sheet["C1"].Value = "Revenue";

// Add data rows
sheet["A2"].Value = "Software Licenses";
sheet["B2"].Value = 120;
sheet["C2"].Value = 45000;

sheet["A3"].Value = "Support Contracts";
sheet["B3"].Value = 55;
sheet["C3"].Value = 27500;

// Add a SUM formula
sheet["C4"].Formula = "=SUM(C2:C3)";

// Apply number formatting
sheet["C2:C4"].FormatString = "$#,##0.00";

// Save the workbook to disk
workbook.SaveAs("quarterly-report.xlsx");
Console.WriteLine("Workbook saved successfully.");
$vbLabelText   $csharpLabel

WorkBook.Create()方法初始化指定格式的新工作簿。 您可以使用Formula属性直接应用Excel公式。 该库自动处理数据类型转换和Excel特定的格式要求。

对于样式化标题和添加边框,请使用单元格样式API。 对于基于模板的报告生成,请参阅导出现有Excel模板指南

输出

如何在C#中使用IronXL打开Excel文件应用程序:图2 - 创建新的Excel工作簿

如何批量读取和处理Excel工作表数据?

IronXL通过基于范围的操作和DataTable转换有效地处理数据提取和批量处理:

// Load a workbook and select the default sheet
WorkBook workbook = WorkBook.Load("inventory.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;

// Read a rectangular range of cells
var range = sheet["A1:D10"];
foreach (var cell in range)
{
    Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}

// Convert the worksheet to a DataTable for database integration
System.Data.DataTable dataTable = sheet.ToDataTable(useFirstRowAsColumnHeaders: true);
Console.WriteLine($"Rows: {dataTable.Rows.Count}, Columns: {dataTable.Columns.Count}");

// Use aggregate functions directly on a range
decimal total = sheet["C2:C10"].Sum();
decimal average = sheet["C2:C10"].Avg();
decimal maxValue = sheet["C2:C10"].Max();

Console.WriteLine($"Total: {total:C}");
Console.WriteLine($"Average: {average:C}");
Console.WriteLine($"Max: {maxValue:C}");

// Filter and find rows using LINQ on the DataTable
var highValue = dataTable.AsEnumerable()
    .Where(row => row.Field<decimal>("Revenue") > 10000)
    .ToList();
Console.WriteLine($"High-value rows: {highValue.Count}");
// Load a workbook and select the default sheet
WorkBook workbook = WorkBook.Load("inventory.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;

// Read a rectangular range of cells
var range = sheet["A1:D10"];
foreach (var cell in range)
{
    Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}

// Convert the worksheet to a DataTable for database integration
System.Data.DataTable dataTable = sheet.ToDataTable(useFirstRowAsColumnHeaders: true);
Console.WriteLine($"Rows: {dataTable.Rows.Count}, Columns: {dataTable.Columns.Count}");

// Use aggregate functions directly on a range
decimal total = sheet["C2:C10"].Sum();
decimal average = sheet["C2:C10"].Avg();
decimal maxValue = sheet["C2:C10"].Max();

Console.WriteLine($"Total: {total:C}");
Console.WriteLine($"Average: {average:C}");
Console.WriteLine($"Max: {maxValue:C}");

// Filter and find rows using LINQ on the DataTable
var highValue = dataTable.AsEnumerable()
    .Where(row => row.Field<decimal>("Revenue") > 10000)
    .ToList();
Console.WriteLine($"High-value rows: {highValue.Count}");
$vbLabelText   $csharpLabel

范围选择语法sheet["A1:D10"]提供了一种优雅的方法,一次处理多个单元格。 System.Data.DataTable,可以直接与Entity Framework、数据绑定控件和SQL批量复制操作集成。 IronXL还支持聚合函数——Min()——直接在范围上使用,消除了编写手动迭代代码的需要。

要有效处理非常大的数据集,请查阅完整的IronXL API参考文档,了解流处理和分块处理模式。

如何在C#中使用IronXL打开Excel文件应用程序:图3 - 处理的Excel数据输出

如何在工作表中过滤和搜索单元格?

除了基于范围的访问,IronXL还允许您按值搜索单元格,应用条件逻辑,并以编程方式迭代行和列:

WorkBook workbook = WorkBook.Load("products.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;

// Get total row and column counts
int rowCount = sheet.RowCount;
int colCount = sheet.ColumnCount;

Console.WriteLine($"Sheet dimensions: {rowCount} rows x {colCount} columns");

// Iterate over all rows and columns
for (int row = 1; row <= rowCount; row++)
{
    for (int col = 1; col <= colCount; col++)
    {
        var cell = sheet.GetCellAt(row, col);
        if (cell != null && !string.IsNullOrEmpty(cell.Text))
        {
            Console.WriteLine($"[{row},{col}] = {cell.Text}");
        }
    }
}

// Find the first cell containing specific text
var searchResult = sheet["A1:Z100"]
    .FirstOrDefault(c => c.StringValue.Contains("discontinued", StringComparison.OrdinalIgnoreCase));

if (searchResult != null)
{
    Console.WriteLine($"Found 'discontinued' at: {searchResult.AddressString}");
}
WorkBook workbook = WorkBook.Load("products.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;

// Get total row and column counts
int rowCount = sheet.RowCount;
int colCount = sheet.ColumnCount;

Console.WriteLine($"Sheet dimensions: {rowCount} rows x {colCount} columns");

// Iterate over all rows and columns
for (int row = 1; row <= rowCount; row++)
{
    for (int col = 1; col <= colCount; col++)
    {
        var cell = sheet.GetCellAt(row, col);
        if (cell != null && !string.IsNullOrEmpty(cell.Text))
        {
            Console.WriteLine($"[{row},{col}] = {cell.Text}");
        }
    }
}

// Find the first cell containing specific text
var searchResult = sheet["A1:Z100"]
    .FirstOrDefault(c => c.StringValue.Contains("discontinued", StringComparison.OrdinalIgnoreCase));

if (searchResult != null)
{
    Console.WriteLine($"Found 'discontinued' at: {searchResult.AddressString}");
}
$vbLabelText   $csharpLabel

此模式在您需要在进一步处理之前扫描上传文件的特定值的数据验证工作流中很常见。 有关高级过滤用例,请查看Excel范围选择文档

这种方法支持哪些部署场景?

使用IronXL的一个最实用的优势是无需在系统上安装Microsoft Office即可运行。 这为部署灵活性提供了Interop解决方案无法比拟的优势:

云和容器部署

IronXL在Azure应用服务、AWS Lambda和Google Cloud Run上运行,无需任何特殊配置。 因为它不依赖Office,您避免了包括Office在一个容器映像中的许可费用和复杂性。 使用IronXL的.NET 10应用的最小Dockerfile只需要标准的.NET运行时镜像。

基于Docker的部署同样简单。 IronXL Docker指南介绍了Debian、Alpine和Windows容器配置。 在所有情况下,您通过NuGet安装IronXL,它无需额外的系统包即可运行。

服务器和CI/CD管道使用

服务器环境通常缺乏GUI,无法运行依赖于Windows桌面会话的应用程序。 IronXL完全以无头模式运行,使其适合于:

  • 在计划的后台任务中生成Excel报告
  • 在ASP.NET Core API中处理上传的电子表格
  • 在自动化管道中将DataTable或数据库查询结果导出到XLSX
  • 在CI/CD测试运行期间验证导入的数据文件

对于ASP.NET Core,请参阅ASP.NET Core Excel导出教程,涵盖文件流、响应头和正确的处置模式。

跨平台开发

IronXL目标.NET Standard 2.0,并在Linux和macOS上以本地方式运行,实现了跨平台开发工作流。 macOS上的开发人员可以将Excel生成代码在本地编写和测试,并对相同的二进制文件在Linux生产服务器上以相同方式工作充满信心。 不需要特定于平台的API或条件编译块。

有关支持的环境的更多详细信息,请访问IronXL入门概述

如何处理基本读取之外的常见Excel操作?

读写单元格只是基础。 真实世界的Excel自动化通常涉及格式化、公式、工作表管理和格式转换。

格式化单元格并应用样式

IronXL提供了一个完整的样式API,涵盖字体、颜色、边框、对齐和数字格式:

WorkBook workbook = WorkBook.Load("report.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;

// Apply bold, font size, and background color to header row
var headerRange = sheet["A1:F1"];
headerRange.Style.Font.Bold = true;
headerRange.Style.Font.Height = 12;
headerRange.Style.SetBackgroundColor("#4472C4");
headerRange.Style.Font.Color = "#FFFFFF";
headerRange.Style.HorizontalAlignment = IronXl.Styles.HorizontalAlignment.Center;

// Format a currency column
sheet["D2:D100"].FormatString = "$#,##0.00";

// Apply a date format
sheet["E2:E100"].FormatString = "yyyy-MM-dd";

// Add borders to a data range
var dataRange = sheet["A1:F20"];
dataRange.Style.Border.Bottom.Type = IronXl.Styles.BorderType.Thin;
dataRange.Style.Border.Right.Type = IronXl.Styles.BorderType.Thin;

workbook.SaveAs("formatted-report.xlsx");
WorkBook workbook = WorkBook.Load("report.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;

// Apply bold, font size, and background color to header row
var headerRange = sheet["A1:F1"];
headerRange.Style.Font.Bold = true;
headerRange.Style.Font.Height = 12;
headerRange.Style.SetBackgroundColor("#4472C4");
headerRange.Style.Font.Color = "#FFFFFF";
headerRange.Style.HorizontalAlignment = IronXl.Styles.HorizontalAlignment.Center;

// Format a currency column
sheet["D2:D100"].FormatString = "$#,##0.00";

// Apply a date format
sheet["E2:E100"].FormatString = "yyyy-MM-dd";

// Add borders to a data range
var dataRange = sheet["A1:F20"];
dataRange.Style.Border.Bottom.Type = IronXl.Styles.BorderType.Thin;
dataRange.Style.Border.Right.Type = IronXl.Styles.BorderType.Thin;

workbook.SaveAs("formatted-report.xlsx");
$vbLabelText   $csharpLabel

有关样式选项的完整演练,请参阅如何样式化单元格、边框和字体

在Excel和CSV格式之间进行转换

IronXL直接处理格式转换,让您可以加载CSV并将其保存为XLSX,或将XLSX文件导出为CSV以便下游处理:

// Load a CSV file and save as XLSX
WorkBook csvBook = WorkBook.Load("data-import.csv");
csvBook.SaveAs("data-import.xlsx");

// Load an XLSX file and export as CSV
WorkBook xlsxBook = WorkBook.Load("report.xlsx");
xlsxBook.DefaultWorkSheet.SaveAsCsv("report.csv");
// Load a CSV file and save as XLSX
WorkBook csvBook = WorkBook.Load("data-import.csv");
csvBook.SaveAs("data-import.xlsx");

// Load an XLSX file and export as CSV
WorkBook xlsxBook = WorkBook.Load("report.xlsx");
xlsxBook.DefaultWorkSheet.SaveAsCsv("report.csv");
$vbLabelText   $csharpLabel

有关CSV处理的更多详细信息,包括分隔符配置和编码选项,请参阅C# CSV阅读器教程CSV到XLSX转换指南

如何开始免费的试用?

IronXL可以免费下载,您可获得一个免费开发许可证,允许在购买之前测试完整的功能集。 在试用期间没有功能限制——用于生产的同一个库就是您评估的产品。

开始使用:

1.通过NuGet安装包:

   dotnet add package IronXL
   dotnet add package IronXL
SHELL

2.访问IronXL许可页面获取免费的试用密钥。 3.在任何IronXL调用之前在代码中应用密钥:

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

许可证适用于个人开发者、团队和组织。 IronXL产品页面提供详细的定价信息和部署选项,包括免版税分发权。 要全面了解所有Iron Software产品及其集成,请参阅Iron Software产品套件

常见问题解答

如何在 C# 中打开 Excel 文件而无需 Microsoft Office?

您可以使用 IronXL 在 C# 中打开 Excel 文件,而无需 Microsoft Office。IronXL 提供了一个优于 Interop 的现代替代方案,具有更好的性能且无 Excel 依赖。

使用 IronXL 处理 C# 中的 Excel 文件有哪些好处?

IronXL 提供了多项好处,包括提高性能,无需依赖 Excel 安装,且在部署方面具有更大的灵活性。它允许开发者高效地自动生成报告、读取数据导入和生成电子表格。

IronXL 能处理 Excel 文件的自动化任务吗?

可以,IronXL 非常适合用于生成每周报告、读取数据导入和创建动态电子表格生成工具等自动化任务。

IronXL 是 C# 应用程序中 Interop 的适合替代品吗?

IronXL 是 Interop 的适当替代品,提供了一种现代解决方案,无需 Excel 依赖,并在处理 Excel 文件时提高了应用性能。

IronXL 支持读取和写入 Excel 文件吗?

IronXL 完全支持读取和写入 Excel 文件,成为 .NET 开发者处理电子表格数据的多功能工具。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我