C# 讀取 Excel 文件教程

This article was translated from English: Does it need improvement?
Translated
View the article in English

克里斯蒂安·芬德利

本教程解釋了如何在 C# 中讀取 Excel 文件,以及執行每日任務,如數據驗證、數據庫轉換、Web API 整合和公式修改。 本文提到了使用 IronXL .NET Excel 函式庫的程式碼範例。


概述

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檔案的整體工作流程摘要:

  1. 安裝 IronXL Excel 程式庫。 我们可以使用我们的 NuGet 套件 或通過下載 .Net Excel DLL.

  2. 使用 WorkBook.Load 方法來讀取任何 XLS、XLSX 或 CSV 文件。

  3. 使用直观的语法获取单元格值: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)
VB   C#

在本教程下一部分中使用的代碼範例(以及範例專案代碼)會處理三個範例 Excel 試算表(請見下方的視覺效果):

Vs Spreadsheets related to 使用 IronXL 讀取 .XLS 和 .XLSX Excel 檔案


教程

1. 免費下載 IronXL C# 函式庫

立即在您的專案中使用IronXL,並享受免費試用。

第一步:
green arrow pointer


首先,我們需要安裝 IronXL.Excel 程式庫,以增加 Excel 功能至 .NET 框架。

安裝 IronXL.Excel 最簡單的方法是使用我們的 NuGet 套件,儘管您也可以選擇手動安裝DLL到您的專案或全域組件快取中。

安裝 IronXL NuGet 套件

  1. 在 Visual Studio 中,右鍵點擊專案選擇「管理 NuGet 套件...」。

  2. 在尋找 IronXL.Excel 套件並點擊安裝按鈕以將其添加到項目中。

    Ef Nuget related to 安裝 IronXL NuGet 套件

    另一種安裝 IronXL 程式庫的方法是使用 NuGet 套件管理員控制台:

  3. 進入套件管理器控制台

  4. 輸入 > Install-Package IronXL.Excel
  PM > Install-Package IronXL.Excel

此外,您可以在 NuGet 網站上查看套件

手動安裝

或者,我們可以先下載 IronXL.NET Excel DLL並手動安裝到 Visual Studio。

2. 加載一個 Excel 工作簿

Workbookclass 代表一個 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")
VB   C#

示例: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)
VB   C#

範例:ApiToExcel處理器

注意:使用ExcelFileFormat.XLS來支援舊版的Microsoft Excel(95 及以前).

將工作表添加到 Excel 文件中

如前所述,IronXL WorkBook 包含一個或多個 WorkSheet 的集合。

這是一個包含兩個工作表的工作簿在Excel中的樣子。

這是一個包含兩個工作表的工作簿在Excel中的樣子。

若要創建新的 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")
VB   C#

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()
VB   C#

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)
VB   C#

讀取和寫入一系列的單元格值

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")
VB   C#

範例: 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
VB   C#

範例: 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
VB   C#

範例: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
VB   C#

上述代碼遍歷試算表中的每一行,並將單元格作為列表抓取。每個驗證方法檢查單元格的值,如果值無效,則返回錯誤消息。

此代碼創建一個新工作表,指定表頭,並輸出錯誤消息結果,以便記錄無效數據。

: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")
VB   C#

4. 使用 Entity Framework 匯出資料

使用 IronXL 將數據導出到數據庫或將 Excel 電子表格轉換為數據庫。 ExcelToDB 示例讀取包含各國 GDP 的試算表,然後將該數據導出到 SQLite。

它使用 EntityFramework 建立數據庫,然後逐行導出數據。

添加 SQLite Entity Framework NuGet 套件。

Ironxl Nuget related to 4. 使用 Entity Framework 匯出資料

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
VB   C#

若要使用不同的資料庫,請安裝相應的 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
VB   C#

範例: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))()
VB   C#

範例:ApiToExcel

這是 API JSON 數據的樣子。

Country Data related to 5. 從 API 下載資料到試算表

以下程式碼遍歷國家,並在試算表中設定名稱、人口數、地區、數字代碼以及前三名語言。

: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
VB   C#

物件參考與資源

您也可能會發現 IronXL 類別文件 在具有很大價值的物件參考中。

此外,還有其他教程可能會在其他方面闡明 IronXL.Excel 包括創建, 打開、寫入、編輯、保存和導出不使用Excel Interop的XLS、XLSX和CSV文件。

摘要

IronXL.Excel 是一個專門用於讀取各種電子表格格式的 .NET 軟體庫。 它不需要微軟 Excel安裝,並且不依賴於Interop。

如果您認為.NET庫在修改Excel文件方面非常有用,您可能也會對探索Google Sheets API 客戶端庫用於 .NET 的工具,可讓您修改 Google Sheets。


快速指南

Brand Visual Studio related to 快速指南

下載這個教學作為 C# 原始碼

完整的免費 C# for Excel 原始碼可作為壓縮的 Visual Studio 2017 專案檔案下載。

下載

在 GitHub 上探索此教學

此專案的源代碼在 GitHub 上以 C# 和 VB.NET 提供。

只需幾分鐘即可使用此代碼輕鬆啟動和運行。該項目保存為 Microsoft Visual Studio 2017 項目,但與任何 .NET IDE 兼容。

如何在 GitHub 上使用 C# 讀取 Excel 文件
Github Icon related to 快速指南
Documentation related to 快速指南

查看 API 參考文件

查看 IronXL 的 API 參考文件,詳述 IronXL 的所有功能、命名空間、類別、方法字段和列舉。

查看 API 參考文件
.NET 解決方案主管,負責處理 Microsoft Excel 文件 IO

克里斯蒂安·芬德利

軟體開發團隊領導

克里斯蒂安為健康產業開發軟體,並領導一個團隊。克里斯蒂安擁有多年的各類系統整合經驗。IronXL 允許克里斯蒂安匯入和操作來自不同來源的數據,以自動化重複任務和驗證來自第三方來源的輸入數據。