0

Excelファイル(.xlsx)からSQLサーバーテーブル(2008R2)にデータをロードする必要があります.Excelファイル名は常に異なり、シート名も常に異なります.しかし、列の数と列の名前は常に同じです. Excelワークブックごとに1枚。パッケージを作成すると、最初はすべてのソリューションが機能します。しかし、新しいファイルに新しいシート名が付いた新しい Excel 名が付いていると、パッケージが失敗します。イライラして本当に動揺し、長い間解決策を探しています。体を助けてください。

4

2 に答える 2

1

私はゲームに遅れていると確信していますが、スクリプト コンポーネントを使用して、期待するファイル名の一部を含む指定されたフォルダー内の Excel ファイルをループすることができます。これにより、ファイルが取得されます (同じフォルダーに異なる目的でドロップされた類似した名前の複数の Excel ファイルがない場合)。

シート名を取得するには、タイプ 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 ループを使用して、各シート名を取得し、指定したシートが見つかったときに必要な処理を行うことができます。

于 2013-04-24T21:17:56.110 に答える
0

あなたの唯一の望みは、そのような状況に対処するために外部コードアセンブリ(スクリプトコンポーネント/スクリプトタスク)を使用することです。SSISは、Excel接続マネージャーで古いExcelファイルを見つけることができないため、変更されたメタデータについて文句を言います。SSISパッケージ構成を使用して、実行時にファイル名を変更しようとしましたか?

これは、ワークブックの名前が常に異なる部分で役立つはずです。しかし、その後、シート名を変更するという問題に悩まされます。それは私が推測するスクリプトコンポーネントを通して理解する必要があるものです。

于 2013-02-26T18:23:23.780 に答える