C#應用oledb讀取excel表格內容到datatable的辦法。本站提示廣大學習愛好者:(C#應用oledb讀取excel表格內容到datatable的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C#應用oledb讀取excel表格內容到datatable的辦法正文
本文實例講述了C#應用oledb讀取excel表格內容到datatable的辦法。分享給年夜家供年夜家參考。詳細剖析以下:
起首看一段實例代碼
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列是字符串型
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#法式設計有所贊助。