簡體   English   中英

從另一個Excel工作表插入Excel工作表

[英]Inserting in Excel sheet from another Excel sheet

我正在嘗試閱讀一個Excel工作表,然后通過OleDb創建另一個Excel工作表

在另一個Excel工作表中,我創建了一些列,例如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);
}

經過幾次嘗試,我仍然無法重現觀察到的行為。 我建議做幾件事:

  • 在您的問題中張貼產生單引號問題的整個源代碼,

  • 請嘗試以下來源(控制台應用程序),然后看看會發生什么。 就我而言,值插入正確,沒有任何前導單引號。 唯一的問題是年齡,它是作為文本而不是數字插入的(可以通過顯式指定行的類型來解決):

源代碼:

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庫時,問題才得以解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM