
C# CSV 读取器和写入器:使用IronXL创建、导出和转换 CSV 文件
CSV 文件(以逗号分隔的值存储的纯文本格式)仍然是应用程序、数据库和报表系统之间进行数据交换的最通用格式之一。 无论是导出用户列表、生成财务报告,还是准备数据以导入分析平台,使用 C# 以编程方式创建和读取 CSV 文件的能力对于现代.NET开发至关重要。 开发者常常在使用简单的StreamWriter来开始生成CSV,但随着数据复杂性的增加,这些手动方法很快就容易出错。
一些开发人员会使用 CSV Helper 库来进行基本的读/写操作,但与IronXL等以电子表格为先的方法相比,这些工具仍然需要手动映射和行级处理。 本指南演示如何使用IronXL (一个强大的.NET库,无需安装 Microsoft Excel 即可简化电子表格操作)将数据写入 CSV 文件、将现有 Excel 工作簿转换为 CSV 格式以及将对象导出为逗号分隔值。 IronXL可在 Windows、macOS、Linux 和 Docker、Azure 等容器化环境中运行,使其成为云原生应用程序和微服务架构的理想选择。
什么是 CSV 格式?它为什么重要?
逗号分隔值 (CSV) 文件是在不同应用程序之间存储和交换表格数据最广泛使用的格式之一。 CSV 文件最简单的形式是一个纯文本文件,每一行都包含一系列用逗号分隔的值。 这种简单明了的结构使 CSV 数据易于在各种软件系统中生成、读取和处理。
CSV 格式既轻便又易于阅读,因此是导出报告、在数据库之间传输数据以及与分析工具集成的常用选择。 CSV 文件中的每一行代表一条记录,该行中的每个值都用逗号分隔。 文件的第一行通常作为标题,列出每一列的名称。 随后的每一行都包含实际数据,每个值对应标题中的一列。
了解 CSV 文件的结构有助于您更好地选择分隔符、字符转义和编码——所有这些因素都会影响下游系统能否可靠地解析您的输出。 CSV 文件格式由 RFC 4180 定义,该 RFC 4180 提供了处理特殊情况的指导,例如嵌入的逗号、字段中的换行符和带引号的字符串值。
如何在.NET项目中安装IronXL ?
通过NuGet(微软的.NET包管理器),只需几秒钟即可将IronXL添加到新项目中。 打开 Visual Studio,然后访问 NuGet 包管理器控制台并运行以下命令:

