跳至页脚内容
使用 IRONXL

如何在不使用 Microsoft Office 的情况下用 C# 打开 Excel 文件

IronXL允许您在不安装 Microsoft Office 的情况下,用 C# 打开和读取 Excel 文件——只需安装NuGet包,加载工作簿,即可访问任何工作表、单元格或区域,并自动检测输入值和格式。

如果您曾经尝试过在没有 Microsoft Office 的情况下以编程方式打开 Excel 文件,您就会知道传统的互操作方法有多么棘手。 Interop 依赖于 Excel 本身的安装,需要复杂的 COM 引用,并且经常导致版本冲突——尤其是在 Office 不可用的服务器或云环境中。

IronXL是一个现代化的.NET库,可让您直接读取 XLSX、XLS、CSV 和 TSV 文件,无需任何 Office 依赖项。 您可以编写简洁可靠的 C# 代码,在 Windows、Linux 或云端处理 Excel 文件,并避免 COM 自动化带来的所有麻烦。 本指南详细介绍了从安装到打开和读取 Excel 工作簿的生产就绪模式的所有内容。

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

开始使用只需几秒钟。 打开您的项目并使用以下包管理器之一:

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

或者,打开 Visual Studio,右键单击您的项目,选择"管理NuGet程序包",搜索"IronXL",然后单击"安装"。 安装指南涵盖所有支持的环境,包括 Docker 和 Azure。

Visual Studio NuGet包管理器显示IronXl.Excel 包(版本 2025.9.1)可供安装。

安装完成后,在文件顶部添加命名空间:

using IronXL;
using IronXL;
$vbLabelText   $csharpLabel

你只需要这一句话就够了。 没有复杂的 COM 引用,没有 Office 依赖项,也没有特定于版本的程序集。 如需免费评估密钥,请访问IronXL试用许可证页面

为什么IronXL比传统的互操作性更容易?

传统 Excel 互操作要求运行代码的每台机器上都安装 Microsoft Office。 对于服务器部署、AWS Lambda 函数和容器化应用程序来说,这是不切实际的。 IronXL在内部处理所有 Excel 文件解析,提供简洁的 API,无需任何外部依赖项即可运行。

使用 Interop 时,还需要仔细管理 COM 对象的生命周期以防止内存泄漏——每个 WorkbookWorksheet 对象都必须显式释放,否则 Excel 进程会在后台累积。 IronXL使用标准的.NET垃圾回收机制,因此您无需考虑 COM 清理问题。

该库支持.NET Framework 4.6.2 及更高版本,以及.NET 5、6、7、8 和 10。它无需修改即可在 Windows、macOS 和 Linux 上运行。 如果您的目标是跨平台场景,仅凭这一点, IronXL就比仅适用于 Windows 的 Office Interop 更合适得多。

如何验证安装是否成功?

安装完成后,通过加载任意 Excel 文件并打印单元格值来创建一个简单的测试。 如果项目构建没有错误,并且输出与预期数据相符,则设置完成。 IronXL文档包含一个快速入门部分,其中详细介绍了此验证步骤。

安装过程中常见的错误是在将工作簿加载到生产环境之前忘记应用许可证密钥。 试用模式下,该库会在生成的任何文件中添加一个小水印。 在应用程序启动时设置 IronXl.License.LicenseKey,以便所有操作从一开始就在正确的许可证下运行。

如何打开Excel工作簿并读取单元格值?

核心API非常简单明了。 加载工作簿,选择工作表,然后按地址或迭代访问单元格。

using IronXL;

// Load any Excel file -- XLSX, XLS, CSV, or TSV
WorkBook workbook = WorkBook.Load("example.xlsx");

// Access the second worksheet (zero-indexed)
WorkSheet worksheet = workbook.WorkSheets[1];

// Read a specific cell value
decimal revenue = worksheet["E2"].DecimalValue;
Console.WriteLine($"Order Total: {revenue}");

// Iterate over a range of cells
foreach (var cell in worksheet["C2:C6"])
{
    Console.WriteLine($"Product: {cell.Text}");
}
using IronXL;

// Load any Excel file -- XLSX, XLS, CSV, or TSV
WorkBook workbook = WorkBook.Load("example.xlsx");

// Access the second worksheet (zero-indexed)
WorkSheet worksheet = workbook.WorkSheets[1];

// Read a specific cell value
decimal revenue = worksheet["E2"].DecimalValue;
Console.WriteLine($"Order Total: {revenue}");

