如何在 C# 中读取带逗号 CSV 文件
为什么 .NET 开发人员需要更好的 CSV 解决方案?
CSV 文件为无数 .NET 应用程序提供数据交换支持。 从财务报告到库存系统,您只需几行代码即可自由地以编程方式创建 CSV 文件。 虽然像CsvHelper这样的库涵盖了基本的 CSV 操作,但现代开发人员面临着复杂的场景:转换带有公式的 Excel 工作簿、在导出过程中保留数据类型以及处理企业级电子表格工作流程。 IronXL通过将精密的CSV写作与全面的Excel功能结合到一个单一且无依赖的库中解决这些挑战,该库遵循RFC 4180标准,可以轻松处理多个列。
这使其成为构建自定义 .NET CSV 写入器或 .NET CSV 解析器的开发人员的理想选择,这些写入器或解析器支持多列、仅影响正在处理的行的特定行功能以及自动推断分隔符。
IronXL入门指南
通过 NuGet 包管理器安装 IronXL 只需几秒钟:
安装完成后,添加 IronXL 命名空间即可开始高效地写入 CSV 文件和处理分隔值:
using IronXL;
class Program
{
static void Main(string[] args)
{
// Create a new workbook and worksheet
WorkBook workBook = WorkBook.Create();
WorkSheet workSheet = workBook.CreateWorkSheet("data");
// Add headers
workSheet["A1"].Value = "Product";
workSheet["B1"].Value = "Quantity";
workSheet["C1"].Value = "Price";
// Add data
workSheet["A2"].Value = "Widget";
workSheet["B2"].Value = 100;
workSheet["C2"].Value = 19.99;
// Save as CSV with comma delimiter
workBook.SaveAsCsv("inventory.csv", ",");
}
}Imports IronXL
Class Program
Shared Sub Main(args As String())
' Create a new workbook and worksheet
Dim workBook As WorkBook = WorkBook.Create()
Dim workSheet As WorkSheet = workBook.CreateWorkSheet("data")
' Add headers
workSheet("A1").Value = "Product"
workSheet("B1").Value = "Quantity"
workSheet("C1").Value = "Price"
' Add data
workSheet("A2").Value = "Widget"
workSheet("B2").Value = 100
workSheet("C2").Value = 19.99
' Save as CSV with comma delimiter
workBook.SaveAsCsv("inventory.csv", ",")
End Sub
End ClassImports IronXL
Class Program
Shared Sub Main(args As String())
' Create a new workbook and worksheet
Dim workBook As WorkBook = WorkBook.Create()
Dim workSheet As WorkSheet = workBook.CreateWorkSheet("data")
' Add headers
workSheet("A1").Value = "Product"
workSheet("B1").Value = "Quantity"
workSheet("C1").Value = "Price"
' Add data
workSheet("A2").Value = "Widget"
workSheet("B2").Value = 100
workSheet("C2").Value = 19.99
' Save as CSV with comma delimiter
workBook.SaveAsCsv("inventory.csv", ",")
End Sub
End Class这个简单的控制台测试程序演示了如何直接从 C# 代码写入 CSV 内容,创建一个包含我们数据的Workbook对象。 SaveAsCsv 方法使用默认分隔符(逗号),但允许您选择性地为不同的语言环境定义分隔符; 这在处理小数分隔符或交替列分隔符字符时尤其有用。 内部,sep 处理输出缓冲区的数组分配。 前面提到的 sep 参数允许您定义此字符。
我们还演示了如何提供静态入口点,并展示了如何使用静态定义的资源池进行高效的内存管理,从而实现跨多行的高性能。
高级 CSV 文件创建技巧

