Excelファイル(.xlsx)からSQLサーバーテーブル(2008R2)にデータをロードする必要があります.Excelファイル名は常に異なり、シート名も常に異なります.しかし、列の数と列の名前は常に同じです. Excelワークブックごとに1枚。パッケージを作成すると、最初はすべてのソリューションが機能します。しかし、新しいファイルに新しいシート名が付いた新しい Excel 名が付いていると、パッケージが失敗します。イライラして本当に動揺し、長い間解決策を探しています。体を助けてください。
2 に答える
私はゲームに遅れていると確信していますが、スクリプト コンポーネントを使用して、期待するファイル名の一部を含む指定されたフォルダー内の 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 ループを使用して、各シート名を取得し、指定したシートが見つかったときに必要な処理を行うことができます。
あなたの唯一の望みは、そのような状況に対処するために外部コードアセンブリ(スクリプトコンポーネント/スクリプトタスク)を使用することです。SSISは、Excel接続マネージャーで古いExcelファイルを見つけることができないため、変更されたメタデータについて文句を言います。SSISパッケージ構成を使用して、実行時にファイル名を変更しようとしましたか?
これは、ワークブックの名前が常に異なる部分で役立つはずです。しかし、その後、シート名を変更するという問題に悩まされます。それは私が推測するスクリプトコンポーネントを通して理解する必要があるものです。