阅读Excel文件通过细胞

问题描述:

我是新来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

我假设在您执行问题中的代码后,您可以看到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

退房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