使用OleDb 讀取 Excel 有資料卻出現 Null

Use-Oledb-Read-Excel-Null

 

未命名

 

 

Provider=Microsoft.Jet.OLEDB.4.0;Data Source="C:\Data.xls";Extended Properties="Excel 8.0;HDR=Yes;IMEX=1;

正常來說只要OleDb連線自串像上面這樣寫就可以正常存取Excel

但實際操作後卻發現如果前面幾列沒有資料,後面的資料也抓不到

解決方法是: 修改機碼

要將HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\3.5\Engines\Excel\ 下面的 TypeGuessRows 設為 0

預設值 8  表示由前8列的資料型態來決定後面的型態

例如:如果前面都8列是數值,第9列過後也都會是數值,如果不是就回傳Null

 

下面大致上寫如何透過OleDb 讀取 Excel

//定義OLE======================================================

//1.檔案位置

string FileName = "c:\\test.xls";

//2.提供者名稱

string ProviderName = "Microsoft.Jet.OLEDB.4.0;";

//3.Excel版本,Excel 8.0 針對Excel2000及以上版本,Excel5.0 針對Excel97。

string ExtendedString = "'Excel 8.0;";

//4.第一行是否為標題

string Hdr = "No;";

//5.IMEX=1 通知驅動程序始終將「互混」數據列作為文本讀取 0:讀取  1:寫入  2:讀/寫

string IMEX = "1';";

//=============================================================
//連線字串
string cs = string.Format("Data Source={0};Provider={1};Extended Properties={2};HDR={3};IMEX={4}", FileName, ProviderName, Hdr, IMEX);

using (OleDbConnection conn = new OleDbConnection(cs))
{
    conn.Open();
    //工作表名稱需要加$字串
    string cmdText = "select * from[" + "S10T" + "$]";
    try
    {
        using (OleDbCommand cmd = new OleDbCommand(cmdText, conn))
        {
            using (OleDbDataReader dr = cmd.ExecuteReader())
            {
                while (dr.Read())
                {
                    Response.Write(string.Format("{0},{1},{2}", dr[0].ToString(), dr[0].ToString(), dr[0].ToString()));
                }
            }
        }
    }
}

參考:

http://blog.miniasp.com/post/2008/08/05/How-to-read-Excel-file-using-OleDb-correctly.aspx

http://sanchen.blogspot.tw/2007/08/imex1-oledb-excel-null.html

 

Technorati 的標籤: ,,