跳至页脚内容
使用 IRONXL

如何在 C# 中导入、读取及操作 Excel 数据

StreamReader无法读取 Excel 文件,因为 XLSX/XLS 格式是复杂的二进制或压缩 XML 结构,而不是纯文本。 请改用IronXL 库,该库提供WorkBook.Load()用于文件读取,以及WorkBook () 用于内存流处理FromStream且不依赖于 Excel Interop。

许多 C# 开发人员在尝试读取 Excel 表格文件时都会遇到一个常见的挑战:他们信赖的StreamReader可以完美地处理文本文件,但却无法处理Excel 文档,这令人费解。 如果你尝试使用 C# 中的StreamReader读取 Excel 文件,却只看到乱码或异常,那么你并不孤单。 本教程解释了为什么StreamReader不能直接处理 Excel 文件,并演示了在不使用 Excel Interop 的情况下使用 IronXL 的正确解决方案。

这种混淆通常是因为 Excel 可以打开的CSV 文件也能用StreamReader打开。 然而,真正的 Excel 文件(XLSX、XLS)需要采用完全不同的方法。 理解这一区别将为您节省数小时的调试时间,并引导您找到完成这项工作的正确工具。 对于在Docker 容器Kubernetes 环境中部署应用程序的DevOps工程师来说,这一点尤为重要,因为原生依赖项可能会使容器化变得复杂。

IronXL for .NET 主页展示了无需 Microsoft Office 互操作即可读取 Excel 文件的 C# 代码示例,并介绍了库功能和下载统计信息。

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

StreamReader专为纯文本文件设计,使用指定的编码逐行读取字符数据。 Excel 文件虽然看起来像电子表格,但实际上是StreamReader无法解释的复杂二进制或 ZIP 压缩 XML 结构。 现代的XLSX 文件遵循 Office Open XML 标准,而较旧的XLS 文件使用专有的二进制格式。

static void Main(string[] args)
{
 // This code will NOT work - demonstrates the problem
 using (StreamReader reader = new StreamReader("ProductData.xlsx"))
 {
    string content = reader.ReadLine(); // Attempts to read Excel as text
    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(); // Attempts to read Excel as text
    Console.WriteLine(content); // Outputs garbled binary data
 }
}
$vbLabelText   $csharpLabel

运行此代码片段时,您将看到的不是电子表格数据,而是二进制数据,例如"PK♥♦"或类似字符。 这是因为 XLSX 文件是包含多个 XML 文件的 ZIP 压缩文件,而 XLS 文件使用专有的二进制格式。 StreamReader期望的是纯文本,并尝试将这些复杂的结构解释为字符,从而导致输出毫无意义。 对于容器化应用程序,尝试使用原生 Excel 库或 COM 互操作将需要在容器中安装 Microsoft Office,这将大大增加镜像大小和复杂性。

StreamReader尝试处理 Excel 文件时会发生什么?

下面的示例展示了一个典型的 Excel 文件,其中包含我们要处理的产品数据。 请注意,在 Excel 中查看时,结构化的电子表格数据看起来多么清晰有序:

! Excel 表格显示了一个产品数据表,其中 A 列到 D 列分别代表产品名称(笔记本电脑、鼠标、键盘、显示器、耳机)、价格以及 TRUE/FALSE 值。

为什么输出结果显示乱码?

StreamReader尝试处理此 Excel 文件时,控制台输出揭示了根本问题。 由于文件结构无法被解释为文本,因此您看到的不是可读数据,而是二进制内容:

Visual Studio 调试控制台显示程序成功执行,退出代码为 0,并提示按任意键关闭窗口。

现代 Excel 文件 (XLSX) 包含多个组件:工作表、样式、共享字符串和关系,所有这些都打包在一起。 这种复杂性需要能够理解Excel 文件结构的专用库,这就引出了 IronXL。 该库在内部处理了所有这些复杂性,同时提供了一个简单的 API,使其成为无法进行人工干预的自动化部署管道的理想选择。

如何使用 IronXL 读取 Excel 文件?

IronXL为使用 C# 读取 Excel 文件提供了一个简单的解决方案。 与StreamReader不同,IronXL 了解 Excel 的内部结构,并提供直观的方法来访问您的数据。 该库支持Windows、Linux、macOSDocker 容器,使其成为现代跨平台应用程序的理想选择。 对于DevOps团队而言,IronXL 的零依赖架构意味着在部署期间无需管理任何本地库或 COM 组件。

跨平台支持图展示了 .NET 在各种版本、操作系统、开发环境和云平台(包括 Windows、Linux、macOS、Docker、Azure 和 AWS)上的兼容性

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

Install-Package IronXL.Excel

终端输出显示已通过 Visual Studio 中的包管理器控制台成功安装 IronXL.Excel 包及其依赖项

以下是正确读取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}");
}
$vbLabelText   $csharpLabel

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

对于容器化部署,您可以轻松添加运行状况检查端点,以验证 Excel 处理能力:

