1. 程式人生 > >C#徹底解決Oledb連接Excel數據類型不統一的問題

C#徹底解決Oledb連接Excel數據類型不統一的問題

ring cast 重新 強制 圖片 dap 很多 datarow ext

在使用Microsoft.Jet.OLEDB.4.0連接Excel,進行讀取數據,相對使用傳統的COM來讀取數據,效率是很高的。但相對傳統COM操作Excel來說,及存在數據類型轉換的問題。
因為使用OLEDB連接Excel讀取數據時,需要確定數據的類型。默認情況使用連接字符串:
view source
print ?
1. string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + excelFile + ";Extended Properties=‘Excel 8.0;‘";
使用上面的連接字符串連接Excel時,可能會遇到數據類型不一致的問題。所謂數據類型不一致,是指同一列裏面數據類型可能出現多種,如浮點數、字符串、日期等;當出現此類情況時,讀取出來的數據就為空,甚至會報錯,如“非法的日期格式”等異常。出現這種問題,我們大家都會想到把數據全部都按字符數據來讀取,但是按什麽數據類型來讀取不是我們能控制的,是OLEDB控制的,至少暫時我還沒有找到能控制輸出數據類型的方法。因為我當初也嘗試使用convert,cast函數對輸出的列進行類型轉換,但oledb連接Excel時,使用的SQL不支持這些函數。因此只能從其他角度來解決該問題。我也在網上搜索了很多解決方法,最全面的解決方法是:http://www.douban.com/note/18510346/。下面列出了網上出現解決該問題方法的比較:

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片


這裏提供一個更加方便的辦法,不過前提是第一行必須是作為字段名或者第一行的數據類型就為字符型。這樣一說,大家就明白了。首先修改連接字符串為:
view source
print ?

//2003(Microsoft.Jet.Oledb.4.0)
string strConn = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=‘Excel 8.0;HDR=Yes;IMEX=1;‘", excelFilePath);

//2010(Microsoft.ACE.OLEDB.12.0)
string strConn = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=‘Excel 8.0;HDR=Yes;IMEX=1;‘", excelFilePath);
這裏將HDR設為NO,因為我就是將第一行做為數據讀取,而IMEX=1就表示根據前8行判斷列的數據類型,如果有字符型數據,那麽就強制混合數據轉換為 文本。這裏就明白為什麽要保證第一行為字符型的原因了。能將列的數據類型強制設為字符型,那麽列中出現什麽類型的數據都不怕了。需要做的工作就是,在獲取 完數據後,將字段名重新設置,並刪除第一條記錄即可。代碼如下:
view source
print ?
01. DataTable dt = new DataTable();
02.
03. using(OleDbCommand cmd = new OleDbCommand()){
04. cmd.Connection = conn;
05. cmd.CommandType = CommandType.Text;
06. cmd.CommandTimeout = 6;
07. cmd.CommandText = string.Format("select * from [{0}$]", sheetName);
08.
09. OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
10. adapter.Fill(dt);
11. }
12.
13. if (dt.Rows.Count > 0) {
14. DataRow dr = dt.Rows[0];
15.
16. for (int col = 0; col < dt.Columns.Count; col++) {
17. dt.Columns[col].ColumnName = dr[col].ToString();
18. }
19.
20. dt.Rows[0].Delete();
21. dt.AcceptChanges();
22. }

C#徹底解決Oledb連接Excel數據類型不統一的問題