// Iterate over a range of cells
foreach (var cell in worksheet["C2:C6"])
{
    Console.WriteLine($"Product: {cell.Text}");
}
$vbLabelText   $csharpLabel

WorkBook.Load() 自动检测文件格式 -- 无需指定文件是 XLS 还是 XLSX。 使用 workbook.GetWorkSheet("Sheet1") 按索引或名称访问工作表。 每个单元格都公开类型属性,例如 日期时间ValueText

有关打开文件的更多选项,请参阅打开工作簿操作指南

分屏显示,左侧是包含订单数据的 Excel 电子表格,右侧是显示提取数据的 Visual Studio 调试控制台

如何按名称访问工作表?

使用工作表名称比使用数字索引更易于维护,尤其是在其他人编辑工作簿时。 以下示例展示了如何按名称查找工作表并遍历所有工作表:

using IronXL;

WorkBook workbook = WorkBook.Load("inventory.xlsx");

// Access worksheet by exact name
WorkSheet salesSheet = workbook.GetWorkSheet("Sales Data");
Console.WriteLine($"Sales sheet rows: {salesSheet.RowCount}");

// Iterate all worksheets in the workbook
foreach (WorkSheet sheet in workbook.WorkSheets)
{
    if (sheet.Name.Contains("Inventory"))
    {
        Console.WriteLine($"Found inventory sheet: {sheet.Name}");
    }
}
using IronXL;

WorkBook workbook = WorkBook.Load("inventory.xlsx");

// Access worksheet by exact name
WorkSheet salesSheet = workbook.GetWorkSheet("Sales Data");
Console.WriteLine($"Sales sheet rows: {salesSheet.RowCount}");

// Iterate all worksheets in the workbook
foreach (WorkSheet sheet in workbook.WorkSheets)
{
    if (sheet.Name.Contains("Inventory"))
    {
        Console.WriteLine($"Found inventory sheet: {sheet.Name}");
    }
}
$vbLabelText   $csharpLabel

读取 Excel 文件指南解释了其他工作表访问模式,包括使用具有动态生成工作表名称的工作簿。

如何从Excel单元格中读取不同类型的数据?

IronXL为每种常见的 Excel 数据类型提供了类型化访问器。 您可以读取字符串、整数、小数、日期、布尔值和公式结果,无需任何手动解析。

using IronXL;

WorkBook wb = WorkBook.Load(@"C:\Data\Inventory.xlsx");
WorkSheet ws = wb.GetWorkSheet("Products");

// Read different data types directly
字符串 productName = ws["A2"].StringValue;
int quantity       = ws["B2"].IntValue;
decimal price      = ws["C2"].DecimalValue;
日期时间 updated   = ws["D2"].日期时间Value;

// Use aggregate functions on ranges for performance
decimal totalStock = ws["B2:B100"].Sum();
decimal maxPrice   = ws["C2:C100"].Max();

Console.WriteLine($"Product: {productName}, Qty: {quantity}, Price: {price:C}");
Console.WriteLine($"Total stock units: {totalStock}, Highest price: {maxPrice:C}");
using IronXL;

WorkBook wb = WorkBook.Load(@"C:\Data\Inventory.xlsx");
WorkSheet ws = wb.GetWorkSheet("Products");

// Read different data types directly
字符串 productName = ws["A2"].StringValue;
int quantity       = ws["B2"].IntValue;
decimal price      = ws["C2"].DecimalValue;
日期时间 updated   = ws["D2"].日期时间Value;

// Use aggregate functions on ranges for performance
decimal totalStock = ws["B2:B100"].Sum();
decimal maxPrice   = ws["C2:C100"].Max();

Console.WriteLine($"Product: {productName}, Qty: {quantity}, Price: {price:C}");
Console.WriteLine($"Total stock units: {totalStock}, Highest price: {maxPrice:C}");
$vbLabelText   $csharpLabel

下表总结了可用的类型化访问器:

IronXL单元格值访问器按数据类型
访问器 返回类型 注意事项
`StringValue` 字符串 即使对于数值单元格,也始终返回字符串。
`IntValue` int 截断小数
`DecimalValue` decimal 最适合用于财务数据
`DoubleValue` double 对于科学计数法或浮点数值
`日期时间Value` 日期时间 自动解析 Excel 序列号
`BoolValue` 布尔值 读取 TRUE/FALSE 单元格
`Formula` 字符串 返回公式文本,例如`=SUM(A2:D2)`

有关读取和写入单元格数据的完整详细信息,请参阅单元格格式指南导入数据操作指南

Excel 电子表格显示了产品库存数据,包含产品、数量、价格和上次更新时间等列,旁边是 Visual Studio 调试控制台,显示了使用 C# 以编程方式读取的相同数据。

如何安全地处理空单元格或无效单元格?

在实际的 Excel 文件中,空白单元格很常见。 读取类型化访问器之前,请使用 IsEmpty 属性或检查 Value 是否为 null:

using IronXL;

WorkBook workbook = WorkBook.Load("data.xlsx");
WorkSheet ws = workbook.DefaultWorkSheet;

// Check if a cell is empty before reading
if (!ws["A1"].IsEmpty)
{
    Console.WriteLine(ws["A1"].StringValue);
}

// Provide a fallback value using a null-coalescing pattern
字符串 cellText = ws["A1"].StringValue ?? "Default Value";

// Iterate a range and skip empty cells
foreach (var cell in ws["A1:A20"])
{
    if (!cell.IsEmpty)
    {
        Console.WriteLine(cell.Text);
    }
}
using IronXL;

WorkBook workbook = WorkBook.Load("data.xlsx");
WorkSheet ws = workbook.DefaultWorkSheet;

// Check if a cell is empty before reading
if (!ws["A1"].IsEmpty)
{
    Console.WriteLine(ws["A1"].StringValue);
}

// Provide a fallback value using a null-coalescing pattern
字符串 cellText = ws["A1"].StringValue ?? "Default Value";

// Iterate a range and skip empty cells
foreach (var cell in ws["A1:A20"])
{
    if (!cell.IsEmpty)
    {
        Console.WriteLine(cell.Text);
    }
}
$vbLabelText   $csharpLabel

读取 Excel 文件文档涵盖了处理稀疏数据的其他模式,包括如何检测工作表中最后使用的行和列。

处理空单元格时还需要考虑真正的空白单元格和包含空字符串的单元格之间的区别。 IsEmpty 仅当单元格完全不包含任何值时才返回 true,而 StringValue 对于空白单元格和显式设置为 "" 的单元格都返回空字符串。 如果您的数据中有格式为文本但显示为空的单元格,请同时检查 IsEmpty字符串.IsNullOrWhiteSpace(cell.StringValue) 以获得最准确的结果。

如何构建一个可用于生产环境的 Excel 读取器?

一个真正实用的 Excel 阅读器需要具备文件验证、错误处理、多工作表支持和可选的输出生成功能。 以下示例在一个类中演示了所有这些模式:

using IronXL;
using System.IO;

