跳至页脚内容
使用 IRONXL

使用 Microsoft Office Interop Excel C# 读取 Excel 文件:以及一种无需 Office 即可更快创建 Excel 文件的方法

如果您曾经尝试使用 Microsoft Office Interop Excel C# 读取 Excel 文件,您一定知道其中的挫败感:版本不匹配、COM 对象泄漏,以及必须在运行代码的每台计算机上安装 Microsoft Office 的硬性要求。 在本文中,我们将带您了解传统的互操作方法,解释它的不足之处,然后展示IronXL如何让您轻松创建、读取和写入 Excel 文件,而无需担心这些问题。

立即开始使用 IronXL。
green arrow pointer

Interop 库如何创建 Excel 工作簿?

Microsoft.Office.Interop.Excel 命名空间公开了 Excel 内部使用的相同 COM 对象模型。 要通过此互操作库读取或创建 Excel 文件,首先需要实例化一个 Application 对象,将新工作簿添加到其 Workbooks 集合中,然后访问各个工作表单元格。 以下示例演示了一个使用 Microsoft.Office.Interop.Excel 创建 XLSX 文件并将值写入单元格的最小控制台应用程序。

using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
// Create the Excel Application COM object
Excel.Application excelApp = new Excel.Application();
if (excelApp == null)
{
    Console.WriteLine("Error: Excel is not properly installed.");
    return;
}
// Add a new workbook and access the default worksheet
Excel.Workbook xlWorkBook = excelApp.Workbooks.Add(Type.Missing);
Excel.Worksheet xlWorkSheet = (Excel.Worksheet)xlWorkBook.ActiveSheet;
// Write data into specific cells
xlWorkSheet.Cells[1, 1] = "Product";
xlWorkSheet.Cells[1, 2] = "Price";
xlWorkSheet.Cells[2, 1] = "Widget";
xlWorkSheet.Cells[2, 2] = "29.99";
// Save as an XLSX file and clean up COM objects
string filepath = @"C:\Reports\products.xlsx";
xlWorkBook.SaveAs(filepath);
xlWorkBook.Close(false);
excelApp.Quit();
// Release every COM object to prevent orphaned Excel processes
Marshal.ReleaseComObject(xlWorkSheet);
Marshal.ReleaseComObject(xlWorkBook);
Marshal.ReleaseComObject(excelApp);
using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
// Create the Excel Application COM object
Excel.Application excelApp = new Excel.Application();
if (excelApp == null)
{
    Console.WriteLine("Error: Excel is not properly installed.");
    return;
}
// Add a new workbook and access the default worksheet
Excel.Workbook xlWorkBook = excelApp.Workbooks.Add(Type.Missing);
Excel.Worksheet xlWorkSheet = (Excel.Worksheet)xlWorkBook.ActiveSheet;
// Write data into specific cells
xlWorkSheet.Cells[1, 1] = "Product";
xlWorkSheet.Cells[1, 2] = "Price";
xlWorkSheet.Cells[2, 1] = "Widget";
xlWorkSheet.Cells[2, 2] = "29.99";
// Save as an XLSX file and clean up COM objects
string filepath = @"C:\Reports\products.xlsx";
xlWorkBook.SaveAs(filepath);
xlWorkBook.Close(false);
excelApp.Quit();
// Release every COM object to prevent orphaned Excel processes
Marshal.ReleaseComObject(xlWorkSheet);
Marshal.ReleaseComObject(xlWorkBook);
Marshal.ReleaseComObject(excelApp);
Imports Excel = Microsoft.Office.Interop.Excel
Imports System.Runtime.InteropServices

' Create the Excel Application COM object
Dim excelApp As Excel.Application = New Excel.Application()
If excelApp Is Nothing Then
    Console.WriteLine("Error: Excel is not properly installed.")
    Return
End If

' Add a new workbook and access the default worksheet
Dim xlWorkBook As Excel.Workbook = excelApp.Workbooks.Add(Type.Missing)
Dim xlWorkSheet As Excel.Worksheet = CType(xlWorkBook.ActiveSheet, Excel.Worksheet)

