【问题标题】:Reading excel file in c#.net cell by cell逐个单元格读取c#.net中的excel文件
【发布时间】:2012-03-02 19:54:44
【问题描述】:

我是c#.net的新手

我有 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];

【问题讨论】:

  • 你能详细说明一下上面的代码做什么,或者不做什么?它也不是一个完整的代码示例,没有提供 if 块的结尾,也没有提供之后发生的任何事情。
  • 你已经告诉了你想要什么。现在有什么问题?
  • 你有你的数据集,只需逐行和逐个单元格枚举,然后做你想做的事
  • 您需要遍历 dataSet.Tables[0] 并获取每行中每个单元格的值以找到值,然后您可以通过编写另一个插入函数将它们放入数据库。那是你想要的吗?如果有,我可以提供代码。
  • 在这种情况下,您可能应该学习 c# 教程

标签: c# database excel import


【解决方案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 表相同的结构(分别:作为您在发布的代码中获得的数据表。

【讨论】:

【解决方案2】:

查看非营利组织

http://npoi.codeplex.com/

它是 Apache 的 POI Excel 实现的 .NET 版本。它可以轻松完成您需要做的事情,并有助于避免您在使用 Jet 提供程序时遇到的一些问题(即 Excel 的本地副本,或更糟糕的是,服务器上的 Excel 副本)。

【讨论】:

  • 通过 ODBC 驱动访问 Excel 工作表时无需安装 Excel。
  • 很公平,但是关于 ODBC 驱动程序有一些非常糟糕的部分,例如类型推断。
  • 最后,ODBC 驱动程序是否错误地推断类型或 Excel 是否错误并不重要 - 但是,我必须承认,使用 Excel,Microsoft 已经将一个非常好的 GUI 包装在了坏处类型推断。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多