跳至页脚内容
USING IRONXL

在 C# 中使用 StreamReader 读取 Excel 文件的替代方法 - IronXL.Excel

许多C#开发人员在尝试读取Excel工作表文件时遇到一个常见的挑战:他们信赖的StreamReader对文本文件效果极佳,但在Excel文档上却神秘地失效。 如果您曾尝试在C#中使用StreamReader读取Excel文件,结果却看到乱码或异常,您不是一个人。 本教程解释了为什么StreamReader不能直接处理Excel文件,并演示了使用IronXL不需要Excel Interop的正确解决方案。

困惑经常源于CSV文件,Excel可以打开,而StreamReader能够正常工作。 然而,真正的 Excel 文件(XLSX、XLS)需要采用完全不同的方法。 理解这一区别将为您节省数小时的调试时间,并引导您找到完成这项工作的正确工具。

使用StreamReader在C#中读取Excel文件的替代方案 - IronXL:图片1 - IronXL

为什么 StreamReader 无法读取 Excel 文件?

StreamReader是为纯文本文件设计的,逐行读取字符数据使用指定编码。 尽管Excel文件呈现出电子表格外观,但实际上是复杂的二进制或ZIP压缩的XML结构,StreamReader不能解释。

static void Main(string[] args)
{
    // This code will NOT work - demonstrates the problem
    using (StreamReader reader = new StreamReader("ProductData.xlsx"))
    {
        string content = reader.ReadLine(); // read data
        Console.WriteLine(content); // Outputs garbled binary data
    }
}
static void Main(string[] args)
{
    // This code will NOT work - demonstrates the problem
    using (StreamReader reader = new StreamReader("ProductData.xlsx"))
    {
        string content = reader.ReadLine(); // read data
        Console.WriteLine(content); // Outputs garbled binary data
    }
}
Option Strict On



Imports System.IO

Module Program
    Sub Main(args As String())
        ' This code will NOT work - demonstrates the problem
        Using reader As New StreamReader("ProductData.xlsx")
            Dim content As String = reader.ReadLine() ' read data
            Console.WriteLine(content) ' Outputs garbled binary data
        End Using
    End Sub
End Module
$vbLabelText   $csharpLabel

当您运行此类程序代码片段时,您将不会看到电子表格数据,而是会遇到二进制未知数据,例如"PK♥♦"或类似的系统字符。 这是因为 XLSX 文件是包含多个 XML 文件的 ZIP 压缩文件,而 XLS 文件使用专有的二进制格式。 StreamReader期望纯文本并尝试将这些复杂结构解释为字符,结果是无意义的输出。

示例输入

使用StreamReader在C#中读取Excel文件的替代方案 - IronXL:图片2 - Excel输入

输出

使用StreamReader在C#中读取Excel文件的替代方案 - IronXL:图片3 - 控制台输出

现代 Excel 文件 (XLSX) 包含多个组件:工作表、样式、共享字符串和关系,所有这些都打包在一起。 这种复杂性需要能够理解 Excel 文件结构的专用库,这就引出了 IronXL。

如何使用 IronXL 读取 Excel 文件?

IronXL为使用 C# 读取 Excel 文件提供了一个简单的解决方案。 与StreamReader不同,IronXL了解Excel的内部结构,并提供直观的方法来访问您的数据。 该库支持 Windows、Linux、macOS 和 Docker 容器,使其成为现代跨平台应用程序的理想选择。

使用StreamReader在C#中读取Excel文件的替代方案 - IronXL:图片4 - 跨平台

首先,通过 NuGet 包管理器安装 IronXL:

Install-Package IronXL.Excel

使用StreamReader在C#中读取Excel文件的替代方案 - IronXL:图片5 - 安装

以下是正确读取Excel文件的方法:

