从另一个Excel工作表插入Excel工作表

时间:2010-09-15 08:53:40

标签: c# .net excel

我正在尝试阅读一张excel表,然后通过OleDb创建另一张excel表

在另一张excel表中,我制作了一些名字,如名字字符(10),年龄数

现在当我读取excel表并尝试在另一个excel表中插入值时,值会插入,但也包含一个额外的char,即单引号(')作为第一个char。

为什么所有值都以单引号输入到实际值?如何摆脱它?我正在使用c#.net。

@Edit

    OleDbCommand cmd = new OleDbCommand();
                   cmd.CommandType = System.Data.CommandType.Text;
                   cmd.Connection = con;
                   cmd.CommandText = "CREATE TABLE Data1 (Name char(10), Age char(10)) ";

                   cmd.ExecuteNonQuery();

foreach (DataRow row in someDataTable.Rows)
 {

       cmd.CommandText = "INSERT INTO Data1 values ('" + row["Name"] +
                       "','" + row["Age"] +  "')";

       cmd.ExecuteNonQuery();
}

我在someDataTable中的数据与我需要复制的excel中的数据完全相同。

2 个答案:

答案 0 :(得分:2)

这很奇怪,但也许是OleDb尝试避免SQL注入的某种尝试? (如果row["Name"]包含单引号怎么办?)即使它没有解释,如@Treb所说,为什么只有一个引号,没有尾随引用。

如果您尝试将查询与参数一起使用会发生什么,例如:

using (OleDbCommand addLine = new OleDbCommand("INSERT INTO Data1 values (@name, @age)"))
{
    addLine.Parameters.AddWithValue("@name", row["Name"]);
    addLine.Parameters.AddWithValue("@age", row["Age"]);
    int affectedRows = addLine.ExecuteNonQuery();
    Debug.Assert(1 == affectedRows);
}

经过几次尝试,我仍然无法重现观察到的行为。我建议做几件事:

  • 在您的问题中发布产生单引号问题的完整源代码,

  • 尝试使用以下源代码(控制台应用程序),看看会发生什么。就我而言,值插入良好,没有任何前导单引号。唯一的问题是年龄,插入为文本而不是数字(可以通过明确指定行的类型来解决):

源代码:

namespace Demos.StackOverflow.ExcelUpdate
{
    using System;
    using System.Collections.ObjectModel;
    using System.Data.OleDb;

    class Program
    {
        static void Main(string[] args)
        {
            // -> Change the following name of the file to use.
            string fullPath = @"C:\Users\Arsene\Desktop\Book1.xlsx";
            string connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0'", fullPath);

            Collection<Tuple<string, int>> dataToPut = new Collection<Tuple<string, int>>();

            dataToPut.Add(new Tuple<string, int>("Some name", 34));
            dataToPut.Add(new Tuple<string, int>("Other name here", 41));
            dataToPut.Add(new Tuple<string, int>("Last one", 36));

            using (OleDbConnection oleConnection = new OleDbConnection(connectionString))
            {
                oleConnection.Open();

                using (OleDbCommand createTable = new OleDbCommand("create table Data1 (Name char(10), Age char(10))", oleConnection))
                {
                    createTable.ExecuteNonQuery();
                }

                foreach (var t in dataToPut)
                {
                    using (OleDbCommand addItem = new OleDbCommand("insert into Data1 values (@name, @age)", oleConnection))
                    {
                        addItem.Parameters.AddWithValue("@name", t.Item1);
                        addItem.Parameters.AddWithValue("@age", t.Item2);
                        addItem.ExecuteNonQuery();
                    }
                }
            }
        }
    }
}

答案 1 :(得分:0)

我遇到了同样的问题,插入的字段会得到一个领先的单引号。我发现这只是使用JET 4.0库时的情况,当我切换到ACE 12.0库时,问题就解决了。