2013-02-26 24 views
0

我需要從excel文件(.xlsx)中將數據加載到sql server表(2008R2)中。我的excel文件名總是不同的,並且表名也總是不一樣。但是列數和列名始終是相同的。每個excel工作簿有一張表格(.xlsx文件)我嘗試了Nitesh rai以及Nik-shahriar Nikkhah和其他人提供的解決方案。所有的解決方案在我創建包時都會起作用。但是當新文件帶有新的名稱和新的名稱時,我的包會失敗。我很沮喪,真的很沮喪,很長時間沒有找到解決方案。沒關係。身體請幫助我。在ssis中當sheetname總是不同的時候加載excel文件

回答

0

您唯一的希望就是使用外部代碼集合(腳本組件/腳本任務)來處理這種情況。 SSIS抱怨更改後的元數據,因爲它無法在Excel連接管理器中找到舊的Excel文件。您是否嘗試過使用SSIS Package配置在運行時更改文件名?

這應該能夠幫助您完成工作簿名稱不同的部分。但是,那麼你就會遇到更改表單名稱的問題。這是你需要通過我猜想的腳本組件來弄清楚的。

+0

首先,我不能每次使用軟件包配置來更改文件名。整個過程應該是自動化的,不需要任何人爲干預。我從Naomi手中獲得了vb.net腳本。我認爲腳本可以幫助我,但仍然有幫助也有一些限制。 – vigilant 2013-02-28 19:58:34

1

我確定我遲到了,但是您可以使用腳本組件來循環指定文件夾中包含部分文件名的excel文件。這將爲您提供該文件(前提是您沒有多個具有相同名稱的excel文件放在同一個文件夾中,但出於不同目的)。

爲了獲得sheetnames,你可以可以創建Object類型的變量,然後使用下面的代碼:

Public Sub Main() 

    GetExcelSheets() 
    'SetExcelConnString(GetExcelConnString) 

    Dts.TaskResult = ScriptResults.Success 
End Sub 

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("sheet1$") >= 0 Then 'change this to be part of the sheet name that you are looking for. It should be unique to the specific sheet 
      blnFound = True 
      ReDim excelTables(tableIndex) 
      excelTables(tableIndex) = "[" + curTable + "]" 
      tableIndex += 1 
     End If 
    Next 

    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 


Private Sub SetExcelConnString(ByVal sExcelConn As String) 
    Dts.Connections("Excel").ConnectionString = sExcelConn 
End Sub 

然後,您可以使用一個For Each循環與對象,以獲取每個SHEETNAME和處理找到指定工作表時需要執行的操作。

相關問題