using IronXL;
// Load the Excel file
WorkBook workbook = WorkBook.Load("sample.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;
// Read specific cell values
string cellValue = worksheet["A1"].StringValue;
Console.WriteLine($"Cell A1 contains: {cellValue}");
// Read a range of cells
foreach (var cell in worksheet["A1:C5"])
{
    Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}
using IronXL;
// Load the Excel file
WorkBook workbook = WorkBook.Load("sample.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;
// Read specific cell values
string cellValue = worksheet["A1"].StringValue;
Console.WriteLine($"Cell A1 contains: {cellValue}");
// Read a range of cells
foreach (var cell in worksheet["A1:C5"])
{
    Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}
Imports IronXL

' Load the Excel file
Dim workbook As WorkBook = WorkBook.Load("sample.xlsx")
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
' Read specific cell values
Dim cellValue As String = worksheet("A1").StringValue
Console.WriteLine($"Cell A1 contains: {cellValue}")
' Read a range of cells
For Each cell In worksheet("A1:C5")
    Console.WriteLine($"{cell.AddressString}: {cell.Text}")
Next
$vbLabelText   $csharpLabel

这段代码可以成功加载您的 Excel 文件,并提供对单元格值的直接访问。 WorkBook.Load 方法自动检测文件格式(XLSX, XLS, XLSM, CSV),并在内部处理所有复杂的解析。 您可以使用熟悉的 Excel 表示法(例如"A1")或范围(例如"A1:C5")来访问单元格,这使得熟悉 Excel 的人能够直观地理解代码。

如何从内存流中读取Excel?

实际应用中经常需要处理来自数据流而不是磁盘文件的 Excel 文件。 常见场景包括处理网页上传、从数据库检索文件或处理来自云存储的数据。 IronXL能够优雅地处理这些情况:

using IronXL;
using System.IO;
// Read Excel from a memory stream
byte[] fileBytes = File.ReadAllBytes("ProductData.xlsx");
using (MemoryStream stream = new MemoryStream(fileBytes))
{
    WorkBook workbook = WorkBook.FromStream(stream);
    WorkSheet worksheet = workbook.DefaultWorkSheet;
    // Process the data
    int rowCount = worksheet.RowCount;
    Console.WriteLine($"The worksheet has {rowCount} rows");
    // Read all data into a new DataTable, return dt
    var dataTable = worksheet.ToDataTable(false);
    // Return DataTable row count
    Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows");
}
using IronXL;
using System.IO;
// Read Excel from a memory stream
byte[] fileBytes = File.ReadAllBytes("ProductData.xlsx");
using (MemoryStream stream = new MemoryStream(fileBytes))
{
    WorkBook workbook = WorkBook.FromStream(stream);
    WorkSheet worksheet = workbook.DefaultWorkSheet;
    // Process the data
    int rowCount = worksheet.RowCount;
    Console.WriteLine($"The worksheet has {rowCount} rows");
    // Read all data into a new DataTable, return dt
    var dataTable = worksheet.ToDataTable(false);
    // Return DataTable row count
    Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows");
}
Imports IronXL
Imports System.IO

' Read Excel from a memory stream
Dim fileBytes As Byte() = File.ReadAllBytes("ProductData.xlsx")
Using stream As New MemoryStream(fileBytes)
    Dim workbook As WorkBook = WorkBook.FromStream(stream)
    Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
    ' Process the data
    Dim rowCount As Integer = worksheet.RowCount
    Console.WriteLine($"The worksheet has {rowCount} rows")
    ' Read all data into a new DataTable, return dt
    Dim dataTable = worksheet.ToDataTable(False)
    ' Return DataTable row count
    Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows")
End Using
$vbLabelText   $csharpLabel

WorkBook.FromStream 方法接受任何流类型,无论是FileStream或网络流。 这种灵活性使您无需先将 Excel 文件保存到磁盘即可处理来自各种来源的文件。该示例还演示了如何将工作表数据转换为 DataTable,DataTable 可以与数据库和数据绑定场景无缝集成。

输出

使用StreamReader在C#中读取Excel文件的替代方案 - IronXL:图片6 - 从MemoryStream输出读取Excel

何时使用对象发送器读取数据?

在事件驱动编程中使用该代码的情况下(例如,处理Windows Forms或ASP.NET中的文件上传按钮),一个方法签名通常包括参数,如EventArgs e。 此上下文可确保 Excel 处理逻辑与 UI 或服务事件正确关联。

使用StreamReader在C#中读取Excel文件的替代方案 - IronXL:图片7 - 特性

如何在Excel和CSV之间进行转换?

虽然StreamReader能够处理CSV文件,但您通常需要在Excel和CSV格式之间进行转换。 IronXL 使这种转换变得非常简单:

using IronXL;
// Load an Excel file and save as CSV
WorkBook workbook = WorkBook.Load("data.xlsx");
workbook.SaveAsCsv("output.csv");
// Load a CSV file and save as Excel
WorkBook csvWorkbook = WorkBook.LoadCSV("input.csv");
csvWorkbook.SaveAs("output.xlsx");
// Export specific worksheet to CSV
WorkSheet worksheet = workbook.WorkSheets[0];
worksheet.SaveAsCsv("worksheet1.csv");
using IronXL;
// Load an Excel file and save as CSV
WorkBook workbook = WorkBook.Load("data.xlsx");
workbook.SaveAsCsv("output.csv");
// Load a CSV file and save as Excel
WorkBook csvWorkbook = WorkBook.LoadCSV("input.csv");
csvWorkbook.SaveAs("output.xlsx");
// Export specific worksheet to CSV
WorkSheet worksheet = workbook.WorkSheets[0];
worksheet.SaveAsCsv("worksheet1.csv");
Imports IronXL

' Load an Excel file and save as CSV
Dim workbook As WorkBook = WorkBook.Load("data.xlsx")
workbook.SaveAsCsv("output.csv")

' Load a CSV file and save as Excel
Dim csvWorkbook As WorkBook = WorkBook.LoadCSV("input.csv")
csvWorkbook.SaveAs("output.xlsx")

' Export specific worksheet to CSV
Dim worksheet As WorkSheet = workbook.WorkSheets(0)
worksheet.SaveAsCsv("worksheet1.csv")
$vbLabelText   $csharpLabel

这些转换操作会在更改文件格式的同时保留您的数据。 将 Excel 转换为 CSV 时,IronXL 默认会将第一个工作表展平,但您可以指定要导出的工作表。 将 CSV 文件转换为 Excel 文件会生成格式正确的电子表格,该电子表格可以保留数据类型,并支持将来进行格式设置和添加公式。

结论

StreamReader无法处理Excel文件的原因在于纯文本和Excel复杂文件结构之间的基本差异。 虽然StreamReader对于CSV和其他文本格式工作完美,但真正的Excel文件需要一个像IronXL这样的专用库,理解其内部的二进制和XML结构。

IronXL 凭借其直观的 API、全面的格式支持和无缝的流处理功能,提供了一个优雅的解决方案。 无论您是构建 Web 应用程序、桌面软件还是云服务,IronXL 都能在所有平台上可靠地处理 Excel 文件。

使用StreamReader在C#中读取Excel文件的替代方案 - IronXL:图片8 - 许可

准备好开始正确使用Excel文件了吗? 下载 IronXL 的免费试用版,体验在 C# 应用程序中轻松处理 Excel 数据。 对于生产部署,请考虑最适合您项目需求的 IronXL 许可选项

常见问题解答

为什么不能使用 StreamReader 在 C# 中读取 Excel 文件?

StreamReader 专为读取文本文件而设计,不支持 Excel 文件的二进制格式,因此会出现乱码或异常。

用 C# 阅读 Excel 文件的推荐方法是什么?

在 C# 中读取 Excel 文件的推荐方法是使用 IronXL,它可以直接读取和处理 Excel 文件,而无需 Excel Interop。

与 StreamReader 相比,使用 IronXL 处理 Excel 文件有哪些优势?

IronXL.Excel 专为处理 Excel 文件格式而设计,可以准确读取和处理数据,支持公式、图表和格式化等各种功能。

using IronXL.Excel 是否需要 Excel Interop?

不,IronXL.Excel 可独立于 Excel Interop 运行,让您无需在机器上安装 Excel 即可处理 Excel 文件。

IronXL 可以处理不同的 Excel 文件格式吗?

是的,IronXL.Excel 支持多种 Excel 文件格式,包括 .xls、.xlsx 和 .csv,可灵活处理不同类型的 Excel 文档。

IronXL 适合大型 Excel 文件吗?

是的,IronXL经过性能优化,可以有效处理大型Excel文件,适用于处理大量数据的应用。

IronXL 与其他用于 Excel 操作的 C# 库相比如何?

IronXL 提供了用户友好的 API、对 Excel 功能的全面支持,而且不需要安装 Excel,因此与其他库相比是一个稳健的选择。

Curtis Chau
技术作家

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

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

钢铁支援团队

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