跳至页脚内容
使用 IRONXL

ExcelDataReader 写 Excel 文件:为什么不能以及 IronXL 如何解决这个问题

许多开发人员在寻找用于在 C# 中处理 Excel 文件的轻量级解决方案时,都会选择 ExcelDataReader。 该库的名称听起来似乎能够完全操作 Excel 文件,但很快就出现了一个根本性的限制:ExcelDataReader 根本无法写入 Excel 文件。 本指南澄清了这一常见的误解,解释了其背后的架构原因,并展示了IronXL如何通过在单个、统一的.NET库中提供真正的双向 Excel 支持(读取和写入)来解决这个问题。

在本教程结束时,您将了解为什么 ExcelDataReader 在设计上是只读的,如何将现有的读取逻辑迁移到IronXL,以及如何构建完整的 Excel 工作流来创建工作簿、写入单元格值、应用公式、格式化数据和保存输出文件——所有这些都不需要对 Microsoft Office 的任何依赖。

ExcelDataReader能写入Excel工作簿数据吗?

ExcelDataReader 写入 Excel 文件:为什么它做不到以及IronXL如何解决这个问题:图 1 - ExcelDataReader

不。ExcelDataReader 是一个只读库,这是有意为之的限制。 官方的 ExcelDataReader GitHub存储库明确地将该项目描述为"用于读取 Microsoft Excel 文件的库"——公共接口中没有任何写入 API、保存方法和单元格值设置器。 您可以浏览ExcelDataReader NuGet包页面来验证这一点,该包的描述也强调了只读作用域。

ExcelDataReader 支持读取 XLS、XLSX 和 CSV 格式的文件,并且能够高效地完成这项工作。 该库公开了一种类似于.NET中的IDataReader 的流式、仅向前读取模式。 该架构非常适合快速提取大型数据集,但它与 Excel 写入所需的随机访问、可变模型从根本上来说是不兼容的。

以下代码展示了使用 ExcelDataReader 时遇到的上限:

using ExcelDataReader;
using System.Text;

// Register the encoding provider required for .NET 5+
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

using var stream = File.Open("source.xlsx", FileMode.Open, FileAccess.Read);
using var reader = ExcelReaderFactory.CreateReader(stream);

while (reader.Read())
{
    string cellValue = reader.GetString(0); // Read a cell value
    Console.WriteLine(cellValue);
    // There is no Write(), Save(), or SetCellValue() method here
}
using ExcelDataReader;
using System.Text;

// Register the encoding provider required for .NET 5+
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

using var stream = File.Open("source.xlsx", FileMode.Open, FileAccess.Read);
using var reader = ExcelReaderFactory.CreateReader(stream);

while (reader.Read())
{
    string cellValue = reader.GetString(0); // Read a cell value
    Console.WriteLine(cellValue);
    // There is no Write(), Save(), or SetCellValue() method here
}
$vbLabelText   $csharpLabel

调用 Read() 后,根本不存在等效的 Write()Save() 对应项。 当您的应用程序需要生成报告、更新电子表格单元格、将数据导出到 XLSX、应用公式或处理模板时,ExcelDataReader 会让您束手无策。

这不是程序错误。 这是经过深思熟虑后做出的范围决定。 ExcelDataReader 只做好一件事,仅此而已。 任何涉及将数据写回 Excel 的工作流程都需要完全不同的库。

IronXL如何解决写入问题?

ExcelDataReader 写入 Excel 文件:为什么它做不到以及IronXL如何解决这个问题:图 2 - IronXL

IronXL提供了一个统一的 API,用于读取、创建、修改和保存 Excel 文件,而无需安装任何 Microsoft Office。 该库将 Excel 工作簿视为完全可变的内存对象图。 您可以加载或创建工作簿,通过​​引用导航到任何单元格,设置值或公式,应用样式,然后调用 SaveAs() -- 工作流程,该工作流程反映了人类在 Excel 中实际操作的方式。

IronXL支持 XLSX、XLS、CSV、TSV 和 JSON 格式的输入和输出。 它可在.NET 10、 .NET Standard和.NET Framework上运行,因此同样适用于控制台应用程序、 ASP.NET Core Web API、桌面工具和后台处理服务。

如何安装IronXL?

使用以下任一命令从NuGet安装IronXL :

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

安装完成后,IronXL 命名空间即可使用。 不支持 COM 互操作,不支持 Office PIA,没有其他运行时组件。

如何创建和编写你的第一个Excel文件?

以下示例从头开始创建一个工作簿,写入标题行和数据行,并使用顶级语句保存输出:

using IronXL;

WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet sheet = workBook.CreateWorkSheet("Report");

// Write header row
sheet["A1"].Value = "Product";
sheet["B1"].Value = "Quantity";
sheet["C1"].Value = "Unit Price";

// Write a data row
sheet["A2"].Value = "Widget";
sheet["B2"].Value = 150;
sheet["C2"].Value = 9.99;

workBook.SaveAs("report.xlsx");
Console.WriteLine("Workbook saved.");
using IronXL;

WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet sheet = workBook.CreateWorkSheet("Report");

// Write header row
sheet["A1"].Value = "Product";
sheet["B1"].Value = "Quantity";
sheet["C1"].Value = "Unit Price";

// Write a data row
sheet["A2"].Value = "Widget";
sheet["B2"].Value = 150;
sheet["C2"].Value = 9.99;

workBook.SaveAs("report.xlsx");
Console.WriteLine("Workbook saved.");
$vbLabelText   $csharpLabel

这将取代 ExcelDataReader 留下的未完成的整个工作流程。 没有类包装器,也没有 static void Main() 仪式——只有顶级语句和一个保存的文件。

如何在单个IronXL工作流程中进行读写操作?

常见的需求是读取现有的 Excel 文件,转换其中的数据,并将结果写回文件。 ExcelDataReader 仅处理第一步,这意味着您需要引入第二个库——这是一种不必要的复杂化,会增加依赖项管理开销和潜在的版本冲突。

IronXL涵盖了整个流程。以下示例加载源文件,读取A列的值,对其进行转换,并将修改后的工作簿另存为新文件:

using IronXL;

WorkBook workBook = WorkBook.Load("source.xlsx");
WorkSheet sheet = workBook.DefaultWorkSheet;

// Read existing data
string originalValue = sheet["A1"].StringValue;
Console.WriteLine($"Original: {originalValue}");

// Modify existing data
sheet["A1"].Value = originalValue.ToUpper();

// Add new data alongside existing content
sheet["B1"].Value = DateTime.无w.ToString("yyyy-MM-dd");
sheet["C1"].Formula = "=LEN(A1)";

workBook.SaveAs("modified.xlsx");
Console.WriteLine("Modified workbook saved.");
using IronXL;

WorkBook workBook = WorkBook.Load("source.xlsx");
WorkSheet sheet = workBook.DefaultWorkSheet;

// Read existing data
string originalValue = sheet["A1"].StringValue;
Console.WriteLine($"Original: {originalValue}");

// Modify existing data
sheet["A1"].Value = originalValue.ToUpper();

// Add new data alongside existing content
sheet["B1"].Value = DateTime.无w.ToString("yyyy-MM-dd");
sheet["C1"].Formula = "=LEN(A1)";

workBook.SaveAs("modified.xlsx");
Console.WriteLine("Modified workbook saved.");
$vbLabelText   $csharpLabel

WorkBook.Load() 调用将文件作为可变对象读入内存。 然后,您可以使用 Excel 风格的引用来导航单元格、更新值、设置公式并保存——所有这些都可以在一个库和一个 API 模式中完成。

IronXL支持哪些高级写作功能?

除了简单的单元格赋值之外, IronXL还展现了商业应用程序通常需要的全部 Excel 功能。

如何应用公式和格式?

公式遵循标准的Excel语法。 样式设置采用流畅对象模型,该模型直接映射到 Excel 的格式设置选项:

using IronXL;
using IronXl.Styles;

WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet sheet = workBook.CreateWorkSheet("Analytics");

// Write labels
sheet["A1"].Value = "Revenue";
sheet["B1"].Value = "Cost";
sheet["C1"].Value = "Margin";

// Write data
sheet["A2"].Value = 50000;
sheet["B2"].Value = 32000;

// Write a calculated formula
sheet["C2"].Formula = "=A2-B2";

// Apply bold formatting to the header row
sheet["A1:C1"].Style.Font.Bold = true;

// Highlight the margin cell
sheet["C2"].Style.BackgroundColor = "#D4EDDA";
sheet["C2"].Style.Font.Bold = true;