或者,右键单击解决方案资源管理器中的项目,选择 "管理 NuGet 包",在浏览选项卡中搜索 "IronXL",然后单击安装。 IronXL支持.NET Framework 4.6.2+、. .NET Core、 .NET 5/6/7/8/10 ,并且可以在任何平台上运行,无需外部依赖项或 COM 互操作要求。
一旦安装,使用using语句将IronXL命名空间添加到代码文件中:
using IronXL;Imports IronXL该单一命名空间可访问电子表格创建和 CSV 导出操作所需的所有类。 与依赖于StringBuilder手动写入CSV文件的方法不同,IronXL自动处理所有复杂的CSV格式,包括转义特殊字符、保留数据类型以及在导出前评估公式。
IronXL文档涵盖了完整的 API 接口,包括单元格样式、公式计算、密码保护和图表生成等高级功能。 为了方便快速参考, IronXL示例库提供了可直接运行的代码示例,涵盖了数十种常见的电子表格场景。
IronXL支持哪些平台?
IronXL可在任何支持.NET 的平台上运行。 这包括 Windows 桌面和服务器环境、macOS 开发机器以及包括 Docker 容器在内的 Linux 服务器。 对于在 Azure 或 AWS 上构建云原生应用程序的团队来说, IronXL无需任何额外配置即可运行。 该库不需要 COM 互操作、不需要安装 Microsoft Office,也不需要外部系统依赖项——因此可以通过标准包管理工作流程轻松部署和更新。
如何从头开始创建一个新的 CSV 文件?
以编程方式创建新的 CSV 文件涉及三个步骤:创建工作簿、填充数据并将其保存为 CSV 格式。 IronXL 的 API 模仿了熟悉的 Excel 对象模型,使开发人员能够轻松地编写在控制台应用程序或任何.NET项目类型中使用电子表格概念的代码。
假设您需要将员工记录列表导出为 CSV 文件。以下是一个使用顶级语句的完整示例:
using IronXL;
// Create a new workbook and worksheet
WorkBook workBook = WorkBook.Create();
WorkSheet sheet = workBook.CreateWorkSheet("Employees");
// Add header row with column names
sheet["A1"].Value = "EmployeeID";
sheet["B1"].Value = "Name";
sheet["C1"].Value = "Department";
sheet["D1"].Value = "Salary";
// Add employee data rows
sheet["A2"].Value = 1001;
sheet["B2"].Value = "Sarah Johnson";
sheet["C2"].Value = "Engineering";
sheet["D2"].Value = 85000;
sheet["A3"].Value = 1002;
sheet["B3"].Value = "Michael Chen";
sheet["C3"].Value = "Marketing";
sheet["D3"].Value = 72000;
sheet["A4"].Value = 1003;
sheet["B4"].Value = "Emily Rodriguez";
sheet["C4"].Value = "Finance";
sheet["D4"].Value = 91000;
// Save as CSV file
workBook.SaveAsCsv("employees.csv", ",");Imports IronXL
' Create a new workbook and worksheet
Dim workBook As WorkBook = WorkBook.Create()
Dim sheet As WorkSheet = workBook.CreateWorkSheet("Employees")
' Add header row with column names
sheet("A1").Value = "EmployeeID"
sheet("B1").Value = "Name"
sheet("C1").Value = "Department"
sheet("D1").Value = "Salary"
' Add employee data rows
sheet("A2").Value = 1001
sheet("B2").Value = "Sarah Johnson"
sheet("C2").Value = "Engineering"
sheet("D2").Value = 85000
sheet("A3").Value = 1002
sheet("B3").Value = "Michael Chen"
sheet("C3").Value = "Marketing"
sheet("D3").Value = 72000
sheet("A4").Value = 1003
sheet("B4").Value = "Emily Rodriguez"
sheet("C4").Value = "Finance"
sheet("D4").Value = 91000
' Save as CSV file
workBook.SaveAsCsv("employees.csv", ",")WorkBook.Create()方法在内存中初始一个全新的电子表格,不需要临时文件或磁盘输入/输出,直到最终保存操作。 CreateWorkSheet()方法向工作簿添加一个命名工作表——此名称在将多工作表工作簿导出为CSV时变得相关。
输出

