C#使用oledb讀取excel表格內(nèi)容到datatable的方法
本文實(shí)例講述了C#使用oledb讀取excel表格內(nèi)容到datatable的方法。分享給大家供大家參考。具體分析如下:
首先看一段實(shí)例代碼
OleDbConnection myConn = new OleDbConnection(strCon);
string strCom = "SELECT * FROM [Part$A7:AK] where [Part No]=10506";
myConn.Open();
OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);
DataSet myDataSet = new DataSet();
myCommand.Fill(myDataSet, "Part");
myConn.Close();
IMEX=1的作用是,當(dāng)讀取Excel中每個單元格的值到DataTable中的時候,不管其在Excel單元格時候是什么數(shù)據(jù)類型,賦值到DataTable中都強(qiáng)制轉(zhuǎn)化為字符串類型。
在沒有IMEX=1這個屬性的時候,默認(rèn)的是根據(jù)Excel中對應(yīng)Column的數(shù)據(jù)類型來決定DataTable中Column的數(shù)據(jù)類型。這種情況在Excel中某一列的數(shù)據(jù)類型都是一致的情況下沒有問題,是什么類型,就會在DataTable中的對應(yīng)列設(shè)置相應(yīng)的類型。但是如果Excel中這一列的類型混亂的話,比如說既包括數(shù)值型又有字符串型,在運(yùn)行時創(chuàng)建DataTable的時候,會去先判斷Excel中這一列哪種類型的數(shù)據(jù)占主體,然后給DataTable的列設(shè)置為這種類型。比如說,如果一列中既有整數(shù)型又有字符型,而整數(shù)型單元格占主體,這時DataTable中的列就是整數(shù)型。
這時又出現(xiàn)另外一個問題,當(dāng)要把值寫入到DataTable的時候,如果該單元格符合DataTable中要求的類型,就會寫入,如果不符合的話,系統(tǒng)會去強(qiáng)制轉(zhuǎn)換。比如,如果Excel中是字符串的5,而該單元格所在的列整數(shù)型占主體,DataTable中這一列是數(shù)值型,這時,系統(tǒng)會把字符串的5強(qiáng)制轉(zhuǎn)為數(shù)值型的5然后賦給DataTable相應(yīng)的地方。但是,此時,如果轉(zhuǎn)換有問題的話,比如,此列中有一單元格中是“NO5”,這時強(qiáng)制轉(zhuǎn)換就會有問題,系統(tǒng)就會給DataTable相應(yīng)的地方賦值DBNull,現(xiàn)在如果你用DataGridView來顯示那個DataTable的時候,這個地方顯示出來就是一個空白的格,但要注意的是,并不是DataTable中的這一行這一列是null,而是DBNull.其實(shí),我覺得,跟null的作用是一樣的,反正在DataGridView中是不會顯示出來。只是我們在寫程序如果需要對DataTable的null元素篩選的話,需要注意這個問題。
如果Excel中,某一行字符串類型占主體的話,那么DataTable中這一列就會設(shè)置為字符串型,而且任何類型都能順利轉(zhuǎn)換成字符串類型,所以,Excel的類會完整的顯示出來,不管這一列中的字符串類型的單元格,還是整數(shù)型的單元格,都能完整的顯示出來。這是一很特別的地方。但這僅僅是一個特例。
所以,如果為了處理的時候數(shù)據(jù)類型的一致性,如果Excel中數(shù)據(jù)類型混亂的話,可以使用IMEX=1使DataTable中的所有列都轉(zhuǎn)為字符型。
接下來說一個相關(guān)的問題,那就是DataTable中使用語句進(jìn)行篩選的問題這時也要注意DataTable中Column的類型問題。在下邊的例子中,F(xiàn)1,F(xiàn)2,F(xiàn)3等都是DataTable的列名。
下邊這個例子中,F(xiàn)1列是數(shù)值型,F(xiàn)5列是字符串型
DataRow[] rows = table.Select("F1='1540' andF5='NO2'");
這時程序不會報錯,因?yàn)镕1='1540',雖然篩選條件中給的是字符串類型的1540與table不符合,但是系統(tǒng)會自己去轉(zhuǎn)換,所以這里寫F1='1540'和F1=1540都是可以的。F5列是字符串型,F(xiàn)5='NO2'也沒問題。
現(xiàn)在我們看另外一種情況,F(xiàn)1列是數(shù)值型,F(xiàn)5列是數(shù)值型.
DataRow[] rows = table.Select("F1='1540' andF5='NO2'");
當(dāng)遇到F5='NO2'后,系統(tǒng)會自動去轉(zhuǎn)換,此時,由于不能順利轉(zhuǎn)換成數(shù)值型,在篩選到這里的時候,就會拋出異常,Operator= can't perform on System.Double and System.String
我們再看一種情況,F(xiàn)1列是數(shù)值型,F(xiàn)5列是字符型.
DataRow[] rows = table.Select("F1=1540 andF5='NO2'");
這種情況也是沒問題的,F(xiàn)1=1540,因?yàn)楸旧鞦1就是數(shù)值型,所以不必給1540加引號.
但是, 我們注意一種特殊情況 ,F(xiàn)1列是數(shù)值型,F(xiàn)5列是字符型.
DataRow[] rows = table.Select("F1=1540 and F5=NO2');
這種情況下會報錯,系統(tǒng)不會自動把NO2轉(zhuǎn)換為字符串,而是把Grade2看成一個列了,系統(tǒng)做的判斷是,這一行的這兩列的單元格值相等,而DataTable中又沒有這個列名,所以就會拋出找不到這個列的異常。所以,當(dāng)某一列為字符串類型時,一定要加上單引號,否則會有異常拋出。
希望本文所述對大家的C#程序設(shè)計有所幫助。
- C#使用NPOI實(shí)現(xiàn)Excel和DataTable的互轉(zhuǎn)
- C#讀取Excel到DataTable的方法示例
- C#實(shí)現(xiàn)Json轉(zhuǎn)DataTable并導(dǎo)出Excel的方法示例
- C#使用Datatable導(dǎo)出Excel
- c# 將Datatable數(shù)據(jù)導(dǎo)出到Excel表格中
- C#實(shí)現(xiàn)將DataTable內(nèi)容輸出到Excel表格的方法
- C#操作EXCEL DataTable轉(zhuǎn)換的實(shí)例代碼
- C#如何將DataTable導(dǎo)出到Excel解決方案
- C#把EXCEL數(shù)據(jù)轉(zhuǎn)換成DataTable
相關(guān)文章
C#無損高質(zhì)量壓縮圖片實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了C#無損高質(zhì)量壓縮圖片的實(shí)現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05基于C#調(diào)用c++Dll結(jié)構(gòu)體數(shù)組指針的問題詳解
下面小編就為大家分享一篇基于C#調(diào)用c++Dll結(jié)構(gòu)體數(shù)組指針的問題詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12c#?復(fù)寫Equals方法的實(shí)現(xiàn)
本文主要介紹了c#?復(fù)寫Equals方法的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05WPF TextBox實(shí)現(xiàn)按字節(jié)長度限制輸入功能
這篇文章主要為大家詳細(xì)介紹了WPF TextBox實(shí)現(xiàn)按字節(jié)長度限制輸入功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11