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 "更快、更直观的应用程序接口.

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库,为.NET框架添加Excel功能。

安装 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工作簿

"(《世界人权宣言》)工作簿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")
VB   C#

示例:ExcelToDBProcessor

Each WorkBook 可以有多个工作表objects. 每一个代表Excel文档中的一个单独的Excel工作表。 使用工作簿.获取工作表检索特定 Excel 工作表引用的方法。

// IronPDF 示例:将HTML转换为PDF
using IronPdf;

class HtmlToPdfExample
{
    static void Main()
    {
        // 创建一个新的PDF打印机
        var Renderer = new HtmlToPdf();

        // 设置页面大小和边距
        Renderer.PrintOptions.PaperSize = PdfPrintOptions.PdfPaperSize.A4;
        Renderer.PrintOptions.MarginTop = 40;  // 顶部边距40像素
        Renderer.PrintOptions.MarginBottom = 40;  // 底部边距40像素
        Renderer.PrintOptions.CssMediaType = PdfPrintOptions.PdfCssMediaType.Print;

        // 将HTML代码转换为PDF文件
        Renderer.RenderHtmlAsPdf("<h1>Hello, world!</h1>").SaveAs("hello.pdf");

        // 输出完成消息
        System.Console.WriteLine("PDF文件已创建成功!");
    }
}

:path=/static-assets/excel/content-code-examples/tutorials/how-to-read-excel-file-csharp-3.cs


样本 *ExcelToDB*

### 创建新的Excel文档

要创建一个新的Excel文档,请使用有效的文件类型构造一个新的`WorkBook`对象。

```cs
:path=/static-assets/excel/content-code-examples/tutorials/how-to-read-excel-file-csharp-4.cs

示例:ApiToExcelProcessor

注意:使用 ExcelFileFormat.XLS 支持 Microsoft Excel 的旧版本(95 及更早).

向Excel文档添加工作表

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

这就是 Excel 中包含两个工作表的工作簿的样子。

这就是 Excel 中包含两个工作表的工作簿的样子。

要创建新的工作表,请调用 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单元格class 代表 Excel 工作表中的一个单元格。 它包含属性和方法,使用户能够直接访问和修改单元格的值。

每个WorkSheet对象管理着一个Cell对象的索引,这些Cell对象对应于Excel工作表中的每个单元格的值。 在上面的源代码中,我们通过其行和列索引引用所需的单元格。(本例中的单元格 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#

样本: 数据验证

有几种方法可以读取或编辑范围内单元格的值。 如果已知计数,请使用 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#

样本: 数据验证

向电子表格添加公式

设置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. 使用实体框架导出数据

使用IronXL将数据导出到数据库或将Excel电子表格转换为数据库。 ExcelToDB示例读取一个包含各国GDP的电子表格,然后将该数据导出到SQLite数据库。

它使用EntityFramework来构建数据库,然后逐行导出数据。

添加 SQLite 实体框架 NuGet 包。

Ironxl Nuget related to 4. 使用实体框架导出数据

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()

:path=/static-assets/excel/content-code-examples/tutorials/how-to-read-excel-file-csharp-11.cs
public class CountryContext : DbContext
    {
        public DbSet<Country> Countries { get; set; }
        public CountryContext()
        {
            //TODO: Make async
            Database.EnsureCreated();
        }
        /// <summary>
        /// Configure context to use Sqlite
        /// </summary>
        /// <param name="optionsBuilder"></param>
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            var connection = new SqliteConnection($"Data Source=Country.db");
            connection.Open();
            var command = connection.CreateCommand();
            //Create the database if it doesn't already exist
            command.CommandText = $"PRAGMA foreign_keys = ON;";
            command.ExecuteNonQuery();
            optionsBuilder.UseSqlite(connection);
            base.OnConfiguring(optionsBuilder);
        }
    }
Public Class CountryContext
	Inherits DbContext

		Public Property Countries() As DbSet(Of Country)
		Public Sub New()
			'TODO: Make async
			Database.EnsureCreated()
		End Sub
		''' <summary>
		''' Configure context to use Sqlite
		''' </summary>
		''' <param name="optionsBuilder"></param>
		Protected Overrides Sub OnConfiguring(ByVal optionsBuilder As DbContextOptionsBuilder)
			Dim connection = New SqliteConnection($"Data Source=Country.db")
			connection.Open()
			Dim command = connection.CreateCommand()
			'Create the database if it doesn't already exist
			command.CommandText = $"PRAGMA foreign_keys = ON;"
			command.ExecuteNonQuery()
			optionsBuilder.UseSqlite(connection)
			MyBase.OnConfiguring(optionsBuilder)
		End Sub
End Class
VB   C#

创建一个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下载数据到电子表格

以下代码会遍历所有国家,并在电子表格中设置名称、人口、地区、数字代码和前 3 种语言。

: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的其他方面提供一些说明,包括创建, 打开、编写、编辑、保存和导出XLS、XLSX 和 CSV 文件,而无需使用 Excel Interop

摘要

IronXL.Excel 是唯一的 .NET 软件库,用于读取各种各样的电子表格格式。 它不需要微软Excel安装,而不依赖于 Interop。

如果您觉得.NET库在修改Excel文件方面很有用,您可能也会对探索Google Sheets API 客户端库它允许你修改 Google Sheets。


教程快速访问

Brand Visual Studio related to 教程快速访问

将本教程下载为 C&num;源代码

本教程的完整免费 C# for Excel 源代码以压缩的 Visual Studio 2017 项目文件形式提供下载。

下载

在 GitHub 上探索此教程

GitHub 上有该项目的 C&num 和 VB.NET 源代码。

使用此代码,只需几分钟就能轻松上手并运行。该项目保存为 Microsoft Visual Studio 2017 项目,但兼容任何 .NET IDE。

如何用 C&num 读取 Excel 文件;在 GitHub 上
Github Icon related to 教程快速访问
Documentation related to 教程快速访问

查看应用程序接口参考

探索 IronXL 的 API 参考,其中概述了 IronXL 的所有功能、命名空间、类、方法字段和枚举的详细信息。

查看应用程序接口参考
.NET 解决方案总监,负责Microsoft Excel文档输入输出

克里斯蒂安·费因德莱

软件开发团队负责人

Christian为健康行业开发软件,并领导一个团队。Christian具有多年的系统集成经验。IronXL允许Christian从不同来源导入和处理数据,以自动化重复性任务并验证来自第三方来源的输入数据。