基礎類庫積累 ExeclHelper類

2022-01-24 08:34:01 字數 3789 閱讀 3916

相信大家都玩過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。

execl資料:

mode類:

只要這樣一一對應起來,後期委會也好維護,比如新增了乙個列,在model中加乙個字段即可,方便擴充套件,如果是多個sheet,每個sheet略有不同,就可以使用c#物件導向的思想,提取它們共同的字段,其他做繼承,這裡就不多說了。接下來講講如何做dataset轉換為list,其實dataset中就是好多datatable組成,如果能實現datatable轉換到list,其他就迎刃而解!

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 樣式宣告 表示乙個具體的顯...