' Write data into specific cells
xlWorkSheet.Cells(1, 1) = "Product"
xlWorkSheet.Cells(1, 2) = "Price"
xlWorkSheet.Cells(2, 1) = "Widget"
xlWorkSheet.Cells(2, 2) = "29.99"

' Save as an XLSX file and clean up COM objects
Dim filepath As String = "C:\Reports\products.xlsx"
xlWorkBook.SaveAs(filepath)
xlWorkBook.Close(False)
excelApp.Quit()

' Release every COM object to prevent orphaned Excel processes
Marshal.ReleaseComObject(xlWorkSheet)
Marshal.ReleaseComObject(xlWorkBook)
Marshal.ReleaseComObject(excelApp)
$vbLabelText   $csharpLabel

上述代码创建一个 Excel 工作簿,用行和单元格值填充工作表,保存文件,然后手动释放每个 COM 对象。 最后那个清理步骤不是可选项——跳过它,你会发现系统上存在占用内存的幽灵 EXCEL.EXE 进程。 还要注意,代码会检查 Application 对象是否为空; 如果未安装 Microsoft Office,则之后的每一行都会报错。 Office 互操作库的版本必须与计算机上的 Office 版本匹配,否则您将遇到 FileNotFoundException 和类似的运行时错误,这些错误出了名的难以调试。

Visual Basic 开发人员在使用 Excel Microsoft.Office.Interop.Excel 时会遇到同样的挑战,因为.NET语言的底层 COM 基础架构是相同的。

互操作方法在服务器和云端会造成哪些问题?

微软明确不建议在服务器环境中使用 Office Interop。 互操作库会在后台启动一个完整的 Excel 应用程序实例,这意味着对 Web 服务器或云应用程序的每个请求都会启动一个隐藏的 Windows 桌面进程。 在Linux服务器上,它完全无法工作。 当未安装 Office 或不同版本的 Microsoft Office 相互冲突时,数据库连接字符串、文件系统路径和用户权限都会成为额外的故障点。

开发者经常在Stack OverflowMicrosoft Q&A上发布关于这些问题的帖子,寻找在不安装 Excel 的情况下读取 Excel 文件和创建 Excel 文件的方法。 下表总结了主要区别。

| 特征 | Office Interop |IronXL| |---|---|---| | 需要安装 Excel | 是的——只有开发人员的机器和所有生产服务器。 | 否 | | 支持的 Excel 文件格式 | XLS、XLSX | XLS、XLSX、CSV、TSV、JSON、XML | | 跨平台(.NET Core、Linux、macOS) |仅限 Windows| Windows、Linux、macOS、Azure | | 需要清理 COM 对象 | 是的——手动 Marshal.ReleaseComObject | 否 | | 服务器/云部署 | 微软不推荐 |完全支持| | 表现 | 速度较慢——启动隐藏的 Excel 进程 | 更佳性能——托管的.NET代码 | | .NET Framework和.NET Core支持 | 仅限.NET Framework | .NET Framework、 .NET Core、 .NET 5-10 |

如何在未安装 Microsoft Office 的情况下创建 Excel 文件?

IronXL是一个.NET Excel 库,它完全使用托管代码读取、写入和创建 Excel 文件。 它不依赖于 Microsoft Office,无需发布 COM 对象,也无需调试版本冲突。 在 Visual Studio 中使用解决方案资源管理器通过NuGet安装IronXl.Excel,即可开始使用。 它在所有主流操作系统上的.NET Framework 4.6.2+、. .NET Core以及.NET 5 到.NET 10 中都能正常运行。

using IronXL;
// Create a new Excel workbook — default value is XLSX format
WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
// Add a worksheet and populate cells with data
WorkSheet workSheet = workBook.CreateWorkSheet("Sales");
workSheet["A1"].Value = "Product";
workSheet["B1"].Value = "Price";
workSheet["A2"].Value = "Widget";
workSheet["B2"].Value = 29.99;
// Apply basic formatting
workSheet["A1"].Style.Font.Bold = true;
workSheet["B1"].Style.Font.Bold = true;
// Save the XLSX file
workBook.SaveAs(@"C:\Reports\products.xlsx");
using IronXL;
// Create a new Excel workbook — default value is XLSX format
WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
// Add a worksheet and populate cells with data
WorkSheet workSheet = workBook.CreateWorkSheet("Sales");
workSheet["A1"].Value = "Product";
workSheet["B1"].Value = "Price";
workSheet["A2"].Value = "Widget";
workSheet["B2"].Value = 29.99;
// Apply basic formatting
workSheet["A1"].Style.Font.Bold = true;
workSheet["B1"].Style.Font.Bold = true;
// Save the XLSX file
workBook.SaveAs(@"C:\Reports\products.xlsx");
Imports IronXL

' Create a new Excel workbook — default value is XLSX format
Dim workBook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
' Add a worksheet and populate cells with data
Dim workSheet As WorkSheet = workBook.CreateWorkSheet("Sales")
workSheet("A1").Value = "Product"
workSheet("B1").Value = "Price"
workSheet("A2").Value = "Widget"
workSheet("B2").Value = 29.99
' Apply basic formatting
workSheet("A1").Style.Font.Bold = True
workSheet("B1").Style.Font.Bold = True
' Save the XLSX file
workBook.SaveAs("C:\Reports\products.xlsx")
$vbLabelText   $csharpLabel

使用IronXL创建的 Excel 文件

使用 Microsoft Office Interop Excel C# 读取 Excel 文件:以及无需 Office 即可更快创建 Excel 文件的方法:图 1 -IronXL输出文件

上述代码实现了与 Interop 示例相同的结果,但代码行数减少了一半,并且没有外部依赖项。 WorkBook.Create() 初始化一个指定Excel 文件格式(默认为 XLSX)的新工作簿,而 CreateWorkSheet 添加一个命名的工作表。 单元格值通过简洁的索引器语法设置,SaveAs 会自动处理文件扩展名。 没有 Quit(),没有 Marshal.ReleaseComObject,没有隐藏进程。 同一个 API 还支持通过一次方法调用保存为 XLS、CSV、JSON 或 XML 格式,有关所有可用选项,请参阅导出文档

IronXL还可以与 System.Data 对象无缝集成,因此从数据库连接字符串流经 DataTable 的数据可以直接写入工作表,而无需手动逐行迭代。

如何跨行和单元格读取和写入工作表数据?

读取现有的Excel文件同样简单。 WorkBook.Load 方法接受一个字符串类型的文件路径,指向任何 XLS、XLSX 或 CSV 文件。加载完成后,每个工作表都会将其行和单元格作为可迭代集合公开,从而可以轻松地读取数据、修改值或将结果上传到数据库或服务器端点。

using IronXL;
// Load an existing Excel file
WorkBook workBook = WorkBook.Load(@"C:\Reports\products.xlsx");
WorkSheet workSheet = workBook.DefaultWorkSheet;
// Read and display each row of data
foreach (var row in workSheet.Rows)
{
    foreach (var cell in row.ToArray())
    {
        Console.Write(cell.Value + "\t");
    }
    Console.WriteLine();
}
// Update a specific cell and save
workSheet["B2"].Value = 34.99;
workBook.SaveAs(@"C:\Reports\products_updated.xlsx");
using IronXL;
// Load an existing Excel file
WorkBook workBook = WorkBook.Load(@"C:\Reports\products.xlsx");
WorkSheet workSheet = workBook.DefaultWorkSheet;
// Read and display each row of data
foreach (var row in workSheet.Rows)
{
    foreach (var cell in row.ToArray())
    {
        Console.Write(cell.Value + "\t");
    }
    Console.WriteLine();
}
// Update a specific cell and save
workSheet["B2"].Value = 34.99;
workBook.SaveAs(@"C:\Reports\products_updated.xlsx");
Imports IronXL

' Load an existing Excel file
Dim workBook As WorkBook = WorkBook.Load("C:\Reports\products.xlsx")
Dim workSheet As WorkSheet = workBook.DefaultWorkSheet

' Read and display each row of data
For Each row In workSheet.Rows
    For Each cell In row.ToArray()
        Console.Write(cell.Value & vbTab)
    Next
    Console.WriteLine()
Next

' Update a specific cell and save
workSheet("B2").Value = 34.99
workBook.SaveAs("C:\Reports\products_updated.xlsx")
$vbLabelText   $csharpLabel

使用IronXL读取 Excel 文件

使用 Microsoft Office Interop Excel C# 读取 Excel 文件:以及无需 Office 即可更快创建 Excel 文件的方法:图 2 - 使用IronXL读取 Excel 文件输出

本示例展示了如何通过遍历 Rows 集合并访问每个单元格的 Value 属性来读取 Excel 文件。 嵌套循环模式——先使用 var row,再使用 var cell——反映了你自然而然地思考电子表格的方式。 读取数据后,代码会更新单个单元格并将工作簿保存到新的 XLSX 文件中,同时保留原始文件。 IronXL会在工作表被修改时自动重新计算所有 Excel 公式,互操作库也提供了此功能,但代价是需要启动一个完整的 Excel 实例。

对于公式、条件格式、合并单元格或处理多个工作表等更高级的场景, IronXL API 参考涵盖了所有可用的方法和属性。 该库还支持从ASP.NET控制器访问,因此可以轻松地从 Web 应用程序或 API 端点生成和下载 Excel 文件,而无需在服务器上安装 Office。

.NET Excel自动化的最佳发展路径是什么?

如果一个项目被锁定在已安装 Microsoft Office 且版本稳定的旧版 Windows 桌面环境中,那么互操作库可以很好地完成基本任务。 但对于其他所有情况,例如服务器部署、云应用程序、跨平台构建,或者任何需要更高性能和更少运行时错误的场景,独立的.NET Excel 库显然是最佳选择。

IronXL通过简洁现代的 API 处理所有常见的 Excel 操作(创建工作簿读取Excel 电子表格数据、写入单元格、保存为多种文件扩展名类型,包括 XLS 和 XLSX),该 API 可在任何.NET运行的地方运行。 它同时支持 C# 和 Visual Basic 项目,相同的代码无需修改即可在 Windows、Linux 和 macOS 上运行。

您可以开始 30 天免费试用,在自己的项目中进行测试,或者在准备部署时探索许可选项

常见问题解答

在 C# 中使用 Microsoft Office Interop Excel 有哪些局限性?

在 C# 中使用 Microsoft Office Interop Excel 可能会导致版本不匹配、COM 对象泄漏等问题,并且需要在运行代码的每台计算机上安装 Microsoft Office。

IronXL 如何改进 C# 中处理 Excel 文件的过程?

IronXL 允许您创建、读取和写入 Excel 文件,而无需 Microsoft Office,从而消除了版本不匹配和 COM 对象泄漏等问题。

IronXL 能否在未安装 Microsoft Office 的服务器上使用?

是的,IronXL 对服务器安全,并且不需要安装 Microsoft Office,因此它是一个用于处理 Excel 文件的跨平台解决方案。

使用 IronXL 比使用 Excel Interop 有什么好处?

IronXL 提供了一种更可靠、更高效的方式来处理 Excel 文件,因为它不依赖于 Microsoft Office,从而降低了版本不匹配和 COM 对象泄漏等常见问题的风险。

IronXL 是否兼容所有版本的 Excel 文件?

IronXL 支持多种 Excel 文件格式,包括 XLSX、XLS、CSV 和 TSV,使其能够灵活地处理各种 Excel 文件操作。

IronXL 在机器上运行是否需要任何特殊设置?

IronXL 不需要安装 Microsoft Office,无需特殊设置即可轻松集成到您的 C# 项目中。

IronXL 能高效处理大型 Excel 文件吗?

是的,IronXL 的设计初衷就是为了高效地读取和写入大型 Excel 文件,提供快速的性能,而不受 Interop 的限制。

IronXL 支持哪些平台?

IronXL 是跨平台的,支持 Windows、Linux 和 MacOS,这使得它成为在不同环境下处理 Excel 文件的一种灵活选择。

IronXL 如何处理 Excel 文件创建?

IronXL 提供了一个简单的 API,可以使用 C# 以编程方式创建 Excel 文件,并提供格式化单元格、管理工作表等功能。

IronXL用户是否有社区或支持?

是的,IronXL 用户可以访问文档、教程和社区支持,以帮助解决任何集成或使用问题。

Curtis Chau
技术作家

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

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

钢铁支援团队

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