在實際環境中測試
在生產環境中測試無浮水印。
在任何需要的地方都能運作。
處理 CSV 文件可以是一項具有挑戰性的任務。今天有許多庫可以幫助開發人員完成這項任務,而無需安裝 Microsoft Excel。
在本文中,我們將討論和比較如何在 C# .NET 技術中以編程方式處理 Microsoft Excel 文件,無論是 CSV 格式還是標準的 XLSX 格式,使用兩個最受歡迎的庫,IronXL 和 CsvHelper。
首先讓我們看看這兩個庫提供的功能。
IronXL 是一個 .NET 函式庫,可以使用 C# 閱讀和編輯 Microsoft Excel 文件。IronXL.Excel 是一個獨立的 .NET 軟體函式庫,可以讀取多種電子表格式。它不需要安裝 Microsoft Excel,也不依賴 Interop。它還可以非常順利地處理 CSV 文件。
IronXL 是一個直觀的 C# API,允許你在 .NET 中以極快的速度讀取、編輯和創建 Excel 電子表格文件。IronXL 完全支持 .NET Core、.NET Framework、Xamarin、Mobile、Linux、macOS 和 Azure。
IronXL 是一個領先的 .NET Core 和 .NET Framework Excel 電子表格函式庫,適用於 C#。
一個用於讀取和寫入CSV檔案的 .NET 函式庫。速度極快、靈活且易於使用。支援自定義類別物件的讀取和寫入。所有範例代碼都可在 CsvHelper 文件安裝包中找到。
<div 類別="hsg-featured-snippet">
<ol>
<li><a 類別="js-modal-open" data-modal-id="trial-license-after-download" href="https://nuget.org/packages/IronXL.Excel/">安裝 CsvHelper C# 庫以讀取 CSV 文件</a></li>
<li>利用 <code>CsvConfiguration</code> 用於設置 CSV 配置的類別</li>
<li>使用 C# 内建功能開啟檔案 <code>串流讀取器</code></li>
<li>將第2步和第3步中創建的實例輸入到 <code>CsvReader</code> 類別讀取</li>
<li>通過繼承 CsvHelper 轉換 CSV 數據 <code>預設類型轉換器</code> 類別</li>
</ol>
使用以下步驟來建立主控台應用程式:
建立專案 - 控制台應用程式
創建專案 - .NET Framework
專案現在已建立,我們幾乎準備好測試這些程式庫。然而,我們仍需將它們安裝並整合至我們的專案中。讓我們先安裝IronXL。
您可以使用以下方法下載並安裝 IronXL 庫:
讓我們仔細看看每一個方法。
Visual Studio 提供了 NuGet 套件管理器來安裝專案中的 NuGet 套件。您可以通過專案選單存取它,或者在方案總管中右鍵點擊您的專案來進行操作。
選擇-管理-NuGet-套件
搜索 IronXL
這可以通過直接訪問 NuGet 網站並下載套件來完成。步驟如下:
另一種下載和安裝IronXL C#庫的方法是通過以下步驟使用開發者命令提示字元安裝IronXL NuGet包。
PM > Install-Package IronXL.Excel
using IronXL;
using IronXL;
Imports IronXL
全部完成! IronXL 已經下載、安裝並準備好使用。然而,在此之前,我們應該先安裝 CsvHelper。
要下載和安裝 CsvHelper C# 庫,請按照以下步驟通過開發者命令提示符來安裝NuGet 套件。
PM> Install-Package CsvHelper -Version 27.2.1
從NuGet網站下載: https://www.nuget.org/packages/CsvHelper/
逗號分隔值 (CSV) 檔案是一個使用逗號分隔值的定界文本檔案。檔案的每一行都是一條數據記錄。要操作這些檔案進行計算可能是一個具挑戰性的任務,而IronXL提供了一個不錯且簡單的選擇來操作這些檔案而不需要Microsoft Excel。我們首先將CSV檔案轉換為普通的Excel檔案。
這個過程非常簡單且容易。通常只需一行代碼即可完成。
CSV轉Excel格式:
WorkBook workbook = WorkBook.LoadCSV("test.csv", fileFormat: ExcelFileFormat.XLSX, ListDelimiter: ",");
WorkSheet ws = workbook.DefaultWorkSheet;
workbook.SaveAs("CsvToExcelConversion.xlsx");
WorkBook workbook = WorkBook.LoadCSV("test.csv", fileFormat: ExcelFileFormat.XLSX, ListDelimiter: ",");
WorkSheet ws = workbook.DefaultWorkSheet;
workbook.SaveAs("CsvToExcelConversion.xlsx");
Dim workbook As WorkBook = WorkBook.LoadCSV("test.csv", fileFormat:= ExcelFileFormat.XLSX, ListDelimiter:= ",")
Dim ws As WorkSheet = workbook.DefaultWorkSheet
'
workbook.SaveAs("CsvToExcelConversion.xlsx")
IronXL 的 WorkBook 類代表一個 Excel 表格。要使用 C# 打開 Excel 文件,您需要使用 WorkBook.Load 並指定 Excel 文件的路徑。 (.xlsx)以下這行代碼用於打開文件以供讀取:
//Load WorkBook
var workbook = WorkBook.Load(@"Spreadsheets\\sample.xlsx");
//Load WorkBook
var workbook = WorkBook.Load(@"Spreadsheets\\sample.xlsx");
'Load WorkBook
Dim workbook = WorkBook.Load("Spreadsheets\\sample.xlsx")
每個工作簿可以包含多個工作表物件。這些代表了 Excel 文件中的工作表。若工作簿包含工作表,則可按以下方法按名稱檢索它們:
//Open Sheet for reading
var worksheet = workbook.GetWorkSheet("sheetnamegoeshere");
//Open Sheet for reading
var worksheet = workbook.GetWorkSheet("sheetnamegoeshere");
'Open Sheet for reading
Dim worksheet = workbook.GetWorkSheet("sheetnamegoeshere")
讀取單元格值的代碼:
// Read from Ranges of cells elegantly.
foreach (var cell in worksheet ["A2:A10"])
{
Console.WriteLine("Cell {0} has value '{1}'", cell.AddressString, cell.Text);
}
// Read from Ranges of cells elegantly.
foreach (var cell in worksheet ["A2:A10"])
{
Console.WriteLine("Cell {0} has value '{1}'", cell.AddressString, cell.Text);
}
' Read from Ranges of cells elegantly.
For Each cell In worksheet ("A2:A10")
Console.WriteLine("Cell {0} has value '{1}'", cell.AddressString, cell.Text)
Next cell
載入並讀取工作簿和工作表後,可以使用以下程式碼範例來更改公式或應用於特定的儲存格。程式碼如下:
// Set Formulas
worksheet ["A1"].Formula = "Sum(B8:C12)";
worksheet ["B8"].Formula = "=C9/C11";
worksheet ["G30"].Formula = "Max(C3:C7)";
// Force recalculate all formula values in all sheets.
workbook.EvaluateAll();
// Set Formulas
worksheet ["A1"].Formula = "Sum(B8:C12)";
worksheet ["B8"].Formula = "=C9/C11";
worksheet ["G30"].Formula = "Max(C3:C7)";
// Force recalculate all formula values in all sheets.
workbook.EvaluateAll();
' Set Formulas
worksheet ("A1").Formula = "Sum(B8:C12)"
worksheet ("B8").Formula = "=C9/C11"
worksheet ("G30").Formula = "Max(C3:C7)"
'
' Force recalculate all formula values in all sheets.
workbook.EvaluateAll()
使用 IronXL 寫取 CSV 檔案非常簡單。以下程式碼藉由使用 SaveAsCsv 方法將 Excel 檔案儲存為 CSV 格式。
WorkBook wb = WorkBook.Load("Normal_Excel_File.xlsx");
//Import .xls, .csv, or .tsv file
wb.SaveAsCsv("SaveAsCSV.csv", ",");
//Saved as : SaveAsCSV.Sheet1.csv
WorkBook wb = WorkBook.Load("Normal_Excel_File.xlsx");
//Import .xls, .csv, or .tsv file
wb.SaveAsCsv("SaveAsCSV.csv", ",");
//Saved as : SaveAsCSV.Sheet1.csv
Dim wb As WorkBook = WorkBook.Load("Normal_Excel_File.xlsx")
'Import .xls, .csv, or .tsv file
wb.SaveAsCsv("SaveAsCSV.csv", ",")
'Saved as : SaveAsCSV.Sheet1.csv
讀取 CSV 文件看似比實際上簡單得多。CsvHelper 庫使編寫類型安全、快速和靈活的代碼變得容易。
這是範例 CSV 文件,它有三個文字列和一個數字列。
FirstName,LastName,Age,IsActive
Ali,Talal,30,Yes
Affan,Ahmad,31,No
Saad,Bhatti,31,Yes
FirstName,LastName,Age,IsActive
Ali,Talal,30,Yes
Affan,Ahmad,31,No
Saad,Bhatti,31,Yes
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'FirstName,LastName,Age,IsActive Ali,Talal,30,Yes Affan,Ahmad,31,No Saad,Bhatti,31,Yes
我們將每一行映射成一個類型為 Person 的對象。
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int? Age { get; set; }
public string IsActive { get; set; }
}
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int? Age { get; set; }
public string IsActive { get; set; }
}
Public Class Person
Public Property FirstName() As String
Public Property LastName() As String
Public Property Age() As Integer?
Public Property IsActive() As String
End Class
下面是讀取我們 CSV 文件的代碼。
var fileName = @"<path to our CSV file>";
var configuration = new CsvConfiguration(CultureInfo.InvariantCulture)
{
Encoding = Encoding.UTF8,
Delimiter = ","
};
using (var fs = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
{
using (var textReader = new StreamReader(fs, Encoding.UTF8))
using (var csv = new CsvReader(textReader, configuration))
{
var data = csv.GetRecords<Person>();
foreach (var person in data)
{
// Do something with values in each row
}
}
}
var fileName = @"<path to our CSV file>";
var configuration = new CsvConfiguration(CultureInfo.InvariantCulture)
{
Encoding = Encoding.UTF8,
Delimiter = ","
};
using (var fs = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
{
using (var textReader = new StreamReader(fs, Encoding.UTF8))
using (var csv = new CsvReader(textReader, configuration))
{
var data = csv.GetRecords<Person>();
foreach (var person in data)
{
// Do something with values in each row
}
}
}
Dim fileName = "<path to our CSV file>"
Dim configuration = New CsvConfiguration(CultureInfo.InvariantCulture) With {
.Encoding = Encoding.UTF8,
.Delimiter = ","
}
Using fs = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.Read)
Using textReader = New StreamReader(fs, Encoding.UTF8)
Using csv = New CsvReader(textReader, configuration)
Dim data = csv.GetRecords(Of Person)()
For Each person In data
' Do something with values in each row
Next person
End Using
End Using
End Using
資料類型是 IEnumerable
CSV 文件大多包含文本數據。例如,年齡欄是整數值,CSV 文件僅包含文本。CsvHelper 可以將數據從字符串轉換為標準 .NET 類型 (布林值, 整數32, 整數64, 列舉型別)在我們的例子中,我們有一個 IsActive 布林數據型別,該型別只能有 True/False,並包含非標準值。可以通過創建自定義轉換器來進行轉換。程式碼風格如下:
public class CustomBooleanConverter : DefaultTypeConverter
{
public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
{
return text.Equals("Yes", StringComparison.OrdinalIgnoreCase);
}
}
public class CustomBooleanConverter : DefaultTypeConverter
{
public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
{
return text.Equals("Yes", StringComparison.OrdinalIgnoreCase);
}
}
Public Class CustomBooleanConverter
Inherits DefaultTypeConverter
Public Overrides Function ConvertFromString(ByVal text As String, ByVal row As IReaderRow, ByVal memberMapData As MemberMapData) As Object
Return text.Equals("Yes", StringComparison.OrdinalIgnoreCase)
End Function
End Class
雖然 bool 是標準的 .NET 類型,但預設轉換器只能處理 True/False 值,而我們的 CSV 文件中有 Yes/No。這裡,我們需要繼承 DefaultTypeConverter,然後覆寫 ConvertFromString 方法。
IronXL 是一個開放的商業產品 C# Excel 庫. 開發過程中免費使用,並可隨時獲得商業部署的授權。授權可用適用於單個項目使用、單個開發人員、代理商和全球企業,以及 SaaS 和 OEM 重新分發。所有許可證均包括 30 天退款保證、一年的產品支援和更新、開發/測試/生產的有效性,以及永久許可證。 (一次性購買). Lite 套裝從 $749 起。
CsvHelper — 讀取和寫入 CSV 文件,完全免費供商業使用。
IronXL 是一個完整的庫,提供您操作 Excel 文件所需的一切。它易於使用,並且可以將各種格式轉換為 XLSX,還可以從 XLSX 轉換為其他格式,如 CSV。這種互轉功能為用戶提供了在不同文件格式之間輕鬆工作的靈活性。
另一方面,CsvHelper 專門設計用於處理 CSV 文件格式,這意味著它只能處理 CSV 文件。所有的代碼示例都可以在 CsvHelper 文檔中找到。文檔提供了有關如何在您的項目中使用 CsvHelper 的指導。
IronXL 相較於 CsvHelper 有明顯的優勢,因為它支持用戶處理多種格式。此外,您可以根據自己的選擇應用公式和樣式,而 CsvHelper 只允許有限的 CSV 檔案讀寫選項。此外,您無法在現有的 CSV 檔案中追加新記錄,因為它只是覆蓋以前的條目。