從excel匯入資料最令人頭疼的是資料格式的相容性,特別是日期型別的相容性。為了能夠無腦匯入日期,折騰了一天的npoi。在經過測試確實可以匯入任意格式的合法日期後,寫下這篇小文,與大家共享。完整**請移步:
2016-11-13 04:06 修正乙個bug。由try datecellvalue改為判斷列資料型別,如型別為datetiime返回datecellvalue,否則返回numericcellvalue或stringcellvalue。
概述:這個幫助類是乙個泛型類,泛型引數對應的實體類還起到模板的作用。如果你的excel檔案使用與實體類不同的列標題的話,可以通過給屬性加上alias特性,將列標題和屬性進行對應。例如:
excel格式如圖:
實體類:
1返回的json: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 }
1[21、類主體,負責根據傳入的檔案路徑讀取資料,並呼叫其他私有方法對資料進行處理。最後轉換成list並序列化成json返回。,8,14
20 ]
12、getsheetdata方法,負責將sheet中的資料讀取到datatable。這裡通過實體類屬性的特性值作為列名,屬性型別作為列資料型別來初始化datatable。當然,首行是例外,因為首行是列標題而非資料。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 }
1初始化datatable的方法:///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 }
1生成模板字典的方法:///2
///初始化datatable
3///
4///
當前資料表
5///
datatable
6private
datatable inittable(isheet sheet)714
15try
1625
26return
table;27}
28catch
2933 }
13、重點來了!///2
///獲取指定型別的屬性名稱/型別字典
3///
4///
dictionary
5private dictionarygetdictionary()618
else
1922
23dict.add(name, p.propertytype);24}
2526
return
dict;
27 }
因為日期/時間在excel中可能被表示為文字格式或日期格式(其實是numeric型別),所以在celltype為string/numeric的時候,如果列資料型別為datetime,則取cell的datecellvalue,否則取cell的stringcellvalue/numericcellvalue就好了。
這樣,無論日期是文字或日期格式,都可以完美獲取。
14、datatable轉成list的方法:///2
///讀excel單元格的資料
3///
4///
excel單元格
5///
列資料型別
6///
object 單元格資料
7private
object
getcelldata(icell cell, type type)
832 }
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...