2012-02-10 103 views
0

我是新來c#.net閱讀Excel文件通過細胞

我有Excel工作表,我想導入到database

我想逐個讀取它並希望在database中插入值。

this.openFileDialog1.FileName = "*.xls"; 
      DialogResult dr = this.openFileDialog1.ShowDialog(); 
      if (dr == System.Windows.Forms.DialogResult.OK) 
      { 
       string path = openFileDialog1.FileName; 
       string connectionString = String.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=""Excel 8.0;HDR=no;IMEX=1;""", openFileDialog1.FileName); 
       string query = String.Format("select * from [{0}$]", "Sheet3"); 

       OleDbDataAdapter dataAdapter = new OleDbDataAdapter(query, connectionString); 

       DataSet dataSet = new DataSet(); 
       dataAdapter.Fill(dataSet); 
       dataGridView1.DataSource = dataSet.Tables[0]; 
+1

您能給關於上面的代碼的一些細節,或者沒有做什麼?它也不是一個完整的代碼示例,if塊的結尾沒有被提供,也沒有發生任何事後發生的事情 – SpaceBison 2012-02-10 10:27:17

+2

你已經告訴你想要什麼了。 quesion? – 2012-02-10 10:27:22

+0

只是我想要變量中的單元格值 – bkac 2012-02-10 10:28:29

回答

1

我假設在您執行問題中的代碼後,您可以看到dataGridView1中的值。

當調用dataAdapter.Fill時,Excel工作表中的實際讀數完成。所以,就你的情況而言,讀取單元格歸結爲索引dataSet.Tables[0]中的列和行。

例如:

for (int row = 0; row < dataSet.Tables[0].Rows.Count; row++) 
{ 
    DataRow r = dataSet.Tables[0].Rows[row]; 
} 

訪問在r行細胞是微不足道的(如上面的示例,只爲小區)。

編輯
我忘了描述「將值插入數據庫」部分。我認爲數據庫是SQL Server(也可能是Express版本)。

首先:創建數據庫連接。不用手動編寫連接字符串,使用SqlConnectionStringBuilder

SqlConnectionStringBuilder csb = new SqlConnectionStringBuilder(); 
csb.DataSource = <your server instance, e.g. "localhost\sqlexpress">; 
csb.InitialCatalog = <name of your database>; 
csb.IntegratedSecurity = <true if you use integrated security, false otherwise>; 
if (!csb.IntegratedSecurity) 
{ 
    csb.UserId = <User name>; 
    csb.Password = <Password>; 
} 

然後,創建並打開一個新SqlConnection與連接字符串:

using (SqlConnection conn = new SqlConnection(csb.ConnectionString)) 
{ 
    conn.Open(); 

迭代所有要插入並執行值相應的插入命令:

for (...) 
    { 
     SqlCommand cmd = new SqlCommand("INSERT INTO ... VALUES (@param1, ..., @paramn)", conn); 
     cmd.Parameters.AddWithValue("@param1", value1); 
     ... 
     cmd.Parameters.AddWithValue("@paramn", valuen); 

     cmd.ExecuteNonQuery(); 
    } 

此關閉連接,作爲using塊結束:

} 

然後你走了。或者,您可以使用具有特殊插入命令的數據適配器。然後,插入這些值將會變成一行代碼,但是,您的數據庫表格必須具有與Excel表單相同的結構(分別爲:您在發佈的代碼中獲得的數據表格)

+0

https://docs.google.com/spreadsheet/ccc?key=0ArpYU-n8THyLdG1CUktDRGtIdEE0N0tDTHp3akRXenc – bkac 2012-02-10 10:49:01

+0

檢查上面的文件我想導入 – bkac 2012-02-10 10:49:31

+0

真正的問題是:您的問題中發佈的代碼是否顯示任何'DataGridView'?如果是這樣,就像我在我的回覆中所說的那樣,遍歷行和列。 – 2012-02-10 10:56:57

1

退房NPOI

http://npoi.codeplex.com/

這是Apache的POI Excel中實現的.NET版本。它可以輕鬆地完成您所需要的操作,並且有助於避免在使用Jet提供程序時遇到的一些問題(即Excel的本地副本,或者更糟糕的是,服務器上Excel的副本)。

+0

通過ODBC驅動程序訪問Excel工作表時,不需要安裝Excel。 – 2012-02-10 10:38:52

+0

不夠公平,但有一些關於ODBC驅動程序的可怕部分,例如推斷類型。 – 2012-02-10 12:08:17

+1

最後,ODBC驅動程序是否推斷類型錯誤或Excel是否錯誤並不重要 - 然而,我必須承認,使用Excel時,Microsoft已經圍繞錯誤類型推斷包裝了一個相當不錯的GUI。 – 2012-02-10 12:20:28