// Validate and load the file
static List<字符串> CheckLowStock(字符串 filePath)
{
    var lowStockItems = new List<字符串>();

    if (!File.Exists(filePath))
    {
        Console.WriteLine($"File not found: {filePath}");
        return lowStockItems;
    }

    字符串 ext = Path.GetExtension(filePath).ToLower();
    if (ext is not (".xlsx" or ".xls" or ".csv"))
    {
        Console.WriteLine($"Unsupported file type: {ext}");
        return lowStockItems;
    }

    try
    {
        WorkBook workbook = WorkBook.Load(filePath);

        foreach (WorkSheet sheet in workbook.WorkSheets)
        {
            Console.WriteLine($"Checking sheet: {sheet.Name}");

            for (int row = 2; row <= sheet.RowCount; row++)
            {
                字符串 itemName  = sheet[$"A{row}"].StringValue;
                int stockLevel   = sheet[$"B{row}"].IntValue;

                if (stockLevel < 10 && !字符串.IsNullOrEmpty(itemName))
                {
                    lowStockItems.Add($"{itemName} -- {stockLevel} units ({sheet.Name})");
                }
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error reading Excel file: {ex.Message}");
    }

    return lowStockItems;
}

// Export results to a new workbook
static void ExportReport(List<字符串> items, 字符串 outputPath)
{
    WorkBook report     = WorkBook.Create();
    WorkSheet sheet     = report.CreateWorkSheet("Low Stock Report");

    sheet["A1"].Value   = "Item Description";
    sheet["B1"].Value   = "Source Sheet";

    sheet["A1:B1"].Style.Font.Bold        = true;
    sheet["A1:B1"].Style.BackgroundColor  = "#4472C4";
    sheet["A1:B1"].Style.Font.Color       = "#FFFFFF";

    int rowIndex = 2;
    foreach (字符串 item in items)
    {
        sheet[$"A{rowIndex}"].Value = item;
        rowIndex++;
    }

    report.SaveAs(outputPath);
    Console.WriteLine($"Report saved to: {outputPath}");
}

// Run
var lowStockItems = CheckLowStock("inventory.xlsx");
ExportReport(lowStockItems, "low-stock-report.xlsx");
using IronXL;
using System.IO;

// Validate and load the file
static List<字符串> CheckLowStock(字符串 filePath)
{
    var lowStockItems = new List<字符串>();

    if (!File.Exists(filePath))
    {
        Console.WriteLine($"File not found: {filePath}");
        return lowStockItems;
    }

    字符串 ext = Path.GetExtension(filePath).ToLower();
    if (ext is not (".xlsx" or ".xls" or ".csv"))
    {
        Console.WriteLine($"Unsupported file type: {ext}");
        return lowStockItems;
    }

    try
    {
        WorkBook workbook = WorkBook.Load(filePath);

        foreach (WorkSheet sheet in workbook.WorkSheets)
        {
            Console.WriteLine($"Checking sheet: {sheet.Name}");

            for (int row = 2; row <= sheet.RowCount; row++)
            {
                字符串 itemName  = sheet[$"A{row}"].StringValue;
                int stockLevel   = sheet[$"B{row}"].IntValue;

                if (stockLevel < 10 && !字符串.IsNullOrEmpty(itemName))
                {
                    lowStockItems.Add($"{itemName} -- {stockLevel} units ({sheet.Name})");
                }
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error reading Excel file: {ex.Message}");
    }

    return lowStockItems;
}

// Export results to a new workbook
static void ExportReport(List<字符串> items, 字符串 outputPath)
{
    WorkBook report     = WorkBook.Create();
    WorkSheet sheet     = report.CreateWorkSheet("Low Stock Report");

    sheet["A1"].Value   = "Item Description";
    sheet["B1"].Value   = "Source Sheet";

    sheet["A1:B1"].Style.Font.Bold        = true;
    sheet["A1:B1"].Style.BackgroundColor  = "#4472C4";
    sheet["A1:B1"].Style.Font.Color       = "#FFFFFF";

    int rowIndex = 2;
    foreach (字符串 item in items)
    {
        sheet[$"A{rowIndex}"].Value = item;
        rowIndex++;
    }

    report.SaveAs(outputPath);
    Console.WriteLine($"Report saved to: {outputPath}");
}

// Run
var lowStockItems = CheckLowStock("inventory.xlsx");
ExportReport(lowStockItems, "low-stock-report.xlsx");
$vbLabelText   $csharpLabel

本示例使用顶级语句,涵盖完整的工作流程:验证文件路径和扩展名、加载工作簿、遍历所有工作表、应用业务逻辑,并将结果写入新文件。有关写入和保存工作簿的更多信息,请参阅"写入 Excel 文件"指南"导出 Excel 文件"指南

请注意,ExportReport 方法会创建一个新的工作簿,而不是修改源文件。将源文件和输出文件分开是良好的审计跟踪实践,并且可以避免意外覆盖其他进程所依赖的数据。 如果需要将数据追加到现有工作簿中,请使用 WorkBook.Load() 加载它,向相应的工作表添加行,然后调用 SaveAs() 到新路径或就地覆盖。

如何高效处理大型Excel文件?

对于包含数千行的文件,聚合函数比手动循环性能更好,因为它们在内部运行,而无需将每个单元格物化为单独的对象:

using IronXL;

WorkBook workbook = WorkBook.Load("large-dataset.xlsx");
WorkSheet ws      = workbook.DefaultWorkSheet;

// Fast: aggregate functions operate on the range directly
decimal total   = ws["B2:B5000"].Sum();
decimal average = ws["B2:B5000"].Avg();
int count       = ws["B2:B5000"].Count();

Console.WriteLine($"Total: {total:C}, Average: {average:C}, Rows: {count}");

// Export the worksheet to a DataSet for LINQ or database operations
var dataSet = workbook.ToDataSet();
Console.WriteLine($"DataSet tables: {dataSet.Tables.Count}");
using IronXL;

WorkBook workbook = WorkBook.Load("large-dataset.xlsx");
WorkSheet ws      = workbook.DefaultWorkSheet;

// Fast: aggregate functions operate on the range directly
decimal total   = ws["B2:B5000"].Sum();
decimal average = ws["B2:B5000"].Avg();
int count       = ws["B2:B5000"].Count();

Console.WriteLine($"Total: {total:C}, Average: {average:C}, Rows: {count}");

// Export the worksheet to a DataSet for LINQ or database operations
var dataSet = workbook.ToDataSet();
Console.WriteLine($"DataSet tables: {dataSet.Tables.Count}");
$vbLabelText   $csharpLabel

当您需要在多个工作表上运行 LINQ 查询或将数据加载到关系数据库中时,转换为 DataSet 格式尤其有效。 每个工作表都成为 DataTable 内部的一个 DataSet,这使得与现有的数据访问代码进行交互变得简单。 请参阅Excel 转数据集指南了解完整详情。

如何获得许可证并部署到生产环境?

IronXL是一个商业库,提供免费试用版,允许在开发和测试期间使用全部功能。 对于生产环境部署,您需要有效的许可证密钥。 有关许可级别的详细信息,包括开发者、团队和企业选项,请参阅IronXL许可页面

要应用许可证密钥,请在调用任何IronXL函数之前设置它:

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

IronXL功能概述总结了所有功能,从读取和写入文件到创建图表、应用条件格式以及使用命名范围。 创建 Excel 文件指南合并单元格操作方法对于编写新的工作簿来说是很有用的起点。

对于有关 C# Excel 自动化的社区讨论和问题, Microsoft QA 论坛Stack Overflow都是很好的资源。 官方NuGet包页面提供版本历史记录和下载统计信息。

在 C# 中打开 Excel 文件有哪些关键要点?

IronXL完全消除了对 Microsoft Office 的依赖,使得在服务器、容器和云函数中处理 Excel 文件成为可能。 该 API 遵循一个简单的模式:加载工作簿,按名称或索引访问工作表,并使用类型化的访问器读取单元格。 聚合函数如 Avg()Max() 可以处理大型数据集,而无需手动迭代的开销。

该库支持 XLSX、XLS、CSV 和 TSV 格式,可在.NET 10 和所有最新的.NET版本上运行,并且具有跨平台性。 错误处理很简单,因为IronXL会抛出标准的.NET异常,您可以使用熟悉的 try/catch 模式捕获这些异常——无需解码 COM 互操作错误代码。 要了解所有可用选项,请从IronXL文档主页开始,或者尝试使用开放式工作簿操作指南进行分步参考。

立即开始IronXL免费试用,在您自己的项目中评估该库,无需任何承诺。

立即开始使用 IronXL。
green arrow pointer

常见问题解答

如何在VB.NET中打开Excel文件而不使用Microsoft Office?

通过使用IronXL库,可以在VB.NET中打开和读取Excel文件,无需Microsoft Office。IronXL提供了一种简单的方式来处理Excel文件,而不需要Microsoft Office或复杂的Interop方法。

使用IronXL进行VB.NET中的Excel处理有什么好处?

IronXL通过消除对Microsoft Office的需求和避免复杂的COM引用来简化VB.NET中的Excel处理。它确保在服务器和云平台等不同环境中的兼容性,并有助于防止版本冲突。

是否可以使用IronXL处理XLSX和XLS文件?

是的,IronXL支持处理XLSX和XLS文件格式,使您可以在VB.NET应用程序中打开、读取和操作这些Excel文件。

使用IronXL是否需要安装任何额外的软件?

使用VB.NET进行Excel文件处理不需要安装任何额外的软件。IronXL是一个独立的库,可以直接集成到您的VB.NET项目中。

IronXL可以在云环境中使用吗?

是的,IronXL被设计为可以在云环境中无缝工作,避免了传统Excel Interop方法在服务器或云平台上常常遇到的版本冲突问题。

IronXL如何处理Excel文件的兼容性?

IronXL通过支持多种Excel文件格式,例如XLSX和XLS,并提供强大的功能来操作和处理这些文件而不依赖于Microsoft Office,以确保兼容性。

IronXL与不同的VB.NET版本兼容吗?

IronXL与各种版本的VB.NET兼容,成为开发人员用于不同.NET框架版本的灵活解决方案。

在VB.NET中使用传统Interop方法处理Excel的常见挑战是什么?

传统的Interop方法通常需要Microsoft Office,涉及复杂的COM引用,尤其在服务器或云环境中容易导致版本冲突。IronXL通过提供更可靠和简单的方法解决了这些挑战。

可以使用IronXL对Excel文件进行处理,比如编辑或导出数据吗?

可以,IronXL不仅提供读取Excel文件的功能,还支持编辑和导出数据,成为VB.NET中Excel文件处理的全面工具。

在哪里可以找到使用IronXL的VB.NET工作代码示例?

在IronXL文档和教程中可以找到使用IronXL的VB.NET工作代码示例,这些教程提供了在不依赖Microsoft Office的情况下处理Excel文件的逐步指导。

Curtis Chau
技术作家

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

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

钢铁支援团队

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