C#中ExcelDataReader的具體使用
今天來(lái)給大家介紹一下ExcelDataReader,ExcelDataReader是一個(gè)輕量級(jí)的可快速讀取Excel文件中數(shù)據(jù)的工具。話(huà)不多說(shuō)直接開(kāi)始。
ExcelDataReader簡(jiǎn)介
ExcelDataReader支持.xlsx、.xlsb、.xls、.csv格式文件的讀取,版本基本在2007及以上版本,支持的格式和版本看下圖。

我們首先需要再VS中添加ExcelDataReader程序集,在 工具 -> NuGet包管理器 -> 管理解決方案的NuGet程序包 中搜索ExcelDataReader,并安裝到工程中。如下圖:


ExcelDataReader和ExcelDataReader.DataSet都可以調(diào)用ExcelDataReader庫(kù),官網(wǎng)介紹由于版本升級(jí)問(wèn)題,如果需要使用AsDataSet()方法則需要安裝ExcelDataReader.DataSet。
ExcelDataReader使用
我們下來(lái)介紹一下ExcelDataReader對(duì)于數(shù)據(jù)的讀取,有兩種方式可以讀取Excel,IExcelDataReader方法和DataSet方法。
我們先來(lái)展示一下Excel文件的示例,圖1是Sheet1,圖2是Sheet2


