如何在 C# 中讀取帶有逗號的 CSV 文件
為什麼 .NET 開發者需要更好的 CSV 解決方案?
CSV 檔案在無數 .NET 應用程式中推動了資料交換。 從財務報表到庫存系統,您只需幾行程式碼即可程式化地建立 CSV 檔案。 雖然像CsvHelper這樣的程式庫涵蓋了基本的 CSV 操作,現代開發者面臨著複雜的情境:轉換帶公式的 Excel 活頁簿,保留匯出期間的資料型別,處理企業級試算表工作流程。 IronXL通過結合強大的 CSV 寫入和全面的Excel 功能來解決這些挑戰,在單一程式庫中輕鬆管理多欄位,無需依賴其他程式庫,遵循RFC 4180 標準。
這使得它對於構建自定義 .NET CSV writer 或支持多欄位的 .NET CSV parser 且具備僅影響處理中的列的功能行,並且能自動推斷分隔符的開發人員非常理想。
開始使用 IronXL
安裝 IronXL 只需透過 NuGet Package Manager 點擊幾下即可完成:
安裝完成後,新增 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 為輸出緩衝區的陣列分配進行處理。 之前提到的 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 輸出中資料的準確性。 但這不僅僅是唯一的一個功能。 預設自動推斷的分隔符確保了跨區域的相容性,多行或多列能夠無縫處理。
您還可以在預設支持的分隔符各有不同的動態環境中使用可空的 sep。
輸出
首先,在這裡您可以看到從我們的多表 Excel 檔案生成的 CSV 檔案:

這是一個 Excel 表格與相應 CSV 檔案的範例比較:

將資料表(Datatable)匯出為 CSV
對於資料庫驅動的應用程式,IronXL 簡化了DataTable 匯出。 我們將 var 設置為 Datarow,而不是典型的引用 var 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 |
不需 Microsoft Office | ✓ | ✓ |
雖然 CsvHelper 高效地處理了簡單的撰寫欄位操作,IronXL 提供了在多行、插值字串和動態程式碼生成場景中工作的靈活性,甚至允許使用 ref 結構連結等結構進行低層次優化。
開發人員可以枚舉符合特定標準的行,管理預設自動推斷的分隔符,甚至使用簡單的控制台程式進行測試,這些程式揭示了行特定功能,並僅顯示每個條目的鍵以便於除錯。
企業級功能與最佳實踐
IronXL 的 SaveAsCsv 方法包括企業級功能:
- 自定義分隔符:支持逗號、分號、製表符或任何字元(可以用分隔符 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擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。