workBook.SaveAs("analytics.xlsx");
using IronXL;
using IronXl.Styles;

WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet sheet = workBook.CreateWorkSheet("Analytics");

// Write labels
sheet["A1"].Value = "Revenue";
sheet["B1"].Value = "Cost";
sheet["C1"].Value = "Margin";

// Write data
sheet["A2"].Value = 50000;
sheet["B2"].Value = 32000;

// Write a calculated formula
sheet["C2"].Formula = "=A2-B2";

// Apply bold formatting to the header row
sheet["A1:C1"].Style.Font.Bold = true;

// Highlight the margin cell
sheet["C2"].Style.BackgroundColor = "#D4EDDA";
sheet["C2"].Style.Font.Bold = true;

workBook.SaveAs("analytics.xlsx");
$vbLabelText   $csharpLabel

公式支持文档涵盖算术、逻辑、日期时间、字符串和统计函数。 单元格格式指南解释了数字格式、日期格式和自定义格式字符串。

如何将CSV数据导出到Excel?

IronXL可以直接将 CSV 文件转换为 XLSX 文件,允许您添加标题、应用格式并以下游用户期望的结构化格式保存:

using IronXL;

// Load a CSV file as if it were a workbook
WorkBook csvWorkBook = WorkBook.LoadCSV("data.csv", fileFormat: ExcelFileFormat.CSV);
WorkSheet csvSheet = csvWorkBook.DefaultWorkSheet;

// Apply a bold header style to the first row
csvSheet["A1:Z1"].Style.Font.Bold = true;

// Save as XLSX
csvWorkBook.SaveAs("converted.xlsx");
Console.WriteLine("CSV converted to XLSX.");
using IronXL;

// Load a CSV file as if it were a workbook
WorkBook csvWorkBook = WorkBook.LoadCSV("data.csv", fileFormat: ExcelFileFormat.CSV);
WorkSheet csvSheet = csvWorkBook.DefaultWorkSheet;

// Apply a bold header style to the first row
csvSheet["A1:Z1"].Style.Font.Bold = true;

// Save as XLSX
csvWorkBook.SaveAs("converted.xlsx");
Console.WriteLine("CSV converted to XLSX.");
$vbLabelText   $csharpLabel

这个单一的工作流程取代了原本需要使用 ExcelDataReader 进行读取,以及使用单独的写入库进行输出的多库管道。

如何对ExcelDataReader和IronXL进行对比?

下表总结了这两个库在最常见的 Excel 开发场景中的功能差异:

功能对比:ExcelDataReader 与IronXL
能力 ExcelDataReader IronXL
读取 XLSX / XLS
读取 CSV 文件
写入/创建 XLSX
写出公式
应用单元格样式
条件格式
创建图表
导出为 CSV / TSV
办公依赖性
兼容.NET 10

当仅需读取数据且二进制文件大小很重要时,ExcelDataReader 仍然是一个合理的选择。 对于任何涉及输出的场景, IronXL都是合适的工具。

何时应该使用IronXL?

当您的应用程序需要生成或修改 Excel 文件时, IronXL就是您的理想选择。 以下场景代表了 ExcelDataReader 无法满足的实际业务需求:

-报表生成:根据数据库查询、API 响应或内存计算生成 Excel 报表。 请参阅Excel 报表创建指南,获取结构化的操作步骤。 -数据导出:将应用程序数据(集合、数据表或数据集)转换为 XLSX 以便下载或存档。 "DataTable to Excel"教程展示了具体的API。 -模板处理:加载带有占位符单元格的 XLSX 模板,动态填充它们,然后保存填充后的结果。 -批量文件修改:遍历工作簿目录,以IronXL方式应用更改并保存每个文件。IronXL 可以独立处理多个打开的工作簿。 -发票和财务文档生成:使用公式、数字格式、合并单元格和样式标题构建结构化文档。

  • CSV 到 XLSX 转换:接受逗号分隔的上传文件,将其重新格式化为结构化工作簿,并将 XLSX 下载返回给用户。

以前需要读取库和写入库,或者依赖通过 COM 实现 Excel 自动化的业务应用程序,现在可以合并为一个IronXL 。

对于高级输出场景,条件格式文档图表创建指南涵盖了所有格式设置和可视化功能。 许可页面概述了生产部署选项,完整的 API 参考文档包含了每个类和方法。

