无需知道工作表名称,使用SSIS从Excel导入数据

我有一个由另一个服务器更新的电子表格(不受我的控制),我需要将这些数据自动化到SQL 2005中。数据始终是电子表格的第一页。 但是,该表的名称根据行数而变化。

有没有办法运行一个SSIS作业,从Excel中提取数据,而不事先知道表单名称? 它似乎依赖于工作表名称作为数据源,但我想要告诉它“工作表编号1”或类似的东西。

我会将工作表名称编写成SSIS用户variables。 如果您不反对将脚本任务插入到SSIS包中,请尝试以下操作:(基于链接文本 )

Excel.Application xlApp = new Excel.ApplicationClass(); Excel.Workbook xlWorkBook = xlApp.Workbooks.Open("<Name of your excel app>.xls", 0, xlWorkBook true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); // Look up worksheet by index Excel.Worksheet xlWorkSheet =(Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); user::worksheetname = xlWorkSheet.Name; /* Do clean up. Working with COM object */ 

只是为了logging,我在脚本任务中使用此代码来解决问题。 使用的variables是: 文件名

请注意,我的Excel文件名是dynamic的。

 // GET NAME OF FIRST SHEET string filename = (string)Dts.Variables["Filename"].Value; string sheetName = null; string connStr = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"EXCEL 8.0;IMEX=1;\"", 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(); } } catch (Exception) { throw; } finally { conn.Close(); conn.Dispose(); } 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 { Dts.Events.FireError(0, "User::SheetName", "No SheetName found!", String.Empty, 0); Dts.TaskResult = (int)ScriptResults.Failure; } 

我有一个类似的问题。 我实现的解决scheme是首先使用OleDB连接读取excel文件。 打开连接,然后检索所有表单名称。 这是一个例子

 Dim strConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\ABC.xls;Extended Properties=""EXCEL 8.0;""" Dim lstSheetName As List(Of String) = Nothing Try objConn = New OleDbConnection(Me.ConnectionString) objConn.Open() lstSheetName = New List(Of String) Using dtSheetTable As DataTable = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,Nothing) For Each drRow As DataRow In dtSheetTable.Rows lstSheetName.Add("[" & drRow("TABLE_NAME").ToString().Replace("'", "''") & "]") Next End Using Catch ex as Exception Throw Finally If objConn.State = ConnectionState.Open Then objConn.Close() objConn.Dispose() End Try 

这个所有的代码被写入ASPX.VB,然后我通过后面的代码执行SSIS包,并在lstSheetNamevariables(lstSheetName(0).ToString())传递第一个值

这是

我不这么认为……我不知道任何有序的参考语法,例如可以使用的Sheets [0]。

所以,如果你不知道表单名称而无法获取数据 – 你只需要dynamic地找出表单名称。 这个链接在SSIS中获取Excel模式信息应该可以帮助你做到这一点。 一旦你有了这个,你可以把表格名称作为一个variables传递出去。

我以前也有过这个问题,无法find一个解决scheme来读取一个Excel文件,其文件名从文件更改为文件。

我的猜测,我无法去工作,将是在数据连接的属性中使用expression式。 您需要以某种方式将工作表名称读入一个variables,然后将该variables的结果用于数据连接的工作表名称中。

祝你好运,抱歉,我不能有更多的帮助。

如果任何人有JET驱动程序的问题,现在可以使用AccessDatabase驱动程序。 这是从上面改编,并validation在我的机器上工作,没有额外的参考是必要的。

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