C # Импорт в SSIS Visual Studio Excel имя листа с пробелами - PullRequest
0 голосов
/ 14 декабря 2018

При чтении листов Excel те, у которых в именах листов есть пробелы, выдают ошибки при выполнении скрипта.

Кажется, что решение заключается в этом select * from [" + sheetname + "]".Но ни один из примеров не привел к правильному решению, когда, например, снятие скобок или изменение двойной кавычки простой кавычкой.

Является ли sheetname.replace ("", "_") единственным способом, которым я вижубыть в состоянии выбрать листы с пустым пространством?

PS: когда я удаляю пустое пространство в исходном файле и заменяю его на «_», скрипт работает нормально.Но, к сожалению, я не могу делать это вручную.

Спасибо

> OleDbCommand oconn = new OleDbCommand("select * from [" + sheetname + "]", cnn);

Это весь код, который у меня есть в Visual Studio.

  namespace ST_689a7e5f91cd44f892e3d4b3290d003b
    {
            public void Main()
            {
                // TODO: Add your code here
                String FolderPath = Dts.Variables["User::FolderPath"].Value.ToString();
                var directory = new DirectoryInfo(FolderPath);
                FileInfo[] files = directory.GetFiles();

                //Declare and initilize variables
                string fileFullPath = "";

            //Get one Book(Excel file at a time)
            foreach (FileInfo file in files)
            {
                string filename = "";
                fileFullPath = FolderPath + "\\" + file.Name;
                filename = file.Name.Replace(".xlsx", "");
                MessageBox.Show(fileFullPath);

                //Create Excel Connection
                string ConStr;
                string HDR;
                HDR = "YES";
                ConStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileFullPath + ";Extended Properties=\"Excel 12.0;HDR=" + HDR + ";IMEX=1\"";
                OleDbConnection cnn = new OleDbConnection(ConStr);


                //Get Sheet Name
                cnn.Open();
                DataTable dtSheet = cnn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                string sheetname;
                sheetname = "";
                foreach (DataRow drSheet in dtSheet.Rows)
                {
                    if (drSheet["TABLE_NAME"].ToString().Contains("$"))
                    {


                        sheetname = drSheet["TABLE_NAME"].ToString();
                        //Display Sheet Name , you can comment it out
                        MessageBox.Show(sheetname);



                        //Load the DataTable with Sheet Data  sheetname =  Regex.Replace(input, @"[^0-9a-zA-Z\._]", string.Empty);
                        OleDbCommand oconn = new OleDbCommand("select * from [" + sheetname + "]", cnn);
                        //cnn.Open();
                        OleDbDataAdapter adp = new OleDbDataAdapter(oconn);
                        DataTable dt = new DataTable();
                        adp.Fill(dt);

                        //drop $from sheet name
                        sheetname = sheetname.Replace("$", "");


                        // Generate Create Table Script by using Header Column,It will drop the table if Exists and Recreate                  
                        string tableDDL = "";
                        tableDDL += "IF EXISTS (SELECT * FROM sys.objects WHERE object_id = ";
                        tableDDL += "OBJECT_ID(N'[dbo].[" + filename + "_" + sheetname + "]') AND type in (N'U'))";
                        tableDDL += "Drop Table [dbo].[" + filename + "_" + sheetname + "]";
                        tableDDL += "Create table [" + filename + "_" + sheetname + "]";
                        tableDDL += "(";
                        for (int i = 0; i < dt.Columns.Count; i++)
                        {
                            if (i != dt.Columns.Count - 1)
                                tableDDL += "[" + dt.Columns[i].ColumnName + "] " + "NVarchar(max)" + ",";
                            else
                                tableDDL += "[" + dt.Columns[i].ColumnName + "] " + "NVarchar(max)";
                        }
                        tableDDL += ")";


                        //use ADO.NET connection to Create Table from above Definition
                        SqlConnection myADONETConnection = new SqlConnection();
                        myADONETConnection = (SqlConnection)(Dts.Connections["DBConn"].AcquireConnection(Dts.Transaction) as SqlConnection);
                        //you can comment the messagebox, it is for debugging
                        MessageBox.Show(tableDDL.ToString());
                        SqlCommand myCommand = new SqlCommand(tableDDL, myADONETConnection);
                        myCommand.ExecuteNonQuery();
                        //Comment this message, it is for debugging
                        MessageBox.Show("TABLE IS CREATED");


                        //Load the data from DataTable to SQL Server Table.
                        SqlBulkCopy blk = new SqlBulkCopy(myADONETConnection);
                        blk.DestinationTableName = "[" + filename + "_" + sheetname + "]";
                        blk.WriteToServer(dt);
                    }
                }
            }


            Dts.TaskResult = (int)ScriptResults.Success;
        }

        #region ScriptResults declaration
        /// <summary>
        /// This enum provides a convenient shorthand within the scope of this class for setting the
        /// result of the script.
        /// 
        /// This code was generated automatically.
        /// </summary>
        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...