高级 CSV 文件创建技巧
将 Excel 工作簿转换为 CSV
IronXL 擅长将现有的Excel 文件转换为 CSV 文件,评估公式,并保持数据完整性。 当编写包含标题行和动态生成数据的 CSV 文件时,这一点至关重要。
// Load an Excel file with formulas and formatting
WorkBook workBook = WorkBook.Load("financial_report.xlsx");
// IronXL evaluates formulas before export
workBook.EvaluateAll();
// Export to CSV - each worksheet creates a separate CSV file
workBook.SaveAsCsv("report.csv", ",");
// Creates: report.Sheet1.csv, report.Sheet2.csv, etc.// Load an Excel file with formulas and formatting
WorkBook workBook = WorkBook.Load("financial_report.xlsx");
// IronXL evaluates formulas before export
workBook.EvaluateAll();
// Export to CSV - each worksheet creates a separate CSV file
workBook.SaveAsCsv("report.csv", ",");
// Creates: report.Sheet1.csv, report.Sheet2.csv, etc.' Load an Excel file with formulas and formatting
Dim workBook As WorkBook = WorkBook.Load("financial_report.xlsx")
' IronXL evaluates formulas before export
workBook.EvaluateAll()
' Export to CSV - each worksheet creates a separate CSV file
workBook.SaveAsCsv("report.csv", ",")
' Creates: report.Sheet1.csv, report.Sheet2.csv, etc.' Load an Excel file with formulas and formatting
Dim workBook As WorkBook = WorkBook.Load("financial_report.xlsx")
' IronXL evaluates formulas before export
workBook.EvaluateAll()
' Export to CSV - each worksheet creates a separate CSV file
workBook.SaveAsCsv("report.csv", ",")
' Creates: report.Sheet1.csv, report.Sheet2.csv, etc.转换多工作表工作簿时,IronXL 会自动为每个工作表生成单独的 CSV 文件。 公式计算在导出前执行,确保最终 CSV 输出的数据准确无误。 但这并非它唯一的特点。 默认的自动推断分隔符确保了跨区域的兼容性,并且可以无缝处理多行或多列。
对于默认支持的分隔符会变化的动态环境,您也可以使用可为空的分隔符。
输出
首先,您可以看到从我们的多表Excel文件生成的CSV文件:

以下是一个Excel表格与对应CSV文件的对比示例:

将数据表导出为 CSV
对于数据库驱动型应用程序,IronXL 简化了数据表导出流程。 为了更清楚地说明,我们将变量设置为 Datarow 而不是典型的引用变量 v。
// Assume dataTable contains query results
DataTable dataTable = GetSalesData();
WorkBook workBook = WorkBook.Create();
WorkSheet workSheet = workBook.CreateWorkSheet("sales");
// Import DataTable directly
var row = 1;
foreach (var dataRow in dataTable.Rows)
{
for (var col = 0; col < dataTable.Columns.Count; col++)
{
workSheet.SetCellValue(row, col, dataRow[col].ToString());
}
row++;
}
// Export with custom delimiter if needed
workBook.SaveAsCsv("sales_data.csv", ";");// Assume dataTable contains query results
DataTable dataTable = GetSalesData();
WorkBook workBook = WorkBook.Create();
WorkSheet workSheet = workBook.CreateWorkSheet("sales");
// Import DataTable directly
var row = 1;
foreach (var dataRow in dataTable.Rows)
{
for (var col = 0; col < dataTable.Columns.Count; col++)
{
workSheet.SetCellValue(row, col, dataRow[col].ToString());
}
row++;
}
// Export with custom delimiter if needed
workBook.SaveAsCsv("sales_data.csv", ";");Imports System.Data
' Assume dataTable contains query results
Dim dataTable As DataTable = GetSalesData()
Dim workBook As WorkBook = WorkBook.Create()
Dim workSheet As WorkSheet = workBook.CreateWorkSheet("sales")
' Import DataTable directly
Dim row As Integer = 1
For Each dataRow As DataRow In dataTable.Rows
For col As Integer = 0 To dataTable.Columns.Count - 1
workSheet.SetCellValue(row, col, dataRow(col).ToString())
Next
row += 1
Next
' Export with custom delimiter if needed
workBook.SaveAsCsv("sales_data.csv", ";")Imports System.Data
' Assume dataTable contains query results
Dim dataTable As DataTable = GetSalesData()
Dim workBook As WorkBook = WorkBook.Create()
Dim workSheet As WorkSheet = workBook.CreateWorkSheet("sales")
' Import DataTable directly
Dim row As Integer = 1
For Each dataRow As DataRow In dataTable.Rows
For col As Integer = 0 To dataTable.Columns.Count - 1
workSheet.SetCellValue(row, col, dataRow(col).ToString())
Next
row += 1
Next
' Export with custom delimiter if needed
workBook.SaveAsCsv("sales_data.csv", ";")导入时,dataTable.Rows 集合中的每一行水平数据都会成为工作表中的新行。 IronXL 在转换过程中保留数据类型,这意味着数字保持数值形式,日期保持格式,文本无需额外配置即可正确处理特殊字符。
输出
在这里,您可以看到我们的模拟数据源以及输出的 CSV 文件:

IronXL 与 CsvHelper:CSV 文件写入功能的并排比较
以下示例展示了员工数据导出场景,演示了 CSV 解析和写入工作流程。
CsvHelper 实现:
using (var writer = new StreamWriter("employees.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
csv.WriteRecords(employees);
}using (var writer = new StreamWriter("employees.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
csv.WriteRecords(employees);
}Imports System.Globalization
Imports System.IO
Imports CsvHelper
Using writer As New StreamWriter("employees.csv")
Using csv As New CsvWriter(writer, CultureInfo.InvariantCulture)
csv.WriteRecords(employees)
End Using
End UsingImports System.Globalization
Imports System.IO
Imports CsvHelper
Using writer As New StreamWriter("employees.csv")
Using csv As New CsvWriter(writer, CultureInfo.InvariantCulture)
csv.WriteRecords(employees)
End Using
End UsingIronXL实施:
WorkBook workBook = WorkBook.Create();
WorkSheet workSheet = workBook.CreateWorkSheet("employees");
// Add data with automatic type handling
int rowIndex = 1;
foreach (var emp in employees)
{
workSheet[$"A{rowIndex}"].Value = emp.Name;
workSheet[$"B{rowIndex}"].Value = emp.Salary;
workSheet[$"C{rowIndex}"].Value = emp.StartDate;
rowIndex++;
}
workBook.SaveAsCsv("employees.csv", ",");WorkBook workBook = WorkBook.Create();
WorkSheet workSheet = workBook.CreateWorkSheet("employees");
// Add data with automatic type handling
int rowIndex = 1;
foreach (var emp in employees)
{
workSheet[$"A{rowIndex}"].Value = emp.Name;
workSheet[$"B{rowIndex}"].Value = emp.Salary;
workSheet[$"C{rowIndex}"].Value = emp.StartDate;
rowIndex++;
}
workBook.SaveAsCsv("employees.csv", ",");Dim workBook As WorkBook = WorkBook.Create()
Dim workSheet As WorkSheet = workBook.CreateWorkSheet("employees")
' Add data with automatic type handling
Dim rowIndex As Integer = 1
For Each emp In employees
workSheet($"A{rowIndex}").Value = emp.Name
workSheet($"B{rowIndex}").Value = emp.Salary
workSheet($"C{rowIndex}").Value = emp.StartDate
rowIndex += 1
Next
workBook.SaveAsCsv("employees.csv", ",")Dim workBook As WorkBook = WorkBook.Create()
Dim workSheet As WorkSheet = workBook.CreateWorkSheet("employees")
' Add data with automatic type handling
Dim rowIndex As Integer = 1
For Each emp In employees
workSheet($"A{rowIndex}").Value = emp.Name
workSheet($"B{rowIndex}").Value = emp.Salary
workSheet($"C{rowIndex}").Value = emp.StartDate
rowIndex += 1
Next
workBook.SaveAsCsv("employees.csv", ",")特征 | CsvHelper | IronXL |
|---|---|---|
基本的 CSV 编写 | ✓ | ✓ |
Excel 转 CSV 转换 | ✗ | ✓ |
公式评估 | ✗ | ✓ |
多页处理 | ✗ | ✓ |
数据类型保留 | 手册 | 自动翻译 |
Excel 格式支持 | ✗ | XLSX、XLS、XLSM |
无需微软办公软件 | ✓ | ✓ |
虽然 CsvHelper 可以高效地处理简单的写入列操作,但 IronXL 提供了处理多行、插值字符串和动态代码生成场景的灵活性,甚至允许使用 ref struct link 等构造进行低级优化。
开发人员可以枚举符合特定条件的行,管理默认的自动推断分隔符,甚至可以使用简单的控制台程序进行测试,这些程序会公开特定于行的功能以及每个条目的键以进行调试。
企业功能和最佳实践
IronXL 的 SaveAsCsv 方法包含企业级功能:
- 自定义分隔符:支持逗号、分号、制表符或任何字符(可以使用 separator sep 覆盖默认分隔符)
- 编码选项:UTF-8、UTF-16 和自定义编码
- 公式评估:导出前计算 Excel 公式
- 跨平台支持:可在 Windows、Linux 和 macOS 上运行
开发人员还可以应用扩展方法来访问多列以进行高效处理,或者在需要文本换行时编写跨越多行的 CSV 行。
常见问题及解决方案
在使用 CSV 导出文件时,开发人员经常会遇到以下挑战:
- 数据中的特殊字符: IronXL自动转义引号、逗号和换行符
- 大文件处理: 使用工作表范围以分块处理数据,
- 编码问题: 指定UTF-8编码以支持国际字符
- 缺失的数据类型:IronXL 默认保留数字和日期格式
如需详细故障排除,请访问IronXL 的 CSV 文档、 API 参考和支持资源。
立即开始构建您的 CSV 写入器
IronXL 将 CSV 写入从解析难题变成了简单的操作。 它将 CSV 功能与 Excel 工作簿支持、公式计算和自动类型处理相结合,消除了管理多个库或手动数据转换的复杂性。
准备好简化您的 CSV 工作流程了吗? 免费试用,起价 $999。
Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。
