本文實例講述了C#使用oledb讀取excel表格內容到datatable的方法。分享給大家供大家參考。具體分析如下:
首先看一段實例代碼
IMEX=1的作用是,當讀取Excel中每個單元格的值到DataTable中的時候,不管其在Excel單元格時候是什么數據類型,賦值到DataTable中都強制轉化為字符串類型。
在沒有IMEX=1這個屬性的時候,默認的是根據Excel中對應Column的數據類型來決定DataTable中Column的數據類型。這種情況在Excel中某一列的數據類型都是一致的情況下沒有問題,是什么類型,就會在DataTable中的對應列設置相應的類型。但是如果Excel中這一列的類型混亂的話,比如說既包括數值型又有字符串型,在運行時創建DataTable的時候,會去先判斷Excel中這一列哪種類型的數據占主體,然后給DataTable的列設置為這種類型。比如說,如果一列中既有整數型又有字符型,而整數型單元格占主體,這時DataTable中的列就是整數型。
這時又出現另外一個問題,當要把值寫入到DataTable的時候,如果該單元格符合DataTable中要求的類型,就會寫入,如果不符合的話,系統會去強制轉換。比如,如果Excel中是字符串的5,而該單元格所在的列整數型占主體,DataTable中這一列是數值型,這時,系統會把字符串的5強制轉為數值型的5然后賦給DataTable相應的地方。但是,此時,如果轉換有問題的話,比如,此列中有一單元格中是“NO5”,這時強制轉換就會有問題,系統就會給DataTable相應的地方賦值DBNull,現在如果你用DataGridView來顯示那個DataTable的時候,這個地方顯示出來就是一個空白的格,但要注意的是,并不是DataTable中的這一行這一列是null,而是DBNull.其實,我覺得,跟null的作用是一樣的,反正在DataGridView中是不會顯示出來。只是我們在寫程序如果需要對DataTable的null元素篩選的話,需要注意這個問題。
如果Excel中,某一行字符串類型占主體的話,那么DataTable中這一列就會設置為字符串型,而且任何類型都能順利轉換成字符串類型,所以,Excel的類會完整的顯示出來,不管這一列中的字符串類型的單元格,還是整數型的單元格,都能完整的顯示出來。這是一很特別的地方。但這僅僅是一個特例。
所以,如果為了處理的時候數據類型的一致性,如果Excel中數據類型混亂的話,可以使用IMEX=1使DataTable中的所有列都轉為字符型。
接下來說一個相關的問題,那就是DataTable中使用語句進行篩選的問題這時也要注意DataTable中Column的類型問題。在下邊的例子中,F1,F2,F3等都是DataTable的列名。
下邊這個例子中,F1列是數值型,F5列是字符串型
DataRow[] rows = table.Select("F1='1540' andF5='NO2'");
這時程序不會報錯,因為F1='1540',雖然篩選條件中給的是字符串類型的1540與table不符合,但是系統會自己去轉換,所以這里寫F1='1540'和F1=1540都是可以的。F5列是字符串型,F5='NO2'也沒問題。
現在我們看另外一種情況,F1列是數值型,F5列是數值型.
DataRow[] rows = table.Select("F1='1540' andF5='NO2'");
當遇到F5='NO2'后,系統會自動去轉換,此時,由于不能順利轉換成數值型,在篩選到這里的時候,就會拋出異常,Operator= can't perform on System.Double and System.String
我們再看一種情況,F1列是數值型,F5列是字符型.
DataRow[] rows = table.Select("F1=1540 andF5='NO2'");
這種情況也是沒問題的,F1=1540,因為本身F1就是數值型,所以不必給1540加引號.
但是, 我們注意一種特殊情況 ,F1列是數值型,F5列是字符型.
DataRow[] rows = table.Select("F1=1540 and F5=NO2');
這種情況下會報錯,系統不會自動把NO2轉換為字符串,而是把Grade2看成一個列了,系統做的判斷是,這一行的這兩列的單元格值相等,而DataTable中又沒有這個列名,所以就會拋出找不到這個列的異常。所以,當某一列為字符串類型時,一定要加上單引號,否則會有異常拋出。
希望本文所述對大家的C#程序設計有所幫助。
新聞熱點
疑難解答