推薦一個(gè)有用的Excel操作類庫 LinqToExcel

GitHub: LinqToExcel

以前項(xiàng)目中對(duì)Excel進(jìn)行信息讀取,我都是使用的NPOI的封裝類,給定一個(gè)fileurl,然后返回給我一個(gè)datatable。接下去自己去解析數(shù)據(jù)。如果使用這種方式,那開發(fā)者就還要有點(diǎn)小痛苦,因?yàn)槲覀冞€要在此基礎(chǔ)上自己做一些處理,才可以得到我們想要的數(shù)據(jù),例如:行列匹配,定義一個(gè)實(shí)體,一行一行取值,一列一列賦值,這樣的操作沒有意義,而且機(jī)械。突然有一天我在博客園上看到了一個(gè)Excel操作庫,LinqtoExcel,然后我看了一下操作方式和內(nèi)容,突然覺得陽光普照大地,眼前一片光明。

下面我簡(jiǎn)單介紹以下LinqtoExcel的優(yōu)點(diǎn)和缺點(diǎn)

優(yōu)點(diǎn)

兼容

以往我們通過NPOI操作數(shù)據(jù)庫的時(shí)候,.xlsx和.xls是需要區(qū)分處理的。而Linqtoexcel則沒有這個(gè)問題,作者已經(jīng)封裝好了。一個(gè)方法,操作任一后綴,很舒服。

API操作方便

下面的代碼相當(dāng)?shù)暮?jiǎn)單,通過這樣的一行代碼我們就能夠?qū)xcel表中的內(nèi)容變成實(shí)體集合
簡(jiǎn)單解釋一下代碼的意思
1 首先創(chuàng)建一個(gè)excel文件,定義倆列,公司名稱和地址,程序讀取集合數(shù)據(jù)。
2 定義一個(gè)實(shí)體類,倆個(gè)字段,Excel Colunm特性標(biāo)簽表明Excel中列和屬性英文名稱的匹配
3 實(shí)例化ExcelQueryFactory (Excel查詢工廠),參數(shù)是文件路徑
.Worksheet<T> T中寫我們定義的實(shí)體
4 結(jié)束
是不是特別的簡(jiǎn)單,特別的好用!

excel內(nèi)容.png
public class Company
{
    [ExcelColumn("公司名稱")]
    public string Name { get; set; }

    [ExcelColumn("地址")] 
    public string Address{ get; set; }
}
var excel = new ExcelQueryFactory("excel文件路徑");
var indianaCompanies = (from c in excel.Worksheet<Company>()
                       select c;

如果我們自定義了Sheet表的名稱怎么辦呢,程序能夠識(shí)別到嗎?答案是不能。但是有方法哈,O(∩_∩)O
只要在上面的內(nèi)容修改一點(diǎn)點(diǎn),重載方法給定一個(gè)參數(shù),就是工作表名就可以了。
像上面什么都沒有給定的,是因?yàn)镋xcel工作簿默認(rèn)第一個(gè)工作表是"Sheet1",所以如果我們什么參數(shù)都不加,就相當(dāng)與是"Sheet1"。我們只要改動(dòng)了工作表名稱,就一定要賦參數(shù)

var excel = new ExcelQueryFactory("excel文件路徑");
var oldCompanies = from c in excel.Worksheet<Company>("工作表名") 
                   select c;

上面是我們自己定義的實(shí)體類,完成了列名稱和實(shí)體屬性的轉(zhuǎn)換,如果我們要自己做這個(gè)事情呢,我們又改如何做,如下所示就可以了,api提供了倆種方式,一個(gè)簡(jiǎn)單方法,一個(gè)泛型方法。

var excel = new ExcelQueryFactory("excel文件路徑");
excel.AddMapping<Company>(x => x.Name, "公司名稱"); 
excel.AddMapping("Address", "地址");  

var indianaCompanies = from c in excel.Worksheet<Company>()
                        select c;

LinqToExcel還有很多很有趣的方法,大家可以去官網(wǎng)自己看,自己實(shí)踐,作者這里不多做敘述。

缺點(diǎn)

轉(zhuǎn)換實(shí)體沒有錯(cuò)誤提示

問題是我在工作過程種使用這個(gè)類庫覺得很變扭的一個(gè)地方,如果有大神有比較好的解決方案,希望給我留言,互相學(xué)習(xí)。對(duì)這個(gè)類庫的缺點(diǎn)我自己封裝了一個(gè)幫助類庫LinqToExcel.Extend,我會(huì)在后期的文章種給予說明。

問題描述
問題代碼如下,不能說這一樣有問題,而是在某種情況下會(huì)觸發(fā)exception,是什么情況呢。見下圖
我們可以看到開業(yè)日期這一列有一個(gè)數(shù)據(jù)日期格式出錯(cuò),這個(gè)時(shí)候如果調(diào)用方法就會(huì)報(bào)錯(cuò),因?yàn)轭愋娃D(zhuǎn)換不成功,實(shí)質(zhì)上來說這沒問題,可是有這么一個(gè)場(chǎng)景。
一般這種需要上傳Excel的都是導(dǎo)入操作,客戶很多時(shí)候填寫數(shù)據(jù),因?yàn)榇中幕蛘呤韬觯苋菀滋铄e(cuò),所以我們一般會(huì)對(duì)excel文件先進(jìn)行一下解析,如果有問題的字段,會(huì)告訴使用者:“XX”行“XX”列字段有問題 問題如下XXX 類似這樣的提示。
我本來以為這個(gè)類庫會(huì)大致給一個(gè)提示信息,我可以不用再封裝,結(jié)果是沒有。好啵,那我就只能自己封裝一個(gè)了。

from c in excel.Worksheet<Company>()

public class Company
{
    [ExcelColumn("公司名稱")]
    public string Name { get; set; }

    [ExcelColumn("開業(yè)日期")] 
    public Datetime StartDate{ get; set; }
}

excel內(nèi)容.png

使用范圍有限

可能是因?yàn)樾〉苁褂盟接邢?,我發(fā)現(xiàn)這個(gè)類庫只適用于規(guī)規(guī)矩矩的行列數(shù)據(jù),對(duì)特殊的一些數(shù)量沒有辦法識(shí)別,這里的特殊不是說多么變態(tài)的需求。我還是舉例子,下面的圖片是我們實(shí)際過程種可能碰到的需求,即表格的數(shù)據(jù)列不一定在第一行,沒有一個(gè)方法讓我選定從哪一行開始選取數(shù)據(jù)集。
大家不要說有的,官網(wǎng)里面有的,我們通過指定開始并和結(jié)束作為判斷條件。我是覺得很不舒服,我并不能確認(rèn)我的結(jié)束行在哪里,然后寫個(gè)F80或者E999嗎,代碼不美觀。

var excel = new ExcelQueryFactory("excelFileName");
var indianaCompanies = from c in excel.WorksheetRange<Company>("B3", "G10")
                       select c;
excel例子.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容