2013-08-29 56 views
13

Tôi đang sử dụng OLEDB Data Provider để đọc file excel, nhưng vấn đề là trong excel sheet một số cloumn có giá trị không hợp lệ ví dụ thay vì chuỗi số được ở đó, Khi tôi đọc giá trị không hợp lệ này tôi nhận được một chuỗi rỗng thay vì giá trị thực tế.Đọc file excel sử dụng nhà cung cấp OLEDB liệu

enter image description here

cho ảnh chụp màn hình ở trên khi tôi đọc giá trị john nhận chuỗi rỗng.

Vậy có cách nào để đọc giá trị không hợp lệ này không?

Mọi trợ giúp sẽ được đánh giá cao.

Các là đọc file excel

private DataTable ReadExcelFile(string sheetName, string path) 
{ 

    using (OleDbConnection conn = new OleDbConnection()) 
    { 
     DataTable dt = new DataTable(); 
     string Import_FileName = path; 
     string fileExtension = Path.GetExtension(Import_FileName); 
     if (fileExtension == ".xls") 
      conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Import_FileName + ";" + "Extended Properties='Excel 8.0;HDR=YES;'"; 
     if (fileExtension == ".xlsx") 
      conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Import_FileName + ";" + "Extended Properties='Excel 12.0 Xml;HDR=YES;'"; 
     using (OleDbCommand comm = new OleDbCommand()) 
     { 
      comm.CommandText = "Select * from [" + sheetName + "$]"; 

      comm.Connection = conn; 

      using (OleDbDataAdapter da = new OleDbDataAdapter()) 
      { 
       da.SelectCommand = comm; 
       da.Fill(dt); 
       return dt; 
      } 

     } 
    } 
} 

Trả lời

8

Bạn cần phải thiết lập giá trị cho TypeGuessRows chìa khóa Registry để 0, cách trình điều khiển này sẽ thiết lập kiểu dữ liệu dựa trên tất cả các giá trị cột thay vì đầu tiên 8 (mặc định).

Vị trí của khóa khác với phiên bản của phiên bản trình điều khiển, bạn có thể dễ dàng sử dụng Google dựa trên phiên bản cụ thể của bạn. Ví dụ cho Access Connectivity Engine 2007, nó sẽ là

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel 

Bằng cách này, bạn không cần Jet để đọc tệp XLS, ACE hoàn toàn có khả năng thực hiện điều này.

+5

Tôi nghĩ bạn có thể thực hiện điều tương tự bằng cách đặt '; IMEX = 1" 'trong chuỗi kết nối sau' HDR = YES'. –

+1

@DougGlancy từ những gì tôi nhớ có vấn đề với cách tiếp cận này, nhưng một thử và nếu nó hoạt động, nó tốt hơn so với chỉnh sửa Registry –

+0

IMEX = 1 không ảnh hưởng đến điều này. Xem chủ đề này http://stackoverflow.com/questions/10102149/what-is-imex-in-the-oledb-connection -chuỗi – Adam

5

này làm việc cho tôi

 using (OleDbConnection conn = new OleDbConnection()) 
     { 
      DataTable dt = new DataTable(); 
      conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";" + "Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1;MAXSCANROWS=0'"; 
      using (OleDbCommand comm = new OleDbCommand()) 
      { 
       comm.CommandText = "Select * from [" + sheetName + "$]"; 
       comm.Connection = conn; 
       using (OleDbDataAdapter da = new OleDbDataAdapter()) 
       { 
        da.SelectCommand = comm; 
        da.Fill(dt); 
        return dt; 
       } 
      } 
     } 

Các MAXSCANROWS = 0 ghi đè mặc định registry và quét tất cả các hàng trước khi xác định loại. IMEX = 1 vẫn cần được bao gồm.

Ví dụ, đưa ra bảng này:

Header | Header 
------ | ------ 
Cell1 | 2456354 
Cell2 | 2456354 
Cell3 | 2456354 
Cell4 | 2456354 
Cell5 | 2456354 
Cell6 | 2456354 
Cell7 | 2456354 
Cell8 | 2456354 
Cell9 | A5341 

Các chuỗi kết nối sau sẽ mất A5341

"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";" + "Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1;'" 
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";" + "Extended Properties='Excel 12.0 Xml;HDR=YES;MAXSCANROWS=0'" 

Nhưng nó hoạt động khi nó có cả.