像sheet["A1"]这样的单元格引用直接提供了一种给特定单元格分配值的方式。 IronXL 接受各种数据类型,包括字符串、整数、小数、日期和布尔值,可自动处理每种类型的适当格式。 对于更复杂的数据输入场景,请查阅IronXL系列操作指南,了解批量单元格分配技术。
SaveAsCsv() 方法将工作表内容导出到文件。第一个参数指定输出文件名和路径,第二个参数定义分隔符。 IronXL 会自动处理适当的格式,包括转义特殊字符,否则可能会破坏 CSV 解析,并在整个导出过程中保持数据的完整性。
如何将对象列表导出为 CSV 文件?
当处理强类型对象时,可以使用foreach循环来迭代集合并将每个项目写入工作表。 以下是使用具有公共字符串属性的Student类的示例:
using IronXL;
// Define the Student class with public string properties
public class Student
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
}
// Create sample data
var students = new List<Student>
{
new Student { FirstName = "John", LastName = "Smith", Email = "john@example.com" },
new Student { FirstName = "Jane", LastName = "Doe", Email = "jane@example.com" }
};
WorkBook workBook = WorkBook.Create();
WorkSheet sheet = workBook.DefaultWorkSheet;
// Add header row
sheet["A1"].Value = "FirstName";
sheet["B1"].Value = "LastName";
sheet["C1"].Value = "Email";
// Use foreach to iterate through the list and write each item
int row = 2;
foreach (var item in students)
{
sheet[$"A{row}"].Value = item.FirstName;
sheet[$"B{row}"].Value = item.LastName;
sheet[$"C{row}"].Value = item.Email;
row++;
}
workBook.SaveAsCsv("students.csv", ",");Imports IronXL
' Define the Student class with public string properties
Public Class Student
Public Property FirstName As String
Public Property LastName As String
Public Property Email As String
End Class
' Create sample data
Dim students As New List(Of Student) From {
New Student With {.FirstName = "John", .LastName = "Smith", .Email = "john@example.com"},
New Student With {.FirstName = "Jane", .LastName = "Doe", .Email = "jane@example.com"}
}
Dim workBook As WorkBook = WorkBook.Create()
Dim sheet As WorkSheet = workBook.DefaultWorkSheet
' Add header row
sheet("A1").Value = "FirstName"
sheet("B1").Value = "LastName"
sheet("C1").Value = "Email"
' Use For Each to iterate through the list and write each item
Dim row As Integer = 2
For Each item In students
sheet($"A{row}").Value = item.FirstName
sheet($"B{row}").Value = item.LastName
sheet($"C{row}").Value = item.Email
row += 1
Next
workBook.SaveAsCsv("students.csv", ",")该模式演示了如何通过迭代每个项目并将其属性映射到特定列,将列表对象导出为 CSV 数据。 foreach循环处理集合中的每个学生,字符串插值动态构建单元格引用。 对于涉及基于反射的属性映射或匿名类型的场景,可以通过迭代PropertyInfo对象类型的元数据来调整此方法。
如何将现有的 Excel 文件转换为 CSV 文件?
将 Excel 电子表格转换为 CSV 格式是与传统系统集成、为数据库导入准备数据或从人工创建的报告生成机器可读输出时的常见要求。 IronXL 在保持数据准确性的同时,以最少的代码完成了这一转换。
using IronXL;
// Load an existing Excel file
WorkBook workBook = WorkBook.Load("Monthly_Report_20251012.xlsx");
// Convert and save as CSV format
workBook.SaveAsCsv("Monthly_Report_20251012.csv");Imports IronXL
' Load an existing Excel file
Dim workBook As WorkBook = WorkBook.Load("Monthly_Report_20251012.xlsx")
' Convert and save as CSV format
workBook.SaveAsCsv("Monthly_Report_20251012.csv")Load()方法打开各种格式的Excel文件,包括XLSX、XLS、XLSM,甚至是现有的CSV或TSV文件。 这种灵活性意味着您可以构建标准化的导出管道,接受任何格式的输入文件。 请参阅IronXL文档,了解支持的 Excel 格式的完整列表。
输入

输出

