Import data from Excel using SSIS without knowing sheet name

后端 未结 6 1773
情话喂你
情话喂你 2021-01-04 22:39

I have a spreadsheet that is updated by another server (out of my control) and I need to automate bringing that data into SQL 2005. The data is always the first page of the

6条回答
  •  清歌不尽
    2021-01-04 23:20

    If anyone has trouble with the JET Driver you can use the AccessDatabase drivers now. This was adapted from above and is verified working on my machine, no extra references are needed for this.

    using System;
    using System.Data;
    using Microsoft.SqlServer.Dts.Runtime;
    using System.Windows.Forms;
    using System.Data.OleDb;
    
        public void Main()
        {
            // GET NAME OF FIRST SHEET
            string filename = Dts.Variables["User::ActiveFileName"].Value.ToString();
            string sheetName = null;
            bool dummy = true;
    
            string connStr =
                String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"EXCEL 12.0 XML;HDR=YES\";", filename);
            var conn = new OleDbConnection(connStr);
            try
            {
                conn.Open();
    
                using(var dtSheet = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null))
                {
                    var row0 = dtSheet.Rows[0];
                    sheetName = row0["TABLE_NAME"].ToString();
                }
    
                if (!String.IsNullOrEmpty(sheetName))
                {
                    Dts.Variables["SheetName"].Value = sheetName;
                    Dts.Events.FireInformation(1, "User::SheetName", sheetName, "", 0, ref dummy);
                    Dts.TaskResult = (int)ScriptResults.Success;
                }
                else
                {
                    throw new Exception("No SheetName found!");
                }
            }
            catch (Exception ex)
            {
                Dts.Events.FireError(0, "User::SheetName", ex.Message, String.Empty, 0);
                Dts.TaskResult = (int)ScriptResults.Failure;
            }
            finally
            {
                conn.Close();
                conn.Dispose();
            }
        }
    

提交回复
热议问题