1. 先描述下碰到的問題,我的excel中有又一列,有數字和文字,任憑我在excel中設定單元格格式也無濟於事。通過"provider=microsoft.jet.oledb.4.0;" + "data source=" + path + ";" + "extended properties=excel 8.0;"讀取的時候,它會認為那一列為double型,所以文字內容為空,並且在我後面的轉換會報異常。而我想把那一列都認為是文字。
為什麼呢?
據說,讀取excel到datatable中時,如果excel中這一列的型別混亂的話,比如說既包括數值型又有字串型,在執行時建立datatable的時候,從excel中前8行進行取樣分析,會去先判斷excel中這一列哪種型別的資料佔主體,然後給datatable的列設定為這種型別。比如說,如果一列中既有整數型又有字元型,而整數型單元格佔主體,這時datatable中的列就是整數型。
2. 那麼我想把所有的列匯入到datatable時,都為string型別,該怎麼弄呢?
經過搜尋,使用連線字串"provider=microsoft.jet.oledb.4.0;" + "data source=" + path + ";" + "extended properties='excel 8.0;hdr=no;imex=1';";解決了我的問題。
hdr( header row )設定,有值 yes,no
若指定值為yes,代表 excel 檔中的工作表第一行是欄位名稱
若指定值為 no,代表 excel 檔中的工作表第一行就是資料了,沒有欄位名稱
imex有0,1,2三個值
0 ---輸出模式;
1---輸入模式;
2----鏈結模式(完全更新能力)
當我們設定imex=1時將強制混合資料轉換為文字,但僅僅這種設定並不可靠,imex=1只確保在某列前8行資料至少有乙個是文字項的時候才起作用,它只是把查詢前8行資料中資料型別佔優選擇的行為作了略微的改變。例如某列前8行資料全為純數字,那麼它仍然以數字型別作為該列的資料型別,隨後行裡的含有文字的資料仍然變空。另乙個改進的措施是imex=1與登錄檔值typeguessrows配合使用,typeguessrows 值決定了isam 驅動程式從前幾條資料取樣確定資料型別,預設為「8」。可以通過修改hkey_local_machine\software\microsoft\jet\4.0\engines\excel下的該登錄檔值來更改取樣行數。但是這種改進還是沒有根本上解決問題,即使我們把imex設為「1」, typeguessrows設得再大,例如1000,假設資料表有1001行,某列前1000行全為純數字,該列的第1001行又是乙個文字,isam驅動的這種機制還是讓這列的資料變成空。
既然不能保證讀出來的肯定為文字,那還怎麼保證程式的正確呢?
當然,我發現hdr=no這個設定,一般來講,乙個excel檔案第一行都是標題,而標題一般都是文字格式的。所以,當我們讀取的時候,我們可以把第一行當作內容而不是標題來讀,hdr=no;imex=1,第一行為字串型別,所以以後的內容全是字串型別。最後讀到datatable中後,把table.row.removeat(0)把第一條記錄刪除就可以了。使用oledb方式讀取excel後,如果hdr=no,datatable預設的列名為f1,f2,f3...
這樣就可以了,歡迎糾錯,謝謝
使用NPOI讀取Excel到DataTable
一 npoi介紹 使用 npoi 你就可以在沒有安裝 office 或者相應環境的機器上對 word excel 文件進行讀寫。npoi是構建在poi 3.x版本之上的,它可以在沒有安裝office的情況下對word excel文件進行讀寫操作 二 安裝npoi 新建控制台應用程式 管理nuget程...
QTP 讀取頁面table值到DataTable
思路如下 set webtable1 browser page webtable 得到webtable1的行和列的值 rowcount webtable1.rowcount columncount webtable1.columncount 1 在datatable中建立sheet set news...
C 讀取excel資料到datatable中
1 datatable dtgbpatient new datatable 23 string strconn string excelname 45 注意 把乙個excel檔案看做乙個資料庫,乙個sheet看做一張表。語法 select from sheet1 表單要使用 和 67 1 hdr表示...