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

本文关键字:中的 excel 文件 net 单元格 读取 | 更新日期: 2023-09-27 18:24:05

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

逐单元格读取c#.net中的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];
}

访问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表具有相同的结构(分别为:与您在发布的代码中获得的数据表相同。

查看NPOI

http://npoi.codeplex.com/

它是Apache的POI Excel实现的.NET版本。它可以很容易地完成您需要它做的事情,并有助于避免您在使用Jet提供商时面临的一些问题(即Excel的本地副本,或者更糟的是,服务器上的Excel副本)。