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