[C#] 使用 OleDb 讀取 Excel

  • 7638
  • 0
  • 2014-02-25

[C#] 使用 OleDb 讀取 Excel

紀錄一下一些小細節

在 Visual Studio 2010 中 設定資料連接

image

 

image

 

image

 

image

 

設定Extended Properties,我這邊設 Excel 12.0;HDR=NO;IMEX=1

image

然後按下確定,測試一下連接就行了


 

當欄位資料中字數被截斷,且資料量不大時,可考慮修改登錄機碼 TypeGuessRows

登錄機碼 TypeGuessRows

	指要檢查資料類型的列數。
	預設值:8。
	TypeGuessRows 的有效範圍值是 0 到 16。
	
	如果設定為 0,是表示掃描來源資料列的筆數是 16384。
	使用 0 值,若資料檔又很大時,將造成效能的衝擊。
 

image

 

測試範例,設個中斷點,看一下 DataTable 資料


string provider = "Microsoft.ACE.OLEDB.12.0";
            string datasource = System.AppDomain.CurrentDomain.BaseDirectory + @"ProductTest.xlsx";
            string extended = "Excel 12.0";   //Excel版本,Excel 8.0 針對Excel2000及以上版本,Excel5.0 針對Excel97
            string hdr = "No";  //第一行是否為標題

            //當 IMEX=0 時為「匯出模式」,這個模式開啟的 Excel 檔案只能用來做「寫入」用途。Export mode
            //當 IMEX=1 時為「匯入模式」,這個模式開啟的 Excel 檔案只能用來做「讀取」用途。Import mode
            //當 IMEX=2 時為「連結模式」,這個模式開啟的 Excel 檔案可同時支援「讀取」與「寫入」用途。Linked mode
            string imex = "1";   //通知驅動程序始終將「互混」數據列作為文本讀取
            
            string strConn = "Provider="+ provider +
                         ";Data Source=" + datasource +
                         ";Extended Properties=\""+ extended +
                         ";HDR=" + hdr +
                         ";IMEX=" + imex + "\" ";
            OleDbDataAdapter oledbada = new OleDbDataAdapter(" SELECT * FROM [日用百貨$]", strConn);
            DataTable dt = new DataTable();
            oledbada.Fill(dt);
            Console.ReadKey();
 

下載元件

Microsoft Access Database Engine 2010 Redistributable 32bit

Microsoft Access Database Engine 2010 Redistributable 64bit

 

已經安裝 Access Database Engine 但是出現警告訊息:

Microsoft.ACE.OLEDB.12.0' 提供者並未登入於本機電腦上。

請安裝這個

2007 Office system 驅動程式:資料連線元件

 

 

範例程式 下載

   

參考資料:

德瑞克:SQL Server 學習筆記