IExcelDataReader
首先我們需要通過(guò) File.OpenRead 來(lái)獲取 Excel.xlsx 的文件流數(shù)據(jù)。通過(guò) ExcelReaderFactory.CreateReader 接口來(lái)創(chuàng)建 IExcelDataReader reader 對(duì)象,reader采取的是逐個(gè)工作表、逐行的方式讀取數(shù)據(jù),然后通過(guò) reader.GetString(0) 獲取數(shù)據(jù)。
reader默認(rèn)為第一個(gè)工作表,第一行數(shù)據(jù)開(kāi)始。調(diào)用 reader.NextResult() 接口 reader 會(huì)移入下一個(gè)工作表。調(diào)用 reader.Read() 接口 reader 會(huì)讀取一行數(shù)據(jù)。reader.GetString(0) 接口是通過(guò)索引來(lái)獲取字符串?dāng)?shù)據(jù),除此之外 reader 還有其他獲取不同類(lèi)型數(shù)據(jù)的接口,小伙伴可以自行查閱文檔。
由于 IExcelDataReader 采用的是逐頁(yè)、逐行讀取數(shù)據(jù)的方式,這種方式隨便不夠靈活便捷,但由于每次讀取數(shù)據(jù)量少,所以在運(yùn)行效率和性能上有比較大的優(yōu)勢(shì)。
using System.Text;
using ExcelDataReader;
public class Program
{
static void Main(string[] args)
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
string filePath = "Excel.xlsx";
using (FileStream stream = File.OpenRead(filePath))
{
using (IExcelDataReader reader = ExcelReaderFactory.CreateReader(stream))
{
// 1. Use the reader methods
do
{
Console.WriteLine($"Sheet name:{reader.Name}");
while (reader.Read())
{
Console.WriteLine($"{reader.GetString(0)} \t\t{reader.GetString(1)}");
}
Console.WriteLine();
} while (reader.NextResult());
}
}
}
}AsDataSet
同樣我們需要通過(guò) File.OpenRead 來(lái)獲取 Excel.xlsx 的文件流數(shù)據(jù),然后通過(guò) ExcelReaderFactory.CreateReader 接口來(lái)創(chuàng)建 IExcelDataReader reader 對(duì)象,這與之前的操作一樣。
之后我們通過(guò) reader.AsDataSet() 接口來(lái)獲取 DataSet dataSet 對(duì)象,dataSet 可以采用索引的方式來(lái)獲取數(shù)據(jù)。通過(guò) dataSet.Tables[0] 可以獲取到 DataTable dataTable 對(duì)象。dataTable 就是Excel的工作頁(yè),輸出 dataTable.TableName 可以獲取到工作頁(yè)名稱(chēng)。我們?cè)偻ㄟ^(guò) dataTable.Rows[0] 來(lái)獲取 DataRow dataRow 對(duì)象,dataRow 是當(dāng)前工作頁(yè)下每一行的數(shù)據(jù),通過(guò) dataRow[0] 可以獲取單元格中的數(shù)據(jù)。
除了索引獲取數(shù)據(jù)以外,依然可以通過(guò)遍歷的方式來(lái)獲取數(shù)據(jù),示例代碼如下。
using System.Data;
using System.Text;
using ExcelDataReader;
public class Program
{
static void Main(string[] args)
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
string filePath = "Excel.xlsx";
using (FileStream stream = File.OpenRead(filePath))
{
using (IExcelDataReader reader = ExcelReaderFactory.CreateReader(stream))
{
// 2. Use the AsDataSet extension method
DataSet dataSet = reader.AsDataSet();
DataTable dataTable = dataSet.Tables[0];
Console.WriteLine(dataTable.TableName);
DataRow dataRow = dataTable.Rows[0];
Console.WriteLine($"{dataRow[0]} {dataRow[1]}\n");
foreach (DataTable table in dataSet.Tables)
{
Console.WriteLine(table.TableName);
foreach (DataRow row in table.Rows)
{
Console.WriteLine($"{row[0]} \t{row[1]}");
}
Console.WriteLine();
}
}
}
}
}補(bǔ)充說(shuō)明
需要補(bǔ)充說(shuō)明一下的是 ExcelDataReader 在.NET Core 和 .NET 5.0 或更高版本中會(huì)拋出encoding 1252的錯(cuò)誤編碼。解決辦法就是需要為System.Text.Encoding.CodePages添加一個(gè)依賴(lài)項(xiàng),在代碼中添加 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); 這段代碼
官方文檔鏈接
ExcelDataReader鏈接:https://github.com/ExcelDataReader/ExcelDataReader
到此這篇關(guān)于C#中ExcelDataReader的具體使用的文章就介紹到這了,更多相關(guān)C# ExcelDataReader內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C#如何將DataTable導(dǎo)出到Excel解決方案
- C#操作EXCEL DataTable轉(zhuǎn)換的實(shí)例代碼
- C#將Excel中的數(shù)據(jù)轉(zhuǎn)換成DataSet
- C#實(shí)現(xiàn)將DataTable內(nèi)容輸出到Excel表格的方法
- C#使用Datatable導(dǎo)出Excel
- C#中DataGridView導(dǎo)出Excel的兩種方法
- C#把EXCEL數(shù)據(jù)轉(zhuǎn)換成DataTable
- C#把DataTable導(dǎo)出為Excel文件
- C#實(shí)現(xiàn)讀取Excel文件并將數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)和DataTable
相關(guān)文章
Unity實(shí)現(xiàn)蘋(píng)果手機(jī)Taptic震動(dòng)
這篇文章主要介紹了Unity實(shí)現(xiàn)蘋(píng)果手機(jī)Taptic震動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10
C#實(shí)現(xiàn)IDisposable接口釋放非托管資源
這篇文章主要為大家介紹了C#實(shí)現(xiàn)IDisposable接口釋放非托管資源,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
簡(jiǎn)單了解C#設(shè)計(jì)模式編程中的橋接模式
這篇文章主要介紹了C#設(shè)計(jì)模式編程中的橋接模式,橋接模式經(jīng)常應(yīng)用于解耦邏輯層與數(shù)據(jù)操作層,需要的朋友可以參考下2016-02-02
基于C#編寫(xiě)一個(gè)遠(yuǎn)程桌面應(yīng)用
封閉環(huán)境無(wú)法拷貝外來(lái)的遠(yuǎn)程桌面軟件,所以這篇文章小編就來(lái)帶大家用C#編寫(xiě)一個(gè)簡(jiǎn)單的遠(yuǎn)程桌面應(yīng)用,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10
C#實(shí)現(xiàn)判斷文件夾存在與否并創(chuàng)建文件夾的方法
這篇文章主要介紹了C#實(shí)現(xiàn)判斷文件夾存在與否并創(chuàng)建文件夾的方法,涉及C#針對(duì)文件及目錄的判斷與創(chuàng)建操作相關(guān)技巧,需要的朋友可以參考下2017-02-02
c#中DataTable轉(zhuǎn)List的2種方法示例
這篇文章主要給大家介紹了關(guān)于c#中DataTable轉(zhuǎn)List的2種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
Unity實(shí)現(xiàn)滑動(dòng)更換界面效果
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)滑動(dòng)更換界面效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07

