2010-08-27 18 views
0

即時閱讀一個XLSX文件作爲數據庫做了一些工作讀分貝所有文字

我注意到,它的閱讀一些精密組件在int和日期,即使我只是想這一切都在爲文本。反正有重寫這個功能嗎?

在每一個單元格的值的前下方

(隨意點出任何事情我可以用我的代碼做更好的爲好)

private DataSet ExceltoDT(OpenFileDialog dialog) 
    { 
     try 
     { 
      string connst = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + dialog.FileName + ";Extended Properties=\"Excel 12.0 Xml;HDR=NO\";"; 
      string sheet = "Sheet1$"; 
      string strSQL = "SELECT * FROM [" + sheet + "]"; 
      //string Table = "081710"; 
      OleDbConnection xlsdb = new OleDbConnection(connst); 
      xlsdb.Open(); 
      OleDbDataAdapter adp = new OleDbDataAdapter(strSQL, xlsdb); 
      DataSet ds2 = new DataSet(); 
      adp.Fill(ds2); 


      adp.Dispose(); 
      xlsdb.Close(); 
      xlsdb.Dispose(); 

      return ds2; 
     } 
     catch (StackOverflowException stack_ex2) 
     { 
      MessageBox.Show("(2007 Excel file) Stack Overflowed!" + "\n" + stack_ex2.Message); 
      return null; 

     } 
     catch (OleDbException ex_oledb2) 
     { 
      MessageBox.Show("An OleDb Error Thrown!" + "\n" + ex_oledb2.Message); 
      return null; 
     } 
    } 

回答

1

添加'(撇號)代碼。這將告訴Excel「即使它看起來像一個數字/日期/任何東西,將它視爲文本」。

不是你想要的嗎?那麼不要使用數據庫連接器,因爲它很糟糕。你會注意到,當你有一個混合單元格的列。在這種情況下,數據庫驅動程序會查看前8行,並將其類型設置爲它找到的大多數類型,併爲該列中任何不適合的內容返回NULL。 You can fix that通過黑客入侵您的註冊表。

取而代之,使用OLE API打開工作簿,然後從那裏開始,逐行讀取,根據需要轉換數據(此long list of posts應包含從C#訪問Excel以及所有錯誤和問題的各種可能方式你可以遇到)。

+0

你是否已經習慣了讀取xls或xlsx的舊API? – Crash893 2010-09-13 16:01:55

+0

你可以在這裏找到Excel API:http://msdn.microsoft.com/en-us/library/aa209782(office.10).aspx PS:這是OLE,不是「老」:-) – 2010-09-14 06:58:03