|
|
|
|
|
早在 .NET Core 出現(xiàn)之前,用代碼打開(kāi) Excel 文件一直是一種痛苦的經(jīng)歷。在許多情況下,你實(shí)際上需要在目標(biāo)/用戶計(jì)算機(jī)上安裝 Excel 應(yīng)用程序才能通過(guò)代碼打開(kāi) Excel 文件。如果你以前不得不使用那些“OLE DB Jet”查詢,你就會(huì)知道這不是很好的體驗(yàn)。幸運(yùn)的是,現(xiàn)在有一些非常好的開(kāi)源解決方案不需要目標(biāo)機(jī)器上的 Excel。這對(duì) Windows 用戶有好處,這樣你就不必在目標(biāo)用戶機(jī)器或 Web 服務(wù)器上安裝 Excel,而且對(duì)在 Linux(甚至 Mac/ARM)上托管 .NET Core 應(yīng)用程序的人也有好處——Excel 顯然無(wú)處可去被看到!
我寫(xiě)這篇文章的方法非常簡(jiǎn)單。使用幾個(gè)工作表、幾個(gè)公式和幾個(gè)特殊格式案例創(chuàng)建一個(gè)標(biāo)準(zhǔn)化的 Excel 工作簿。在每個(gè)庫(kù)中讀取相同的數(shù)據(jù),看看哪個(gè)最適合我。
請(qǐng)注意如果你正在讀取一個(gè)沒(méi)有公式的單個(gè)sheet的Excel工作表,你應(yīng)該改為使用標(biāo)準(zhǔn) CSV 技術(shù)解析它。我這里有幾篇關(guān)于在 C# .NET 中解析 CSV 的精彩文章,你應(yīng)該遵循這篇文章。CSV 解析器非常適合獲取表格數(shù)據(jù)并將其反序列化為對(duì)象,應(yīng)該盡可能使用。
示例數(shù)據(jù)
我認(rèn)為比較所提供的不同庫(kù)的最佳方法是創(chuàng)建一個(gè)簡(jiǎn)單的電子表格來(lái)比較我們讀取數(shù)據(jù)的不同方式。電子表格將有兩個(gè)“工作表”,其中第二個(gè)工作表引用第一個(gè)。
工作表 1 被命名為“First Sheet”,看起來(lái)像這樣:
請(qǐng)注意,單元格 A2 只是數(shù)字“1”。然后在 B2 列中,我們引用了單元格 A2。這是因?yàn)槲覀円獧z查庫(kù)是否允許我們不僅從單元格中獲取“公式”,而且還允許我們計(jì)算出的值應(yīng)該是什么。
我們還將單元格 A2 的字體顏色設(shè)置為紅色,并且 B2 具有完整的邊框(雖然很難看到,因?yàn)槲艺趪L試顯示公式)。稍后我們將嘗試提取這些樣式元素。
Sheet 2 被命名為“Second Sheet”,看起來(lái)像這樣:
所以我們正在做一個(gè)簡(jiǎn)單的“SUM”公式并引用第一張表。同樣,這樣我們就可以測(cè)試獲取公式和計(jì)算值,但這次是跨不同的工作表。對(duì)于習(xí)慣于使用 Excel 的人來(lái)說(shuō),這并不復(fù)雜,但讓我們看看一些庫(kù)是如何處理它的。
一般來(lái)說(shuō),在我的測(cè)試中,我希望我的輸出始終遵循相同的格式:
Sheet 1 Data
Cell A2 Value :
Cell A2 Color :
Cell B2 Formula :
Cell B2 Value :
Cell B2 Border :
Sheet 2 Data
Cell A2 Formula :
Cell A2 Value :
這樣當(dāng)我展示代碼時(shí),你可以選擇對(duì)你來(lái)說(shuō)最有意義的庫(kù)。
EPPlus
當(dāng)我第一次開(kāi)始在 .NET Core 中尋找解析 Excel 時(shí),我記得很多個(gè)月前使用 EPPlus 進(jìn)行一些非常輕量級(jí)的 Excel 解析??梢栽诖颂幷业?nuget 包:
https://www.nuget.org/packages/EPPlus/
它也是開(kāi)源的,所以如果你喜歡的話,你可以通讀源代碼:
https://github.com/JanKallman/EPPlus
讀取我們的 Excel 電子表格的代碼如下所示:
static void Main(string[] args)
{
using(var package = new ExcelPackage(new FileInfo("Book.xlsx")))
{
var firstSheet = package.Workbook.Worksheets["First Sheet"];
Console.WriteLine("Sheet 1 Data");
Console.WriteLine($"Cell A2 Value : {firstSheet.Cells["A2"].Text}");
Console.WriteLine($"Cell A2 Color : {firstSheet.Cells["A2"].Style.Font.Color.LookupColor()}");
Console.WriteLine($"Cell B2 Formula : {firstSheet.Cells["B2"].Formula}");
Console.WriteLine($"Cell B2 Value : {firstSheet.Cells["B2"].Text}");
Console.WriteLine($"Cell B2 Border : {firstSheet.Cells["B2"].Style.Border.Top.Style}");
Console.WriteLine("");
var secondSheet = package.Workbook.Worksheets["Second Sheet"];
Console.WriteLine($"Sheet 2 Data");
Console.WriteLine($"Cell A2 Formula : {secondSheet.Cells["A2"].Formula}");
Console.WriteLine($"Cell A2 Value : {secondSheet.Cells["A2"].Text}");
}
}
這是*超級(jí)*簡(jiǎn)單,開(kāi)箱即用。它完美地選擇了公式與文本!我們第一張紙上的樣式也很容易上手。邊框有點(diǎn)煩人,因?yàn)槟惚仨殭z查邊框的“樣式”,如果樣式為“無(wú)”,則表示沒(méi)有邊框(與“HasBorder”或類(lèi)似的布爾值相反)。但我認(rèn)為我只是吹毛求疵,EPPlus 確實(shí)有效!
總結(jié)
本文介紹了用EPPlus在C# .NET中讀取Excel文件的案例,希望對(duì)你有幫助。
相關(guān)文章