相信大家都玩過npoi這個第三方元件,我就分享一下我平時使用的工具類,如果有不好的地方,請賜教!
npoi是乙個開源的c#讀寫excel、word等微軟ole2元件文件的專案。控制台:
命令:
輸入命令之後,回車即安裝install-package npoi
安裝npoi之後,程式中就已經把npoi服務整合到我們程式了,我們現在來建立乙個幫助類,編寫讀取execl和匯出execl。我這裡的讀取execl,把每乙個sheet頁當做乙個datatable,多個datatable組成乙個dataset,然後將dataset返回。思考?/// /// excel匯入成datatble
///
/// 匯入路徑(包含檔名與副檔名)
///
public static dataset exceltotable(string file, ref listlist_sheetname)
else if (fileext == ".xls") else
if (workbook == null)
for (int k = 0; k < workbook.numberofsheets; k++)
else
dt.columns.add(new datacolumn(obj.tostring()));
columns.add(i);
}dt.columns.add(new datacolumn("sheetname"));
//資料
for (int i = sheet.firstrownum + 1; i <= sheet.lastrownum; i++)}}
if (hasvalue)
}ds.tables.add(dt);}}
}return ds;
}/// /// 獲取單元格型別
///
/// 目標單元格
///
private static object getvaluetype(icell cell)
}
我這裡讀取之後是乙個dataset集合,但是這種資料集雖然在結構上很清晰,乙個datatable對應乙個sheet,但是處理器資料其他麻煩(比如,我想查詢表中name為"張三"的使用者資訊,肯定是不好查詢的),還是就是如果在每個sheet資料格式相同的情況下,肯定會有想把它們整合在一起的想法,那該如何整合在一起?思路:要是能轉換為list陣列就好,我們就能使用linq和lambda進行資料的快速處理。如何把dataset轉換為list,我們可以觀察execl中的資料,然後對應在專案中建立乙個model類,用英文做欄位,用displayname標識對應的中文(為什麼要這樣,後面會講),建立乙個list,現在只要把dataset中的datatable取出來,然後利用反射的方式,比較datatable中的列名和model中對應的displayname,如何一樣,,則儲存到list,這裡存在乙個datatable轉換為list。datatable轉換listexecl資料:
mode類:
只要這樣一一對應起來,後期委會也好維護,比如新增了乙個列,在model中加乙個字段即可,方便擴充套件,如果是多個sheet,每個sheet略有不同,就可以使用c#物件導向的思想,提取它們共同的字段,其他做繼承,這裡就不多說了。接下來講講如何做dataset轉換為list,其實dataset中就是好多datatable組成,如果能實現datatable轉換到list,其他就迎刃而解!
public static class datatabletolist
else
info.setvalue(s, v, null);}}
catch (exception ex)}}
list.add(s);
}return list;
}public static listtodatasetlist(this dataset ds)
return list;}}
這裡是使用泛型+反射的技術,對datatable轉換為list進行封裝,只要你的格式一致(execl和model),就可以實現轉換。可以匯入execl,然後轉換為list之後,我們可以為所欲為了,但是修改資料以後,我們可以想儲存資訊到execl。思考?思路:
/// /// list匯出execl
///
/// 模型類
/// 儲存檔案的路徑
/// 需要儲存的資料
public static void listtoexecl(string file, listlist)
else if (fileext == ".xls") else
if (workbook == null)
//中文顯示的列名
string displayname = string.empty;
isheet sheet = workbook.createsheet();
//表頭
irow header = sheet.createrow(0);
type t = typeof(t);
propertyinfo properties = t.getproperties();
int index = 0;
foreach (propertyinfo field in properties)
for (int i = 0; i < list.count; i++)
}using (filestream fs=new filestream(file,filemode.create,fileaccess.readwrite))
}/// /// 動態獲取物件的屬性
///
/// 傳入的物件
/// 屬性名
///
public static object dynamicgetproperty(object obj, string propname,ref string displayname)
return val;
}
我在這只是拋磚引玉,其實npoi還有一些其他東西, 大家可以自行研究,比如:datatable匯出exelc,c# npoi計算execl裡面的公式等等。基礎類庫積累 Random類
這個random類取的隨機數,和以前寫的random.next 有點不一樣 獲取隨機數 隨機數的最小值 隨機數的最大值 隨機數 public static int getrandomnumber int minvalue,int maxvalue 在實際開發過程中,我們會遇到很多取隨機數的地方,有時...
java 基礎積累
int x 3510 x x 1000 1000 執行結果為3000 因為整數之間做除法時,只保留整數部分捨棄小數部分 與 與 邏輯與 和 邏輯或 都為邏輯運算子 按位與 和 按位或 都為位運算子 a b a b 為二進位制的與或運算 同為1時為1,否則為0 同為0時為0,否則為1 則 等於 則 等...
css基礎積累
1 以統一的方式實現樣式的定義 2 提高頁面樣式的可重用性和可維護性 3 實現了內容 html 和表 css 的分離 html和css之間有什麼關係 html 構建網頁的結構 css 構建html元素的樣式 1.內聯樣式 將樣式宣告在元素的style屬性中 1 color 樣式宣告 表示乙個具體的顯...