IronXL 在转换过程中的一个突出功能是自动公式评估。 保存为 CSV 时,IronXL 会计算电子表格中存在的任何公式,并导出结果值而不是公式文本。 例如,包含=SUM(A1:A10)的单元格将被导出为计算的总数,确保CSV文件包含可供下游系统即时使用的有效数据。
多表导出如何工作?
在处理包含多个工作表的 Excel 工作簿时,IronXL.Excel 会自动为每个工作表创建单独的 CSV 文件。 这种功能对于财务报告、地区销售数据,或在单个主工作簿中每个部门或类别都有自己的工作表的任何情况下都特别有价值。
using IronXL;
// Load a multi-sheet workbook (e.g., annual sales by region)
WorkBook workBook = WorkBook.Load("annual_sales.xlsx");
// Export all sheets to CSV -- creates separate files for each sheet
workBook.SaveAsCsv("sales_export.csv");
// Output: sales_export.North.csv, sales_export.South.csv, sales_export.East.csv, etc.
// Or export a specific worksheet
WorkSheet northRegion = workBook.GetWorkSheet("North");
northRegion.SaveAsCsv("north_region_sales.csv");Imports IronXL
' Load a multi-sheet workbook (e.g., annual sales by region)
Dim workBook As WorkBook = WorkBook.Load("annual_sales.xlsx")
' Export all sheets to CSV -- creates separate files for each sheet
workBook.SaveAsCsv("sales_export.csv")
' Output: sales_export.North.csv, sales_export.South.csv, sales_export.East.csv, etc.
' Or export a specific worksheet
Dim northRegion As WorkSheet = workBook.GetWorkSheet("North")
northRegion.SaveAsCsv("north_region_sales.csv")命名约定将每个工作表的名称附加到基本文件名上,这样在处理或存档时就可以很容易地识别每个导出文件的来源。 对于仅需要特定工作表的目标导出,通过SaveAsCsv()在该表对象上。
请参阅IronXL文档,了解有关 Excel 格式转换的更多信息。
如何将数据表导出为 CSV 文件?
企业应用程序经常处理从数据库查询、API响应或内存数据处理中填充的DataTable对象。 IronXL for .NET 在这些 .NET 数据结构和文件导出之间架起了一座桥梁,提供了从应用程序内存到可共享 CSV 文件的可靠路径。 这种方法比手动使用StreamWriter写入CSV文件更可靠,因为IronXL自动处理字符转义、分隔符管理和编码。
using IronXL;
using System.Data;
// Create and populate a DataTable with columns
DataTable products = new DataTable();
products.Columns.Add("SKU", typeof(string));
products.Columns.Add("ProductName", typeof(string));
products.Columns.Add("Price", typeof(decimal));
products.Columns.Add("InStock", typeof(int));
// Add rows of data
products.Rows.Add("SKU-001", "Wireless Mouse", 29.99m, 150);
products.Rows.Add("SKU-002", "Mechanical Keyboard", 89.99m, 75);
products.Rows.Add("SKU-003", "USB-C Hub", 45.99m, 200);
// Create workbook and transfer DataTable contents
WorkBook workBook = WorkBook.Create();
WorkSheet sheet = workBook.DefaultWorkSheet;
// Add header row from column names
for (int col = 0; col < products.Columns.Count; col++)
{
sheet.SetCellValue(0, col, products.Columns[col].ColumnName);
}
// Add data rows using nested loops
for (int row = 0; row < products.Rows.Count; row++)
{
for (int col = 0; col < products.Columns.Count; col++)
{
sheet.SetCellValue(row + 1, col, products.Rows[row][col].ToString());
}
}
// Export to CSV
workBook.SaveAsCsv("product_inventory.csv", ",");Imports IronXL
Imports System.Data
' Create and populate a DataTable with columns
Dim products As New DataTable()
products.Columns.Add("SKU", GetType(String))
products.Columns.Add("ProductName", GetType(String))
products.Columns.Add("Price", GetType(Decimal))
products.Columns.Add("InStock", GetType(Integer))
' Add rows of data
products.Rows.Add("SKU-001", "Wireless Mouse", 29.99D, 150)
products.Rows.Add("SKU-002", "Mechanical Keyboard", 89.99D, 75)
products.Rows.Add("SKU-003", "USB-C Hub", 45.99D, 200)
' Create workbook and transfer DataTable contents
Dim workBook As WorkBook = WorkBook.Create()
Dim sheet As WorkSheet = workBook.DefaultWorkSheet
' Add header row from column names
For col As Integer = 0 To products.Columns.Count - 1
sheet.SetCellValue(0, col, products.Columns(col).ColumnName)
Next
' Add data rows using nested loops
For row As Integer = 0 To products.Rows.Count - 1
For col As Integer = 0 To products.Columns.Count - 1
sheet.SetCellValue(row + 1, col, products.Rows(row)(col).ToString())
Next
Next
' Export to CSV
workBook.SaveAsCsv("product_inventory.csv", ",")此模式遍历DataTable结构,首先传输列头,然后系统地填充每个数据行。 DefaultWorkSheet属性提供对新创建工作簿中第一个工作表的快速访问,省去了简单场景中显式创建工作表的需要。
输出

