SSIS – 从最新的excel文件中提取文件夹

我正在创build一个SSIS包,理想情况下:

  • 通过文件夹读取
  • 抓取最新文件的文件名和表名
  • 将文件名和图纸名称传递到连接pipe理器上
  • 只提取并加载最新的文件到数据库中

该文件夹将定期更新最新版本的文件。 有问题的文件将有3张,按特定顺序依次加载。 最好我想通过文件的最新写入时间来抓取文件,而不是使用文件名。 每次上传文件名称本身都会有所不同。

我已经创build了一个控制stream程,用于在将表单加载到数据库中时按照正确的顺序进行提取和加载,但是它只能从Excel连接pipe理器中的指定文件读取:

  • Sheet1:Excel Source – > OLE DB Destination
  • Sheet2:Excel Source – > OLE DB Destination
  • Sheet3:Excel Source – > OLE DB Destination

我发现的内容涉及将文件名作为variables传递给连接pipe理器,但是我find的示例也没有考虑表单名称。 请有人帮助我使这更具活力?

我正在使用SQL Server 2012并在Visual Studio 2010中进行devise。

我可以帮助你获得VS 2008中的表格名称(2010年可能是相同的)。

创build一个types为Object的variables(objExcelSheets)创build一个脚本任务。 将文件名/pathvariables添加到脚本(只读)将对象variables添加到读写variables

以下是脚本任务的一些代码

Private Sub GetExcelSheets() Dim excelFile, connstr, curTable As String Dim excelConnection As OleDb.OleDbConnection Dim tablesInFile As DataTable Dim tablenameInFile As DataRow Dim tableCount As Integer = 0 Dim tableIndex As Integer = 0 Dim excelTables As String() Dim blnFound As Boolean = False ReDim excelTables(0) excelFile = Dts.Variables("sFilePath").Value.ToString connstr = GetExcelConnString() excelConnection = New OleDb.OleDbConnection(connstr) excelConnection.Open() tablesInFile = excelConnection.GetSchema("Tables") tableCount = tablesInFile.Rows.Count For Each tablenameInFile In tablesInFile.Rows curTable = tablenameInFile.Item("TABLE_NAME").ToString.Trim.ToLower If curTable.IndexOf("SOMETHING_IN_THE_SHEETS_TO_PROCESS") >= 0 Then blnFound = True ReDim excelTables(tableIndex) excelTables(tableIndex) = "[" + curTable + "]" tableIndex += 1 End If Next If IsNothing(excelTables(0)) Then excelTables(0) = String.Empty excelConnection.Close() Dts.Variables("objExcelSheet").Value = excelTables End Sub Private Function GetExcelConnString() As String Dim sExtendedProperties, sExtension, sFilePath, sExcelConn As String sFilePath = Dts.Variables("sFilePath").Value.ToString sExtension = sFilePath.Substring(sFilePath.LastIndexOf(".")) If sExtension.ToLower = ".xlsx" Then sExtendedProperties = ";Extended Properties=""EXCEL 12.0;HDR=NO"";" ElseIf sExtension.ToLower = ".xls" Then sExtendedProperties = ";Extended Properties=""EXCEL 8.0;HDR=NO;IMEX=1"";" Else sExtendedProperties = String.Empty End If sExcelConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & sFilePath & sExtendedProperties Return sExcelConn End Function 

请注意,这需要安装ACE驱动程序,如果您没有那些需要将sExcelConnreplace为连接string的文件。

这将把所有在工作表名称中使用SOMETHING_IN_THE_SHEETS_TO_PROCESSfind的Excel工作表放到对象variablesobjExcelSheet中。 您可以将其replace为您需要的任何东西,或将其全部清除掉。

然后,您可以执行ForEach循环来处理每个工作表。

Foreach从variables枚举器 – variables= objExcelSheet

variables映射 – variables(带索引0的WorksheetName)

这应该可以帮助你获得你需要的地方,你可以dynamic地select要处理的工作表,并从那里做你需要做的事情。