欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#使用oledb讀取excel表格內(nèi)容到datatable的方法

 更新時(shí)間:2015年05月04日 10:38:40   作者:八大山人  
這篇文章主要介紹了C#使用oledb讀取excel表格內(nèi)容到datatable的方法,涉及C#操作oledb及datatable的相關(guān)技巧,需要的朋友可以參考下

本文實(shí)例講述了C#使用oledb讀取excel表格內(nèi)容到datatable的方法。分享給大家供大家參考。具體分析如下:

首先看一段實(shí)例代碼

復(fù)制代碼 代碼如下:
string strCon = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excel_path + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=1'";
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ì)有所幫助。

相關(guān)文章

  • c#自定義泛型類的實(shí)現(xiàn)

    c#自定義泛型類的實(shí)現(xiàn)

    本篇文章是對(duì)c#中自定義泛型類的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C#網(wǎng)絡(luò)編程中常用特性介紹

    C#網(wǎng)絡(luò)編程中常用特性介紹

    這篇文章介紹了C#網(wǎng)絡(luò)編程中常用特性,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • C#無(wú)損高質(zhì)量壓縮圖片實(shí)現(xiàn)代碼

    C#無(wú)損高質(zhì)量壓縮圖片實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了C#無(wú)損高質(zhì)量壓縮圖片的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • WPF實(shí)現(xiàn)控件拖動(dòng)的示例代碼

    WPF實(shí)現(xiàn)控件拖動(dòng)的示例代碼

    這篇文章主要介紹了WPF實(shí)現(xiàn)控件拖動(dòng)的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • linq語(yǔ)法基礎(chǔ)使用示例

    linq語(yǔ)法基礎(chǔ)使用示例

    LINQ語(yǔ)言集成查詢(Language Integrated Query),是在.NET Framework 3.5 中出現(xiàn)的技術(shù),借助于LINQ技術(shù),我們可以使用一種類似SQL的語(yǔ)法來(lái)查詢?nèi)魏涡问降臄?shù)據(jù),下面學(xué)習(xí)一下他的使用方法
    2014-01-01
  • .net的序列化與反序列化實(shí)例

    .net的序列化與反序列化實(shí)例

    這篇文章主要介紹了.net的序列化與反序列化實(shí)例,詳細(xì)講述了.net序列化與反序列化的基本原理與用法實(shí)例,具有很好的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-10-10
  • 基于C#調(diào)用c++Dll結(jié)構(gòu)體數(shù)組指針的問(wèn)題詳解

    基于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-12
  • C#讀寫文件的方法匯總

    C#讀寫文件的方法匯總

    C#讀寫文件的方法匯總,需要的朋友可以參考一下
    2013-03-03
  • c#?復(fù)寫Equals方法的實(shí)現(xiàn)

    c#?復(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-05
  • WPF TextBox實(shí)現(xiàn)按字節(jié)長(zhǎng)度限制輸入功能

    WPF TextBox實(shí)現(xiàn)按字節(jié)長(zhǎng)度限制輸入功能

    這篇文章主要為大家詳細(xì)介紹了WPF TextBox實(shí)現(xiàn)按字節(jié)長(zhǎng)度限制輸入功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11

最新評(píng)論