尝试将数据表中的行插入Excel工作表时出现问题

时间:2017-02-21 06:51:14

标签: c# excel

DataSet excelDataSet = new DataSet();
string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='"+fullpath+"';Extended Properties=\"Excel 8.0;HDR=YES\";";

/*using (OleDbConnection conn = new OleDbConnection(connectionString))
{
    conn.Open();
    OleDbDataAdapter objDA = new OleDbDataAdapter("select * from [Sheet1$]", conn);                  

    objDA.Fill(excelDataSet);
    conn.Close();
}*/
string columns = string.Join(",", StdTable.Columns.Cast<DataColumn>().Select(c => c.ColumnName));
columns = columns.Replace(",F1", "");
string values = string.Join(",", StdTable.Columns.Cast<DataColumn>().Select(c => string.Format("@{0}", c.ColumnName)));
values = values.Replace(",@F1", "");
string sqlCommandInsert = string.Format("INSERT INTO [Sheet1$] ({0}) VALUES ({1})", columns, values);
using (OleDbConnection conn1 = new OleDbConnection(connectionString))
using (var cmd1 = new OleDbCommand(sqlCommandInsert, conn1))
{
    conn1.Open();
    foreach (DataRow row in StdTable.Rows)
    {
        cmd1.Parameters.Clear();
        foreach (DataColumn col in StdTable.Columns)
        {

           cmd1.Parameters.AddWithValue("@" + col.ColumnName, row[col]);
           //cmd1.CommandText = sqlCommandInsert;
        }
        cmd1.ExecuteNonQuery();
    }
    //cmd1.ExecuteNonQuery();
}

//And Insert query values
INSERT INTO [Sheet1$] (Sno,Customer,Vendor code,Circle,PO NO) VALUES (@Sno,@Customer,@Vendor code,@Circle,@PO NO)

2 个答案:

答案 0 :(得分:0)

而不是

    string columns = string.Join(",", StdTable.Columns.Cast<DataColumn>().Select(c => c.ColumnName));

这样做

    string columns = string.Join(",", StdTable.Columns.Cast<DataColumn>().Select(c => string.Foramt("[{0}]", c.ColumnName)));

数据表中的一个列可能被命名为Jet数据库提供程序中的特殊关键字,例如想象一个列&#39;日期&#39;或者&#39;哪里&#39;或类似的东西。

第二次看,我看到你的列名中有空格来自数据表。这种方括号方法仍然有用。

请注意参数名称,如

    @PO NO

不应包含空格,因此我会从参数名称中删除空格。

答案 1 :(得分:0)

spaces中有column names,因此[]中的column namesreplace space with _中的parameter names

修改您的代码行,如下所示:

string columns = string.Join(",", StdTable.Columns.Cast<DataColumn>().Select(c => string.Foramt("[{0}]", c.ColumnName)));
columns = columns.Replace(",F1", "");
string values = string.Join(",", StdTable.Columns.Cast<DataColumn>().Select(c => string.Format("@{0}", c.ColumnName.Replace(" ", "_"))));
values = values.Replace(",@F1", "");


cmd1.Parameters.AddWithValue("@" + col.ColumnName.Replace(" ", "_"), row[col]);