// Health check endpoint for containerized apps
public async Task<IActionResult> HealthCheck()
{
    try
    {
        // Test Excel functionality
        using var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var sheet = workbook.CreateWorkSheet("HealthCheck");
        sheet["A1"].Value = DateTime.UtcNow;

        // Convert to byte array for validation
        var bytes = workbook.ToByteArray();
        return Ok(new { 
            status = "healthy", 
            excelSupport = true,
            timestamp = DateTime.UtcNow 
        });
    }
    catch (Exception ex)
    {
        return StatusCode(503, new { 
            status = "unhealthy", 
            error = ex.Message 
        });
    }
}
// Health check endpoint for containerized apps
public async Task<IActionResult> HealthCheck()
{
    try
    {
        // Test Excel functionality
        using var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var sheet = workbook.CreateWorkSheet("HealthCheck");
        sheet["A1"].Value = DateTime.UtcNow;

        // Convert to byte array for validation
        var bytes = workbook.ToByteArray();
        return Ok(new { 
            status = "healthy", 
            excelSupport = true,
            timestamp = DateTime.UtcNow 
        });
    }
    catch (Exception ex)
    {
        return StatusCode(503, new { 
            status = "unhealthy", 
            error = ex.Message 
        });
    }
}
$vbLabelText   $csharpLabel

如何从内存流中读取Excel?

实际应用中经常需要处理来自数据流而不是磁盘文件的 Excel 文件。 常见场景包括处理网络上传、从数据库中检索文件或处理来自云存储(如AWS S3Azure Blob Storage)的数据。 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 DataTable
    var dataTable = worksheet.ToDataTable(false);
    // Display 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 DataTable
    var dataTable = worksheet.ToDataTable(false);
    // Display DataTable row count 
    Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows");
}
$vbLabelText   $csharpLabel

WorkBook方法接受任何流类型, MemoryStream FromStream FileStream还是网络流。 这种灵活性使您无需先将 Excel 文件保存到磁盘即可处理来自各种来源的文件。该示例还演示了如何将工作表数据转换为 DataTable ,DataTable 可以与数据库和数据绑定场景无缝集成。 对于微服务架构而言,这种基于流的方法可以最大限度地减少磁盘 I/O 并提高性能。

内存流处理会产生哪些结果?

Visual Studio 调试控制台显示读取 Excel 数据时的输出,显示"工作表有 5 行"和"已加载 5 行数据"。

在Excel读取场景中,何时应该使用对象发送器?

在事件驱动编程中使用此代码的情况下(例如,在 Windows Forms 或ASP.NET中处理文件上传按钮),方法签名通常包含诸如 object sender 和EventArgs之类的参数。 此上下文可确保 Excel 处理逻辑与 UI 或服务事件正确关联。 对于容器化 API,您可以直接从 HTTP 请求处理上传:

[HttpPost("upload")]
public async Task<IActionResult> ProcessExcelUpload(IFormFile file)
{
    if (file == null || file.Length == 0)
        return BadRequest("No file uploaded");

    using var stream = new MemoryStream();
    await file.CopyToAsync(stream);
    stream.Position = 0;

    var workbook = WorkBook.FromStream(stream);
    var worksheet = workbook.DefaultWorkSheet;

    // Process and return results
    var data = worksheet.ToDataSet();
    return Ok(new { 
        sheets = workbook.WorkSheets.Count,
        rows = worksheet.RowCount,
        processed = DateTime.UtcNow
    });
}
[HttpPost("upload")]
public async Task<IActionResult> ProcessExcelUpload(IFormFile file)
{
    if (file == null || file.Length == 0)
        return BadRequest("No file uploaded");

    using var stream = new MemoryStream();
    await file.CopyToAsync(stream);
    stream.Position = 0;

    var workbook = WorkBook.FromStream(stream);
    var worksheet = workbook.DefaultWorkSheet;

    // Process and return results
    var data = worksheet.ToDataSet();
    return Ok(new { 
        sheets = workbook.WorkSheets.Count,
        rows = worksheet.RowCount,
        processed = DateTime.UtcNow
    });
}
$vbLabelText   $csharpLabel

本概述介绍了一个用于 C# 的 Excel 操作库,主要包含六大类功能:创建、保存和导出、编辑工作簿、处理数据、保护工作簿,以及每类功能下的详细列表。

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

虽然StreamReader可以处理 CSV 文件,但您经常需要在 Excel 和 CSV 格式之间进行转换。 IronXL 使这种转换变得非常简单,这对于DevOps工作流程中常见的 ETL 管道和数据集成场景尤其有用:

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

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

对于自动化数据管道,您还可以导出为 JSONXML 格式

// Export Excel to multiple formats for data pipelines
var workbook = WorkBook.Load("report.xlsx");

// Export to JSON for API responses
string jsonData = workbook.ToJson();

// Export to HTML for web display
workbook.SaveAsHtml("report.html");

// Export to XML for integration systems
workbook.SaveAsXml("report.xml");

// Export specific range to DataTable for database insertion
var dataTable = workbook.DefaultWorkSheet["A1:D10"].ToDataTable();
// Export Excel to multiple formats for data pipelines
var workbook = WorkBook.Load("report.xlsx");

// Export to JSON for API responses
string jsonData = workbook.ToJson();

// Export to HTML for web display
workbook.SaveAsHtml("report.html");

// Export to XML for integration systems
workbook.SaveAsXml("report.xml");

// Export specific range to DataTable for database insertion
var dataTable = workbook.DefaultWorkSheet["A1:D10"].ToDataTable();
$vbLabelText   $csharpLabel

容器部署最佳实践

对于部署 Excel 处理应用程序的DevOps工程师来说,IronXL 具有以下几个优势。 以下是一个针对 Excel 处理优化的生产就绪型 Dockerfile:

FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

# Install any required system fonts for Excel rendering
RUN apt-get update && apt-get install -y \
    fontconfig \
    libfreetype6 \
    && rm -rf /var/lib/apt/lists/*

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["YourApp.csproj", "."]
RUN dotnet restore
COPY . .
RUN dotnet build -c Release -o /app/build

FROM build AS publish
RUN dotnet publish -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .

# Set environment variables for IronXL
ENV IRONXL_LICENSE_KEY=${IRONXL_LICENSE_KEY}
ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false

ENTRYPOINT ["dotnet", "YourApp.dll"]

此 Dockerfile 可确保您的 Excel 处理应用程序在容器中流畅运行,并最大限度地减少依赖项。 许可通过环境变量进行管理,因此可以轻松地在不同的部署环境中进行管理。

C#中Excel处理的下一步是什么?

StreamReader无法处理 Excel 文件,其根本原因在于纯文本与 Excel 复杂的文件结构之间存在根本差异。 虽然StreamReader可以完美地处理 CSV 和其他文本格式,但真正的 Excel 文件需要像 IronXL 这样能够理解其中二进制和 XML 结构的专用库。

IronXL 提供全面的解决方案,其直观的 API、广泛的格式支持和无缝的流处理功能。 无论您是构建Web 应用程序、桌面软件还是云服务,IronXL 都能在所有平台上可靠地处理 Excel 文件。 该库支持条件格式图表公式高级 Excel 功能,使其成为企业应用程序的完整解决方案。

对于DevOps团队而言,IronXL 的容器友好型架构、最小的系统依赖性和可靠的性能特点使其成为现代云原生应用程序的理想选择。 该库支持水平扩展,可在Kubernetes pod中无缝运行,并能很好地与 CI/CD 管道集成。

IronXL 许可页面显示四个定价级别(Lite、Plus、Professional 和 Unlimited),并提供 IronXL 和 Iron Suite 选项之间的切换,永久许可价格从 749 美元到 3,999 美元不等

准备好开始正确使用Excel文件了吗? 下载最符合您项目需求的 IronXL 免费试用版。 该库提供灵活的许可选项,包括开发、测试和生产部署,以及容器化环境和云原生应用程序的选项。

常见问题解答

为什么StreamReader不能直接在C#中处理Excel文件?

StreamReader是为文本文件设计的,不支持Excel文件的二进制格式,这就是为什么您使用它读取Excel文档时可能会遇到乱码或异常的原因。相反,建议使用像IronXL这样的库来正确处理Excel文件。

在C#中导入Excel数据的推荐方法是什么?

在C#中导入Excel数据的推荐方法是使用IronXL。它允许开发人员无须Excel Interop即可读取和操作Excel文件,提供了更直接和高效的解决方案。

我可以在C#中不使用Excel Interop操作Excel文件吗?

是的,您可以通过使用IronXL来在C#中操作Excel文件,而无需Excel Interop。它提供了一种在您的C#应用程序中直接处理Excel文档的无缝方式。

使用IronXL处理Excel文件的好处是什么?

IronXL提供了多种好处,包括无需Microsoft Excel即可读写Excel文件,支持多种Excel格式,并且具有简化数据操作任务的强大API。

IronXL是否支持读取具有复杂数据类型的Excel文件?

是的,IronXL支持读取具有复杂数据类型的Excel文件,使您能够在C#应用程序中高效地处理多样的数据结构。

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

IronXL通过提供一个易于使用的接口来简化处理Excel文件的过程,消除了对Excel Interop的需求,减少了代码的复杂性,并提高了性能。

使用IronXL是否可以以不同格式读写Excel文件?

是的,IronXL支持多种Excel文件格式,如XLSX、XLS、CSV等,使您能够轻松地以各种格式读写文件。

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

IronXL旨在高效处理大型Excel文件,提供强大的性能并在文件操作期间最大限度地减少内存使用。

是什么让IronXL成为C#开发人员处理Excel文件的合适选择?

IronXL是C#开发人员的合适选择,因为它提供了一整套用于轻松读取、写入和操作Excel文件的功能,无需Microsoft Excel或复杂的Interop依赖。

Curtis Chau
技术作家

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

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