如何开始免费试用?

IronXL采用免费开发许可协议。 安装NuGet包,针对您自己的文件运行上述示例,并在购买生产许可证之前验证输出是否满足您的要求。

IronXL入门指南通过可运行代码,逐步讲解安装、首次使用模式和常见场景。 教程部分详细介绍了读取工作流程,如果您的应用程序需要读取和写入操作,这将非常有用。

立即开始免费试用,即可体验全部功能,包括导出格式、高级格式设置、公式计算和多工作表工作簿管理。 对于大规模评估该库的团队, IronSuite 套装包含IronXL以及IronPDF、 IronOCR和其他生产力库,组合价格更低。

ExcelDataReader现在还值得使用吗?

ExcelDataReader 是一个维护良好的开源库,具有明确的用途。 如果您的应用程序仅读取 Excel 文件而不写入文件(例如,将 XLSX 上传文件导入数据库的数据导入管道),那么 ExcelDataReader 是一个合理且轻量级的选择。它的流式模型对于非常大的文件来说非常节省内存。

当需求增加时,问题就出现了。 最初作为只读导入器的应用程序通常会发展成为生成确认导出、错误报告或原始文件修改副本的工具。 此时,ExcelDataReader 的作用域边界就成了阻碍,在项目进行过程中迁移到读写库比一开始就使用读写库更具破坏性。

从一开始就选择IronXL可以涵盖这两种情况。 IronXL读取教程表明,使用IronXL读取数据同样简单直接——单元格引用、范围迭代、数据集导出和类型安全的值访问都通过同一个熟悉的 API 进行操作。

接下来你应该怎么做?

ExcelDataReader 是一个只读库。 这种限制是人为设定的,不会改变。 如果您的项目需要以任何形式编写、修改或导出 Excel 文件,则需要一个为双向 Excel 访问而构建的库。

IronXL提供了这种功能,无需 Office 依赖项,无需 COM 互操作复杂性,也无需将多个软件包组合成脆弱的多库堆栈。 从NuGet安装,将现有的读取代码替换为 IronXL 的等效方法,并在需要的地方添加写入操作——API 在两个方向上都是一致的。

请查阅IronXL文档,以了解该库的全部功能。 查看有关编写 Excel 文件创建电子表格读取现有工作簿等具体任务的操作指南。 当您准备评估生产许可时, "定价和许可"页面会列出所有可用的级别。

常见问题解答

ExcelDataReader 可以写入 Excel 文件吗?

不,ExcelDataReader 不能写入 Excel 文件。它专门用于读取 Excel 数据。

使用 ExcelDataReader 有什么局限性?

ExcelDataReader 的一个重大局限性在于它无法写入 Excel 文件,尽管它的名称暗示它具有完整的 Excel 功能。

如何克服 ExcelDataReader 的写入限制?

您可以使用 IronXL 来克服此限制,IronXL 允许在 C# 中读取和写入 Excel 文件。

IronXL 提供了哪些 ExcelDataReader 没有的功能?

IronXL 提供全面的 Excel 文件处理功能,包括读取和写入,而 ExcelDataReader 则不具备这些功能。

IronXL 是 C# 中处理 Excel 文件的一个好替代方案吗?

是的,IronXL 是一个很好的替代方案,因为它提供了在 C# 中读取和写入 Excel 文件的完整功能。

为什么开发人员会选择 IronXL 而不是 ExcelDataReader?

开发人员可能会选择 IronXL 而不是 ExcelDataReader,因为它能够无缝地处理 Excel 文档的读取和写入。

使用 IronXL 操作 Excel 文件有什么好处?

IronXL 具备读取和写入 Excel 文件的完整功能,使其成为比 ExcelDataReader 更通用、更全面的解决方案。

IronXL 如何处理 Excel 文件写入?

IronXL 提供简单直接的 Excel 文件编写方法,使开发人员能够轻松高效地完成工作。

IronXL 能否同时处理 Excel 文件的读写操作?

是的,IronXL 旨在用 C# 高效地处理 Excel 文件的读取和写入。

使用 ExcelDataReader 之前我应该了解哪些内容?

在使用 ExcelDataReader 之前,请注意它仅支持读取 Excel 文件,不具备写入功能。

Curtis Chau
技术作家

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

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

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me