C# 讀取 Excel 文件教程
本教程解釋了如何在 C# 中讀取 Excel 文件,以及執行每日任務,如數據驗證、數據庫轉換、Web API 整合和公式修改。 本文提到了使用 IronXL .NET Excel 函式庫的程式碼範例。
概述
如何在 C# 中读取 Excel 文件
- 下載用於讀取 Excel 文件的 C# 庫
- 載入並讀取 Excel 文件 (工作簿)
- 建立 CSV 或 XLSX 格式的 Excel 活頁簿
- 编辑單元格範圍內的單元格值
- 驗證試算表數據
- 使用 Entity Framework 匯出數據
IronXL 支持使用 C# 讀取和編輯 Microsoft Excel 文件。 IronXL 不需要 Microsoft Excel,也不需要互操作性. 事實上,IronXL 提供比 Microsoft.Office.Interop.Excel
更快速且直觀的 API.
IronXL 包括:
- 來自我們 .NET 工程師的專門產品支持
- 透過 Microsoft Visual Studio 輕鬆安裝
免費試用開發測試。 許可證自 $749。
使用 IronXL 軟體庫在 C# 和 VB.NET 中讀取和創建 Excel 檔案很容易。
使用 IronXL 讀取 .XLS 和 .XLSX Excel 檔案
以下是使用IronXL讀取Excel檔案的整體工作流程摘要:
安裝 IronXL Excel 程式庫。 我们可以使用我们的 NuGet 套件 或通過下載 .Net Excel DLL.
使用
WorkBook.Load
方法來讀取任何 XLS、XLSX 或 CSV 文件。- 使用直观的语法获取单元格值:
sheet["A11"].DecimalValue
:path=/static-assets/excel/content-code-examples/tutorials/how-to-read-excel-file-csharp-1.cs
using IronXL;
using System;
using System.Linq;
// Supported spreadsheet formats for reading include: XLSX, XLS, CSV and TSV
WorkBook workBook = WorkBook.Load("test.xlsx");
WorkSheet workSheet = workBook.WorkSheets.First();
// Select cells easily in Excel notation and return the calculated value
int cellValue = workSheet["A2"].IntValue;
// Read from Ranges of cells elegantly.
foreach (var cell in workSheet["A2:A10"])
{
Console.WriteLine("Cell {0} has value '{1}'", cell.AddressString, cell.Text);
}
// Advanced Operations
// Calculate aggregate values such as Min, Max and Sum
decimal sum = workSheet["A2:A10"].Sum();
// Linq compatible
decimal max = workSheet["A2:A10"].Max(c => c.DecimalValue);
Imports IronXL
Imports System
Imports System.Linq
' Supported spreadsheet formats for reading include: XLSX, XLS, CSV and TSV
Private workBook As WorkBook = WorkBook.Load("test.xlsx")
Private workSheet As WorkSheet = workBook.WorkSheets.First()
' Select cells easily in Excel notation and return the calculated value
Private cellValue As Integer = workSheet("A2").IntValue
' 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
' Advanced Operations
' Calculate aggregate values such as Min, Max and Sum
Dim sum As Decimal = workSheet("A2:A10").Sum()
' Linq compatible
Dim max As Decimal = workSheet("A2:A10").Max(Function(c) c.DecimalValue)
在本教程下一部分中使用的代碼範例(以及範例專案代碼)會處理三個範例 Excel 試算表(請見下方的視覺效果):
教程
1. 免費下載 IronXL C# 函式庫
立即在您的專案中使用IronXL,並享受免費試用。
首先,我們需要安裝 IronXL.Excel
程式庫,以增加 Excel 功能至 .NET 框架。
安裝 IronXL.Excel
最簡單的方法是使用我們的 NuGet 套件,儘管您也可以選擇手動安裝DLL到您的專案或全域組件快取中。
安裝 IronXL NuGet 套件
在 Visual Studio 中,右鍵點擊專案選擇「管理 NuGet 套件...」。
在尋找 IronXL.Excel 套件並點擊安裝按鈕以將其添加到項目中。
另一種安裝 IronXL 程式庫的方法是使用 NuGet 套件管理員控制台:
進入套件管理器控制台
- 輸入
> Install-Package IronXL.Excel
PM > Install-Package IronXL.Excel
此外,您可以在 NuGet 網站上查看套件
手動安裝
或者,我們可以先下載 IronXL.NET Excel DLL並手動安裝到 Visual Studio。
2. 加載一個 Excel 工作簿
這Workbook
class 代表一個 Excel 工作表。 要使用C#打開Excel文件,我們使用WorkBook.Load
方法,並指定Excel文件的路徑。
:path=/static-assets/excel/content-code-examples/tutorials/how-to-read-excel-file-csharp-2.cs
WorkBook workBook = WorkBook.Load(@"Spreadsheets\\GDP.xlsx");
Dim workBook As WorkBook = WorkBook.Load("Spreadsheets\\GDP.xlsx")
示例:ExcelToDBProcessor
每個 WorkBook
可以有多個工作表
物件。 每一個代表Excel文件中的單個Excel工作表。 使用WorkBook.GetWorkSheet
检索特定Excel工作表引用的方法。
```c#
:path=/static-assets/excel/content-code-examples/tutorials/how-to-read-excel-file-csharp-3.cs 請提供內容以進行翻譯。
範例:ExcelToDB
創建新的 Excel 文件
要創建新的Excel文件,請使用有效的文件類型來構造一個新的WorkBook
對象。
:path=/static-assets/excel/content-code-examples/tutorials/how-to-read-excel-file-csharp-4.cs
WorkBook workBook = new WorkBook(ExcelFileFormat.XLSX);
Dim workBook As New WorkBook(ExcelFileFormat.XLSX)
範例:ApiToExcel處理器
注意:使用ExcelFileFormat.XLS
來支援舊版的Microsoft Excel(95 及以前).
將工作表添加到 Excel 文件中
如前所述,IronXL WorkBook
包含一個或多個 WorkSheet
的集合。
若要創建新的 WorkSheet
,請使用工作表的名稱調用 WorkBook.CreateWorkSheet
。
:path=/static-assets/excel/content-code-examples/tutorials/how-to-read-excel-file-csharp-5.cs
WorkSheet workSheet = workBook.GetWorkSheet("GDPByCountry");
Dim workSheet As WorkSheet = workBook.GetWorkSheet("GDPByCountry")
3. 訪問儲存格值
讀取和編輯單一儲存格
透過從其 WorkSheet
檢索所需的單元格來訪問單個電子表格單元格的值。 如下所示:
:path=/static-assets/excel/content-code-examples/tutorials/how-to-read-excel-file-csharp-16.cs
WorkBook workBook = WorkBook.Load("test.xlsx");
WorkSheet workSheet = workBook.DefaultWorkSheet;
IronXL.Cell cell = workSheet["B1"].First();
Dim workBook As WorkBook = WorkBook.Load("test.xlsx")
Dim workSheet As WorkSheet = workBook.DefaultWorkSheet
Dim cell As IronXL.Cell = workSheet("B1").First()
IronXL's儲存格
類代表 Excel 試算表中的單個儲存格。 它包含屬性和方法,使用者可以直接訪問和修改單元格的值。
每個 WorkSheet
物件管理一個索引,包含 Excel 工作表中每個單元格的 Cell
物件。 在上面的源代碼中,我們通過其行和列索引來引用所需的單元格。(在這個情況下, 單元格 B1)使用標準陣列索引語法。
透過對單元格對象的引用,我們可以讀取和寫入試算表單元格的數據。
:path=/static-assets/excel/content-code-examples/tutorials/how-to-read-excel-file-csharp-17.cs
IronXL.Cell cell = workSheet["B1"].First();
string value = cell.StringValue; // Read the value of the cell as a string
Console.WriteLine(value);
cell.Value = "10.3289"; // Write a new value to the cell
Console.WriteLine(cell.StringValue);
Dim cell As IronXL.Cell = workSheet("B1").First()
Dim value As String = cell.StringValue ' Read the value of the cell as a string
Console.WriteLine(value)
cell.Value = "10.3289" ' Write a new value to the cell
Console.WriteLine(cell.StringValue)
讀取和寫入一系列的單元格值
Range
類別代表一個二維的 Cell
物件集合。 此集合指的是Excel單元格的實際範圍。 使用 WorkSheet
物件上的字符串索引器來獲取範圍。
參數文本是單元格的坐標(例如「A1」,如前所示)或從左到右、從上到下一範圍的單元格(例如 "B2:E5"). 也可以在WorkSheet
上调用GetRange
。
:path=/static-assets/excel/content-code-examples/tutorials/how-to-read-excel-file-csharp-6.cs
Range range = workSheet["D2:D101"];
Dim range As Range = workSheet("D2:D101")
範例: DataValidation
有幾種方法可以讀取或編輯範圍內單元格的值。 如果已知計數,請使用 For 迴圈。
:path=/static-assets/excel/content-code-examples/tutorials/how-to-read-excel-file-csharp-7.cs
// Iterate through the rows
for (var y = 2; y <= 101; y++)
{
var result = new PersonValidationResult { Row = y };
results.Add(result);
// Get all cells for the person
var cells = workSheet[$"A{y}:E{y}"].ToList();
// Validate the phone number (1 = B)
var phoneNumber = cells[1].Value;
result.PhoneNumberErrorMessage = ValidatePhoneNumber(phoneNumberUtil, (string)phoneNumber);
// Validate the email address (3 = D)
result.EmailErrorMessage = ValidateEmailAddress((string)cells[3].Value);
// Get the raw date in the format of Month Day[suffix], Year (4 = E)
var rawDate = (string)cells[4].Value;
result.DateErrorMessage = ValidateDate(rawDate);
}
' Iterate through the rows
For y = 2 To 101
Dim result = New PersonValidationResult With {.Row = y}
results.Add(result)
' Get all cells for the person
Dim cells = workSheet($"A{y}:E{y}").ToList()
' Validate the phone number (1 = B)
Dim phoneNumber = cells(1).Value
result.PhoneNumberErrorMessage = ValidatePhoneNumber(phoneNumberUtil, CStr(phoneNumber))
' Validate the email address (3 = D)
result.EmailErrorMessage = ValidateEmailAddress(CStr(cells(3).Value))
' Get the raw date in the format of Month Day[suffix], Year (4 = E)
Dim rawDate = CStr(cells(4).Value)
result.DateErrorMessage = ValidateDate(rawDate)
Next y
範例: DataValidation
向試算表添加公式
設定 Cell
的公式公式
屬性。
下面的代碼遍歷每個州並在C列放置百分比總計。
:path=/static-assets/excel/content-code-examples/tutorials/how-to-read-excel-file-csharp-13.cs
// Iterate through all rows with a value
for (var y = 2 ; y < i ; y++)
{
// Get the C cell
Cell cell = workSheet[$"C{y}"].First();
// Set the formula for the Percentage of Total column
cell.Formula = $"=B{y}/B{i}";
}
' Iterate through all rows with a value
Dim y = 2
Do While y < i
' Get the C cell
Dim cell As Cell = workSheet($"C{y}").First()
' Set the formula for the Percentage of Total column
cell.Formula = $"=B{y}/B{i}"
y += 1
Loop
範例:AddFormulaeProcessor
驗證試算表資料
使用 IronXL 驗證數據表。 DataValidation
示例使用 libphonenumber-csharp
來驗證電話號碼,並使用標準 C# API 來驗證電子郵件地址和日期。
:path=/static-assets/excel/content-code-examples/tutorials/how-to-read-excel-file-csharp-8.cs
// Iterate through the rows
for (var i = 2; i <= 101; i++)
{
var result = new PersonValidationResult { Row = i };
results.Add(result);
// Get all cells for the person
var cells = worksheet[$"A{i}:E{i}"].ToList();
// Validate the phone number (1 = B)
var phoneNumber = cells[1].Value;
result.PhoneNumberErrorMessage = ValidatePhoneNumber(phoneNumberUtil, (string)phoneNumber);
// Validate the email address (3 = D)
result.EmailErrorMessage = ValidateEmailAddress((string)cells[3].Value);
// Get the raw date in the format of Month Day[suffix], Year (4 = E)
var rawDate = (string)cells[4].Value;
result.DateErrorMessage = ValidateDate(rawDate);
}
' Iterate through the rows
For i = 2 To 101
Dim result = New PersonValidationResult With {.Row = i}
results.Add(result)
' Get all cells for the person
Dim cells = worksheet($"A{i}:E{i}").ToList()
' Validate the phone number (1 = B)
Dim phoneNumber = cells(1).Value
result.PhoneNumberErrorMessage = ValidatePhoneNumber(phoneNumberUtil, CStr(phoneNumber))
' Validate the email address (3 = D)
result.EmailErrorMessage = ValidateEmailAddress(CStr(cells(3).Value))
' Get the raw date in the format of Month Day[suffix], Year (4 = E)
Dim rawDate = CStr(cells(4).Value)
result.DateErrorMessage = ValidateDate(rawDate)
Next i
上述代碼遍歷試算表中的每一行,並將單元格作為列表抓取。每個驗證方法檢查單元格的值,如果值無效,則返回錯誤消息。
此代碼創建一個新工作表,指定表頭,並輸出錯誤消息結果,以便記錄無效數據。
:path=/static-assets/excel/content-code-examples/tutorials/how-to-read-excel-file-csharp-9.cs
var resultsSheet = workBook.CreateWorkSheet("Results");
resultsSheet["A1"].Value = "Row";
resultsSheet["B1"].Value = "Valid";
resultsSheet["C1"].Value = "Phone Error";
resultsSheet["D1"].Value = "Email Error";
resultsSheet["E1"].Value = "Date Error";
for (var i = 0; i < results.Count; i++)
{
var result = results[i];
resultsSheet[$"A{i + 2}"].Value = result.Row;
resultsSheet[$"B{i + 2}"].Value = result.IsValid ? "Yes" : "No";
resultsSheet[$"C{i + 2}"].Value = result.PhoneNumberErrorMessage;
resultsSheet[$"D{i + 2}"].Value = result.EmailErrorMessage;
resultsSheet[$"E{i + 2}"].Value = result.DateErrorMessage;
}
workBook.SaveAs(@"Spreadsheets\\PeopleValidated.xlsx");
Dim resultsSheet = workBook.CreateWorkSheet("Results")
resultsSheet("A1").Value = "Row"
resultsSheet("B1").Value = "Valid"
resultsSheet("C1").Value = "Phone Error"
resultsSheet("D1").Value = "Email Error"
resultsSheet("E1").Value = "Date Error"
For i = 0 To results.Count - 1
Dim result = results(i)
resultsSheet($"A{i + 2}").Value = result.Row
resultsSheet($"B{i + 2}").Value = If(result.IsValid, "Yes", "No")
resultsSheet($"C{i + 2}").Value = result.PhoneNumberErrorMessage
resultsSheet($"D{i + 2}").Value = result.EmailErrorMessage
resultsSheet($"E{i + 2}").Value = result.DateErrorMessage
Next i
workBook.SaveAs("Spreadsheets\\PeopleValidated.xlsx")
4. 使用 Entity Framework 匯出資料
使用 IronXL 將數據導出到數據庫或將 Excel 電子表格轉換為數據庫。 ExcelToDB
示例讀取包含各國 GDP 的試算表,然後將該數據導出到 SQLite。
它使用 EntityFramework
建立數據庫,然後逐行導出數據。
添加 SQLite Entity Framework NuGet 套件。
EntityFramework
允許您建立可將資料匯出到資料庫的模型物件。
:path=/static-assets/excel/content-code-examples/tutorials/how-to-read-excel-file-csharp-10.cs
public class Country
{
[Key]
public Guid Key { get; set; }
public string Name { get; set; }
public decimal GDP { get; set; }
}
Public Class Country
<Key>
Public Property Key() As Guid
Public Property Name() As String
Public Property GDP() As Decimal
End Class
若要使用不同的資料庫,請安裝相應的 NuGet 套件,並找到 UseSqLite
的等效方法。()```
```cs
:path=/static-assets/excel/content-code-examples/tutorials/how-to-read-excel-file-csharp-11.cs
創建一個 CountryContext
,遍歷該範圍來創建每個記錄,然後使用 SaveAsync
將數據提交到資料庫。
:path=/static-assets/excel/content-code-examples/tutorials/how-to-read-excel-file-csharp-12.cs
public async Task ProcessAsync()
{
//Get the first worksheet
var workbook = WorkBook.Load(@"Spreadsheets\\GDP.xlsx");
var worksheet = workbook.GetWorkSheet("GDPByCountry");
//Create the database connection
using (var countryContext = new CountryContext())
{
//Iterate through all the cells
for (var i = 2; i <= 213; i++)
{
//Get the range from A-B
var range = worksheet[$"A{i}:B{i}"].ToList();
//Create a Country entity to be saved to the database
var country = new Country
{
Name = (string)range[0].Value,
GDP = (decimal)(double)range[1].Value
};
//Add the entity
await countryContext.Countries.AddAsync(country);
}
//Commit changes to the database
await countryContext.SaveChangesAsync();
}
}
Public Async Function ProcessAsync() As Task
'Get the first worksheet
Dim workbook = WorkBook.Load("Spreadsheets\\GDP.xlsx")
Dim worksheet = workbook.GetWorkSheet("GDPByCountry")
'Create the database connection
Using countryContext As New CountryContext()
'Iterate through all the cells
For i = 2 To 213
'Get the range from A-B
Dim range = worksheet($"A{i}:B{i}").ToList()
'Create a Country entity to be saved to the database
Dim country As New Country With {
.Name = CStr(range(0).Value),
.GDP = CDec(CDbl(range(1).Value))
}
'Add the entity
Await countryContext.Countries.AddAsync(country)
Next i
'Commit changes to the database
Await countryContext.SaveChangesAsync()
End Using
End Function
範例:ExcelToDB
5. 從 API 下載資料到試算表
以下呼叫會進行一個REST呼叫,RestClient.Net. 它下載 JSON 並將其轉換成 RestCountry
類型的「列表」。 然後可以輕鬆地遍歷每個國家,並將 REST API 的數據保存到 Excel 試算表中。
:path=/static-assets/excel/content-code-examples/tutorials/how-to-read-excel-file-csharp-14.cs
var client = new Client(new Uri("https://restcountries.eu/rest/v2/"));
List<RestCountry> countries = await client.GetAsync<List<RestCountry>>();
Dim client As New Client(New Uri("https://restcountries.eu/rest/v2/"))
Dim countries As List(Of RestCountry) = Await client.GetAsync(Of List(Of RestCountry))()
範例:ApiToExcel
以下程式碼遍歷國家,並在試算表中設定名稱、人口數、地區、數字代碼以及前三名語言。
:path=/static-assets/excel/content-code-examples/tutorials/how-to-read-excel-file-csharp-15.cs
for (var i = 2; i < countries.Count; i++)
{
var country = countries[i];
//Set the basic values
workSheet[$"A{i}"].Value = country.name;
workSheet[$"B{i}"].Value = country.population;
workSheet[$"G{i}"].Value = country.region;
workSheet[$"H{i}"].Value = country.numericCode;
//Iterate through languages
for (var x = 0; x < 3; x++)
{
if (x > (country.languages.Count - 1)) break;
var language = country.languages[x];
//Get the letter for the column
var columnLetter = GetColumnLetter(4 + x);
//Set the language name
workSheet[$"{columnLetter}{i}"].Value = language.name;
}
}
For i = 2 To countries.Count - 1
Dim country = countries(i)
'Set the basic values
workSheet($"A{i}").Value = country.name
workSheet($"B{i}").Value = country.population
workSheet($"G{i}").Value = country.region
workSheet($"H{i}").Value = country.numericCode
'Iterate through languages
For x = 0 To 2
If x > (country.languages.Count - 1) Then
Exit For
End If
Dim language = country.languages(x)
'Get the letter for the column
Dim columnLetter = GetColumnLetter(4 + x)
'Set the language name
workSheet($"{columnLetter}{i}").Value = language.name
Next x
Next i
物件參考與資源
您也可能會發現 IronXL 類別文件 在具有很大價值的物件參考中。
此外,還有其他教程可能會在其他方面闡明 IronXL.Excel
包括創建, 打開、寫入、編輯、保存和導出不使用Excel Interop的XLS、XLSX和CSV文件。
摘要
IronXL.Excel 是一個專門用於讀取各種電子表格格式的 .NET 軟體庫。 它不需要微軟 Excel安裝,並且不依賴於Interop。
如果您認為.NET庫在修改Excel文件方面非常有用,您可能也會對探索Google Sheets API 客戶端庫用於 .NET 的工具,可讓您修改 Google Sheets。
快速指南
在 GitHub 上探索此教學
此專案的源代碼在 GitHub 上以 C# 和 VB.NET 提供。
只需幾分鐘即可使用此代碼輕鬆啟動和運行。該項目保存為 Microsoft Visual Studio 2017 項目,但與任何 .NET IDE 兼容。
如何在 GitHub 上使用 C# 讀取 Excel 文件