IronXL 在传输过程中会保留数据类型,确保数值保持精确,日期保留格式。 这种方法可以很好地扩展到任何大小的数据表,无论是包含来自简单查找查询的几十行数据,还是包含来自大型数据导出的数千条记录。 导出前如需对电子表格进行其他操作,请探索单元格格式设置选项和范围操作。
如何处理 CSV 文件中的自定义分隔符?
不同的系统和地区标准需要不同的分隔符。 虽然逗号是许多国家的标准分隔符,但在欧洲地区,逗号通常用作数值的小数分隔符,因此欧洲人更喜欢使用分号。 当源数据的字段值中包含逗号时,Tab-separated 文件 (TSV) 很受欢迎。 IronXL的SaveAsCsv()方法适应所有这些场景,无需额外的代码来处理每一行输出。
using IronXL;
WorkBook workBook = WorkBook.Load("data.xlsx");
// Standard comma delimiter (default format)
workBook.SaveAsCsv("output_comma.csv", ",");
// Semicolon delimiter (common in European systems)
workBook.SaveAsCsv("output_semicolon.csv", ";");
// Tab delimiter (TSV format)
workBook.SaveAsCsv("output_tab.tsv", "\t");
// Pipe delimiter (used in some data interchange formats)
workBook.SaveAsCsv("output_pipe.csv", "|");Imports IronXL
Dim workBook As WorkBook = WorkBook.Load("data.xlsx")
' Standard comma delimiter (default format)
workBook.SaveAsCsv("output_comma.csv", ",")
' Semicolon delimiter (common in European systems)
workBook.SaveAsCsv("output_semicolon.csv", ";")
' Tab delimiter (TSV format)
workBook.SaveAsCsv("output_tab.tsv", vbTab)
' Pipe delimiter (used in some data interchange formats)
workBook.SaveAsCsv("output_pipe.csv", "|")SaveAsCsv()的第二个参数接受任何字符串作为分隔符,提供了与多样系统及区域要求集成的完全灵活性。 在生成用于国际分发的文件时,请考虑目标系统的区域设置要求——欧洲金融系统通常要求使用分号分隔符,而北美系统通常默认使用逗号分隔符。 RFC 4180 CSV 标准描述了如何对包含分隔符的值进行引用,以防止解析错误。
在C#中生成CSV文件的最佳实践是什么?
在 C# 中处理 CSV 文件时,遵循既定做法可确保您的数据保持准确、可读,并与其他系统兼容。 下表总结了最重要的考虑因素:
| 实践 | 为何重要 | IronXL方法 |
|---|---|---|
| 一致的分隔符 | 防止下游系统中出现解析错误 | 将分隔符作为第二个参数传递给 SaveAsCsv() 函数。 |
| 报价特殊值 | 当数据中出现逗号时,保持字段完整性 | 由IronXL自动处理 |
| 统一的日期格式 | 避免不同地区和系统之间的歧义 | 保存前设置单元格格式以控制输出 |
| 值中避免换行符。 | 防止行结构损坏 | IronXL在导出过程中会转义嵌入的换行符 |
| 处理异常 | 确保文件流正确关闭。 | IronXL在内部处置资源 |
| 保存前请验证 | 在数据问题影响消费者之前就将其发现并解决。 | 导出前使用范围运算验证单元格值 |
除了基本要素之外,在面向国际受众时,还应考虑进行显式编码。 在 Microsoft Excel 中打开 CSV 文件时,通常需要使用带 BOM 的 UTF-8 编码才能正确显示非 ASCII 字符。 对于涉及数百万行的大量导出,请考虑将数据分块到多个文件中,而不是写入单个大型 CSV 文件——这样可以控制文件大小,并减少生成和使用期间的内存压力。
对于构建数据管道的团队来说, IronXL异步和流式处理文档涵盖了处理大型数据集的模式,而无需将整个工作簿加载到内存中。 IronXL示例库包含用于批量处理、计划导出作业以及与 Entity Framework 等流行 ORM 框架集成的其他模式。
在使用.NET生态系统的 CSV 处理工具时,了解IronXL相对于底层方法的定位,有助于您为每个场景选择合适的工具。 对于纯CSV生成而不涉及任何Excel,可能StreamWriter带手动报价逻辑就足够了。 对于任何涉及 Excel 格式兼容性、公式计算或丰富格式设置的操作, IronXL都能提供更可靠的基础。
如何使用IronXL读取现有的 CSV 文件?
将 CSV 数据读回应用程序与加载任何其他电子表格格式遵循相同的模式。 IronXL的Load()方法识别CSV文件并将其解析到标准的工作簿/工作表模型中,使您可以使用与Excel文件相同的API访问单个单元格和范围。
using IronXL;
// Load an existing CSV file
WorkBook workBook = WorkBook.Load("employees.csv");
WorkSheet sheet = workBook.DefaultWorkSheet;
// Access specific cells by reference
string firstHeader = sheet["A1"].StringValue;
// Iterate through all rows
foreach (var row in sheet.Rows)
{
foreach (var cell in row)
{
Console.Write(cell.StringValue + "\t");
}
Console.WriteLine();
}
// Access a range of cells
var nameColumn = sheet["B2:B100"];
foreach (var cell in nameColumn)
{
Console.WriteLine(cell.StringValue);
}Imports IronXL
' Load an existing CSV file
Dim workBook As WorkBook = WorkBook.Load("employees.csv")
Dim sheet As WorkSheet = workBook.DefaultWorkSheet
' Access specific cells by reference
Dim firstHeader As String = sheet("A1").StringValue
' Iterate through all rows
For Each row In sheet.Rows
For Each cell In row
Console.Write(cell.StringValue & vbTab)
Next
Console.WriteLine()
Next
' Access a range of cells
Dim nameColumn = sheet("B2:B100")
For Each cell In nameColumn
Console.WriteLine(cell.StringValue)
Next读取和写入操作的这种一致性意味着您的团队只需要学习一个 API 即可完成所有与电子表格相关的任务。 同样的WorkBook.Load()方法不仅可以打开CSV文件,还可以处理XLSX、XLS和XLSM格式,在构建可接受多种格式输入的管道时很实用。 请在文档中了解有关使用IronXL 读取CSV文件的更多信息。
下一步计划是什么?
本指南涵盖了使用IronXL在 C# 中创建和管理 CSV 文件的核心模式:
WorkBook.Create()用于在内存中初始化新电子表格WorkBook.Load()用于以任何支持的格式打开现有的Excel和CSV文件SaveAsCsv()用于使用可定制分隔符导出数据- 使用
GetWorkSheet()导出单个工作表以进行目标转换 DataTable迭代模式用于数据库到CSV的工作流- 使用
foreach循环导出对象列表 - 将 CSV 数据读回您的应用程序,并拥有完整的访问权限
要实践这些技巧,请开始IronXL免费试用,探索电子表格的全部功能,且测试时间无限制。 准备进行生产部署时,请查看IronXL许可选项,找到适合您团队规模和使用需求的方案。
有关单元格样式、公式创建、图表生成和密码保护等高级场景的更多示例,请浏览IronXL文档和完整的代码示例库。 IronXL教程系列介绍了更复杂的集成场景,包括数据表导出、格式转换和写入 CSV 文件。

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



