天天看點

推薦一個有用的Excel操作類庫 LinqToExcel

GitHub: LinqToExcel

以前項目中對Excel進行資訊讀取,我都是使用的NPOI的封裝類,給定一個fileurl,然後傳回給我一個datatable。接下去自己去解析資料。如果使用這種方式,那開發者就還要有點小痛苦,因為我們還要在此基礎上自己做一些處理,才可以得到我們想要的資料,例如:行列比對,定義一個實體,一行一行取值,一列一列指派,這樣的操作沒有意義,而且機械。突然有一天我在部落格園上看到了一個Excel操作庫,LinqtoExcel,然後我看了一下操作方式和内容,突然覺得陽光普照大地,眼前一片光明。

下面我簡單介紹以下LinqtoExcel的優點和缺點

優點

相容

以往我們通過NPOI操作資料庫的時候,.xlsx和.xls是需要區分處理的。而Linqtoexcel則沒有這個問題,作者已經封裝好了。一個方法,操作任一字尾,很舒服。

API操作友善

下面的代碼相當的簡單,通過這樣的一行代碼我們就能夠将excel表中的内容變成實體集合

簡單解釋一下代碼的意思

1 首先建立一個excel檔案,定義倆列,公司名稱和位址,程式讀取集合資料。

2 定義一個實體類,倆個字段,Excel Colunm特性标簽表明Excel中列和屬性英文名稱的比對

3 執行個體化ExcelQueryFactory (Excel查詢工廠),參數是檔案路徑

.Worksheet<T> T中寫我們定義的實體

4 結束

是不是特别的簡單,特别的好用!

推薦一個有用的Excel操作類庫 LinqToExcel

excel内容.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表的名稱怎麼辦呢,程式能夠識别到嗎?答案是不能。但是有方法哈,O(∩_∩)O

隻要在上面的内容修改一點點,重載方法給定一個參數,就是工作表名就可以了。

像上面什麼都沒有給定的,是因為Excel工作簿預設第一個工作表是"Sheet1",是以如果我們什麼參數都不加,就相當與是"Sheet1"。我們隻要改動了工作表名稱,就一定要賦參數

var excel = new ExcelQueryFactory("excel檔案路徑");
var oldCompanies = from c in excel.Worksheet<Company>("工作表名") 
                   select c;
           
上面是我們自己定義的實體類,完成了列名稱和實體屬性的轉換,如果我們要自己做這個事情呢,我們又改如何做,如下所示就可以了,api提供了倆種方式,一個簡單方法,一個泛型方法。
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還有很多很有趣的方法,大家可以去官網自己看,自己實踐,作者這裡不多做叙述。

缺點

轉換實體沒有錯誤提示

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

問題描述

問題代碼如下,不能說這一樣有問題,而是在某種情況下會觸發exception,是什麼情況呢。見下圖

我們可以看到開業日期這一列有一個資料日期格式出錯,這個時候如果調用方法就會報錯,因為類型轉換不成功,實質上來說這沒問題,可是有這麼一個場景。

一般這種需要上傳Excel的都是導入操作,客戶很多時候填寫資料,因為粗心或者疏忽,很容易填錯,是以我們一般會對excel檔案先進行一下解析,如果有問題的字段,會告訴使用者:“XX”行“XX”列字段有問題 問題如下XXX 類似這樣的提示。

我本來以為這個類庫會大緻給一個提示資訊,我可以不用再封裝,結果是沒有。好啵,那我就隻能自己封裝一個了。

from c in excel.Worksheet<Company>()

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

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

           
推薦一個有用的Excel操作類庫 LinqToExcel

使用範圍有限

可能是因為小弟使用水準有限,我發現這個類庫隻适用于規規矩矩的行列資料,對特殊的一些數量沒有辦法識别,這裡的特殊不是說多麼變态的需求。我還是舉例子,下面的圖檔是我們實際過程種可能碰到的需求,即表格的資料列不一定在第一行,沒有一個方法讓我標明從哪一行開始選取資料集。

大家不要說有的,官網裡面有的,我們通過指定開始并和結束作為判斷條件。我是覺得很不舒服,我并不能确認我的結束行在哪裡,然後寫個F80或者E999嗎,代碼不美觀。

var excel = new ExcelQueryFactory("excelFileName");
var indianaCompanies = from c in excel.WorksheetRange<Company>("B3", "G10")
                       select c;
           
推薦一個有用的Excel操作類庫 LinqToExcel

excel例子.png

繼續閱讀