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

我正在尝试读取一个Excel表,然后通过OleDb创build另一个Excel表

在这个另一个Excel表中,我做了一些Colums,比如Name char(10),Age Number

现在,当我读取该Excel工作表,并试图在这个另一个Excel工作表中插入值,然后插入值,但也包含一个额外的字符,即单引号(')作为第一个字符。

为什么所有的价值都被单引号报价到实际价值? 如何摆脱它? 我为此使用c#.net。

@编辑

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中。

这将是奇怪的,但也许这是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); } 

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

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

  • 尝试下面的来源(控制台应用程序),看看会发生什么。 在我的情况下,价值插入,没有任何领先的单引号。 唯一的问题是年龄,作为文本而不是数字插入(可以通过显式指定行的types来解决):

源代码:

 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(); } } } } } } 

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