基於NPOI的Excel資料匯入

2022-01-11 11:51:08 字數 3852 閱讀 7092

從excel匯入資料最令人頭疼的是資料格式的相容性,特別是日期型別的相容性。為了能夠無腦匯入日期,折騰了一天的npoi。在經過測試確實可以匯入任意格式的合法日期後,寫下這篇小文,與大家共享。完整**請移步:

2016-11-13 04:06 修正乙個bug。由try datecellvalue改為判斷列資料型別,如型別為datetiime返回datecellvalue,否則返回numericcellvalue或stringcellvalue。

概述:這個幫助類是乙個泛型類,泛型引數對應的實體類還起到模板的作用。如果你的excel檔案使用與實體類不同的列標題的話,可以通過給屬性加上alias特性,將列標題和屬性進行對應。例如:

excel格式如圖:

實體類:

1

using

system;

2using

insight.utils.common;34

namespace

insight.ws.server.common.entity510

11 [alias("

物流公司")]

12public

string service

1314 [alias("

物流單號")]

15public

string number

1617 [alias("

發貨時間")]

18public datetime deliverytime 19}

20 }

返回的json:

1[2

,8,14

20 ]

1、類主體,負責根據傳入的檔案路徑讀取資料,並呼叫其他私有方法對資料進行處理。最後轉換成list並序列化成json返回。

1

using

system;

2using

system.collections.generic;

3using

system.data;

4using

system.io;

5using

insight.utils.entity;

6using

npoi.ss.usermodel;78

namespace

insight.utils.common927

28iworkbook book;

29using (var file = new

filestream(path, filemode.open, fileaccess.read))

3033

34if (index >=book.numberofsheets)

3539

40var sheet =book.getsheetat(index);

41var table =getsheetdata(sheet);

42var list = util.converttolist(table);

43_result.success(list);

44return

_result;45}

46}47 }

2、getsheetdata方法,負責將sheet中的資料讀取到datatable。這裡通過實體類屬性的特性值作為列名,屬性型別作為列資料型別來初始化datatable。當然,首行是例外,因為首行是列標題而非資料。

1

///2

///讀取sheet中的資料到datatable

3///

4///

當前資料表

5///

datatable

6private

datatable getsheetdata(isheet sheet)725

catch

(exception)

262930}

31table.rows.add(dr);32}

3334

return

table;

35 }

初始化datatable的方法:

1

///2

///初始化datatable

3///

4///

當前資料表

5///

datatable

6private

datatable inittable(isheet sheet)714

15try

1625

26return

table;27}

28catch

2933 }

生成模板字典的方法:

1

///2

///獲取指定型別的屬性名稱/型別字典

3///

4///

dictionary

5private dictionarygetdictionary()618

else

1922

23dict.add(name, p.propertytype);24}

2526

return

dict;

27 }

3、重點來了!

因為日期/時間在excel中可能被表示為文字格式或日期格式(其實是numeric型別),所以在celltype為string/numeric的時候,如果列資料型別為datetime,則取cell的datecellvalue,否則取cell的stringcellvalue/numericcellvalue就好了。

這樣,無論日期是文字或日期格式,都可以完美獲取。

1

///2

///讀excel單元格的資料

3///

4///

excel單元格

5///

列資料型別

6///

object 單元格資料

7private

object

getcelldata(icell cell, type type)

832 }

4、datatable轉成list的方法:

1

///2

///將datatable轉為list

3///

4///

datatable

5///

list

6public

static listconverttolist(datatable table) where t: new()7

22else

2326

27if

(table.columns.contains(name))

2836}37

list.add(obj);38}

39return

list;

40 }

自定義特性:

1

using

system;23

namespace

insight.utils.common412

13///

14///

構造方法

15///

16///

別名17

public aliasattribute(string

alias)

1821

}22 }

請大家對此多發表意見和建議,謝謝。

NPOI匯出資料到Excel

asp.net操作excel已經是老生長談的事情了,可下面我說的這個npoi操作excel,應該是最好的方案了,沒有之一,使用npoi能夠幫助開發者在沒有安裝微軟office的情況下讀寫office 97 2003的檔案,支援的檔案格式包括xls,doc,ppt等。npoi是構建在poi 3.x版本...

NPOI匯出資料到Excel

asp.net操作excel已經是老生長談的事情了,可下面我說的這個npoi操作excel,應該是最好的方案了,沒有之一,使用npoi能夠幫助開發者在沒有安裝微軟office的情況下讀寫office 97 2003的檔案,支援的檔案格式包括xls,doc,ppt等。npoi是構建在poi 3.x版本...

NPOI讀取Excel資料應用

npoi 是 poi專案的 net 版本。使用 npoi 你就可以在沒有安裝 office 或者相應環境的機器上對 word excel 文件進行讀寫。npoi 是構建在 poi 3.x 版本之上的,它可以在沒有安裝 office 的情況下對 word excel 文件進行讀寫操作。需求 根據exc...