C# 读取 Excel 文件教程
本教程介绍如何用 C&num 读取 Excel 文件,以及执行数据验证、数据库转换、Web API 集成和公式修改等日常任务。本文引用了使用 IronXL .NET Excel 库的代码示例。
概述
如何用 C&num 读取 Excel 文件;
- 下载读取 Excel 文件的 C# 库
- 加载并读取 Excel 文件(工作簿)
- 以 CSV 或 XLSX 格式创建 Excel 工作簿
- 编辑单元格区域中的单元格值
- 验证电子表格数据
- 使用实体框架导出数据
IronXL 可使用 C&num 方便地读取和编辑 Microsoft Excel 文档。IronXL 既不需要 Microsoft Excel,也不需要 互操作.事实上 IronXL 提供了比 "Microsoft.Office.Interop.Excel "更快、更直观的应用程序接口.
IronXL Includes:
- 我们的 .NET 工程师提供的专门产品支持
- 通过 Microsoft Visual Studio 轻松安装
- 用于开发的免费试用测试。许可证来自 $749。
使用 IronXL 软件库,在 C&num 和 VB.NET 中轻松读取和创建 Excel 文件。
使用 IronXL 读取 .XLS 和 .XLSX Excel 文件
以下是使用 IronXL 读取 Excel 文件的整体工作流程摘要:
1.安装 IronXL Excel 库。我们可以使用 NuGet 软件包 或下载 .Net Excel DLL.
2.使用 WorkBook.Load
方法读取任何 XLS、XLSX 或 CSV 文档。
3.使用直观的语法获取单元格值:表格 ["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# 库
开始在您的项目中使用IronPDF,并立即获取免费试用。
查看 IronXL 上 Nuget 用于快速安装和部署。它有超过800万次下载,正在使用C#改变Excel。
Install-Package IronXL.Excel
考虑安装 IronXL DLL 直接。下载并手动安装到您的项目或GAC表单中: IronXL.zip
手动安装到你的项目中
下载DLL首先,我们需要安装 IronXL.Excel
库,为 .NET 框架添加 Excel 功能。
安装 IronXL.Excel
最方便的方式是使用我们的 NuGet 包,当然你也可以选择手动安装。 DLL 到项目或全局程序集缓存中。
安装 IronXL NuGet 软件包
1.在 Visual Studio 中,右键单击项目,选择 "管理 NuGet 包..."。
2.搜索 IronXL.Excel 软件包,点击安装按钮将其添加到项目中
另一种安装 IronXL 库的方法是使用 NuGet 包管理器控制台:
1.进入软件包管理器控制台
2.键入 > 安装软件包 IronXL.Excel
.
PM > Install-Package IronXL.Excel
此外,您还可以 在 NuGet 网站上查看软件包
手动安装
或者,我们可以先下载 IronXL .NET Excel DLL 并手动安装到 Visual Studio。
2.加载 Excel 工作簿
加载 Excel 工作簿 工作簿 类表示 Excel 工作表。要使用 C&num 打开 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
每个 "工作簿 "可以有多个 工作表 对象。每个对象代表 Excel 文档中的一个 Excel 工作表。使用 工作簿.获取工作表 方法获取特定 Excel 工作表的引用。
: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)
样本 ApiToExcelProcessor
注意:使用 ExcelFileFormat.XLS
以支持 Microsoft Excel 的旧版本 (95 及更早).
在 Excel 文档中添加工作表
如前所述,IronXL "工作簿 "包含一个或多个 "工作表 "的集合。
要创建新的工作表,请调用 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.访问单元格值
读取和编辑单个单元格
访问单个电子表格单元格的值时,需要从其 "工作表 "中检索所需的单元格,如下所示:
: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) 使用标准数组索引语法。
通过对 Cell 对象的引用,我们可以读写电子表格单元格中的数据:
: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 "类表示一个由 "单元格 "对象组成的二维集合。该集合指的是 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")
样本: 数据验证
有几种方法可以读取或编辑范围内单元格的值。如果已知计数,则使用 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
样本: 数据验证
在电子表格中添加公式
用 公式 财产
下面的代码会遍历每个州,并在 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 验证数据表。数据验证 "示例使用 "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
上述代码循环查看电子表格中的每一行,并以列表形式抓取单元格。每个 validates 方法都会检查单元格的值,如果值无效,则返回错误信息。
这段代码将创建一个新工作表,指定页眉,并输出错误信息结果,以便记录无效数据。
: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.使用实体框架导出数据
使用 IronXL 将数据导出到数据库或将 Excel 电子表格转换为数据库。ExcelToDB "示例读取按国家分列的国内生产总值电子表格,然后将数据导出到 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()
: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
创建一个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.从应用程序接口下载数据到电子表格
下面的调用使用 RestClient.Net.它下载 JSON 并将其转换为 "RestCountry "类型的 "List"。然后就可以轻松地遍历每个国家,并将数据从 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
这就是 API JSON 数据的样子。
以下代码会遍历所有国家,并在电子表格中设置名称、人口、地区、数字代码和前 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
对象参考和资源
您还可以找到 IronXL 类文档 在对象参考中具有重要价值。
此外,还有其他教程可帮助您了解 "IronXL.Excel "的其他方面,包括 创建, 打开、编写、编辑、保存和导出 XLS、XLSX 和 CSV 文件,而无需使用 Excel Interop。
摘要
IronXL.Excel 是一个单独的 .NET 软件库,用于读取各种电子表格格式。它不需要 微软Excel 安装,而不依赖于 Interop。
如果您发现.NET 库在修改 Excel 文件时非常有用,您可能也有兴趣了解一下 Google Sheets API 客户端库 它允许你修改 Google Sheets。
教程快速访问
在 GitHub 上探索此教程
GitHub 上有该项目的 C&num 和 VB.NET 源代码。
使用此代码,只需几分钟就能轻松上手并运行。该项目保存为 Microsoft Visual Studio 2017 项目,但兼容任何 .NET IDE。
如何用 C&num 读取 Excel 文件;在 GitHub 上