程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 使用OLEDB方式讀取Excel文件到DataTable中數據類型的處理

使用OLEDB方式讀取Excel文件到DataTable中數據類型的處理

編輯:C#入門知識

首先看一段實例代碼     [csharp]   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的作用是,當讀取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列是字符串型   [csharp]   DataRow[] rows = table.Select("F1='1540' andF5='NO2'");   這時程序不會報錯,因為F1='1540',雖然篩選條件中給的是字符串類型的1540與table不符合,但是系統會自己去轉換,所以這裡寫F1='1540'和F1=1540都是可以的。F5列是字符串型,F5='NO2'也沒問題。   現在我們看另外一種情況,F1列是數值型,F5列是數值型.   [csharp]   DataRow[] rows = table.Select("F1='1540' andF5='NO2'");   當遇到F5='NO2'後,系統會自動去轉換,此時,由於不能順利轉換成數值型,在篩選到這裡的時候,就會拋出異常,Operator= can’t perform on System.Double and System.String   我們再看一種情況,F1列是數值型,F5列是字符型.   [csharp]   DataRow[] rows = table.Select("F1=1540 andF5='NO2'");   這種情況也是沒問題的,F1=1540,因為本身F1就是數值型,所以不必給1540加引號.   但是, 我們注意一種特殊情況 ,F1列是數值型,F5列是字符型.   [csharp]   DataRow[] rows = table.Select("F1=1540 and F5=NO2');   這種情況下會報錯,系統不會自動把NO2轉換為字符串,而是把Grade2看成一個列了,系統做的判斷是,這一行的這兩列的單元格值相等,而DataTable中又沒有這個列名,所以就會拋出找不到這個列的異常。所以,當某一列為字符串類型時,一定要加上單引號,否則會有異常拋出。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved