在c#.net中逐单元格读取excel文件

在c#.net中逐单元格读取excel文件,c#,database,excel,import,C#,Database,Excel,Import,我是c#net的新手 我有excel工作表,我想导入数据库 this.openFileDialog1.FileName = "*.xls"; DialogResult dr = this.openFileDialog1.ShowDialog(); if (dr == System.Windows.Forms.DialogResult.OK) { string path = openFileDi

我是
c#net的新手

我有excel工作表,我想导入
数据库

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];
我想一个单元格一个单元格地读取它,并想在
数据库中插入值

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];
查看NPOI


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

我假设在您执行问题中的代码后,您可以看到
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];
}
然后,使用连接字符串创建并打开一个新的
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
块结束时,这将关闭连接:

}

就这样。或者,您可以使用带有特殊insert命令的数据适配器。然后,插入值将归结为一行,但是,数据库表必须具有与Excel表相同的结构(分别是:作为您在发布的代码中获得的数据表。

您能否提供一些关于上述代码的详细信息?它也不是一个完整的代码示例,没有提供if块的结尾,也没有后面发生的任何事情。您已经告诉了您想要什么。现在问题是什么?您有数据集,只需列举b行即可按y行和单元格逐个计算,并执行所需操作遍历数据集所需的操作。表[0]并获取每行中每个单元格的值以查找值,然后您可以通过编写另一个insert函数将其放入数据库。这是您想要的吗?若需要,我可以提供代码。在这种情况下,您可能应该学习c的教程,当通过ODBC驱动程序访问Excel表时,不需要安装Excel。公平够了,但是ODBC驱动程序有一些非常糟糕的部分,比如类型推断。最终,ODBC驱动程序推断类型是否错误或者Excel是否错误并不重要,但是我必须承认,有了Excel,微软已经在错误的类型推断上包装了一个非常好的GUIRTA真正的问题是:您在问题中发布的代码是否在
DataGridView
中显示了任何内容?如果是,请按照我在回答中所说的做,并在行和列之间进行迭代。DataGridView它仅用于我的引用您可以通过
行[cellIndex]访问
DataRow
中单个列的值
行[“columnName”]
。请参阅文档: