【问题标题】:I have one Excel sheet with multiple tabs, need to insert this data into SQL Server using C#我有一个带有多个选项卡的 Excel 工作表,需要使用 C# 将此数据插入 SQL Server
【发布时间】:2016-12-07 21:51:43
【问题描述】:

我有一个包含多张工作表的 Excel 文件。每个工作表名称都与 SQL Server 中的表名称相同。我需要将这些 Excel 工作表的数据插入到数据库中的各个表中。

SQL server DB 中有 13 个选项卡和 13 个表。

我可以使用下面的代码将一张表的数据插入到一张表中。

String strConnection = "Data Source=.;Initial Catalog=<>;Integrated Security=True";

String excelConnString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0\"", filePath);

// Create Connection to Excel work book 
OleDbConnection conn = new OleDbConnection(excelConnString);

OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;

OleDbDataAdapter da = new OleDbDataAdapter(cmd);
DataTable dt = new DataTable();

conn.Open();
DataTable dtSheet = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
string sheetName = dtSheet.Rows[0]["table_name"].ToString();
cmd.CommandText = "select * from [" + sheetName + "]";
da.SelectCommand = cmd;
da.Fill(dt);

using (OleDbDataReader dReader = cmd.ExecuteReader())
{
    using(SqlBulkCopy sqlBulk = new SqlBulkCopy(strConnection))
    {
        //Give your Destination table name 
        sqlBulk.DestinationTableName = "TABLE NAME IN SQL";
        sqlBulk.WriteToServer(dReader);

        conn.Close();
    }
}

如何插入所有工作表中的数据?

【问题讨论】:

  • 您实际上在哪里遇到问题?
  • 感谢 Dispersia,其实我有一个 excel,标签中有多个工作表,所以需要在 sql server 的多个表中插入数据,一个标签 - 一个表

标签: c# asp.net sql-server sqlbulkcopy


【解决方案1】:

以下应该做到这一点 - 你只需要遍历表中的每一行:

    ...
    DataTable dtSheet = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

    // iterate each sheet
    foreach (System.Data.DataRow sheet in dtSheet.Rows)
    {
        string sheetName = sheet["table_name"].ToString();
        cmd.CommandText = "select * from [" + sheetName + "]";
        da.SelectCommand = cmd;
        da.Fill(dt);

        using (OleDbDataReader dReader = cmd.ExecuteReader())
        {
            using (SqlBulkCopy sqlBulk = new SqlBulkCopy(strConnection))
            {
                // Give your Destination table name.  Table name is sheet name minus any $
                sqlBulk.DestinationTableName = sheetName.Replace("$", "");
                sqlBulk.WriteToServer(dReader);

                conn.Close();
            }
        }
    }
}

【讨论】:

  • 确实有帮助,但是循环只从访问中选择一个工作表(选项卡),而不是移动到下一个选项卡来执行相同的过程。请帮助我
  • 尝试从内部 using 语句中删除 conn,Close() - 它不应该存在。
  • 非常感谢现在正在工作,还有一个帮助,比如我在数据库表中有一个 RowID 自动生成的列,但在 excel 中没有,所以我该如何从代码中添加它
猜你喜欢
  • 2020-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多