我需要从excel文件(.xlsx)将数据加载到sql server表(2008R2)中。我的excel文件名总是不同,工作表名也总是不同。但是列数和列名总是相同的。我有每个 excel 工作簿一张。(.xlsx 文件)我尝试了 Nitesh rai 以及 Nik-shahriar Nikkhah 和其他人提供的解决方案。当我创建包时,所有解决方案一开始都有效。但是当新文件带有新的工作表名称和新的 Excel 名称时,我的包失败了。我很沮丧,真的很沮丧,很长时间都在寻找解决方案。没有运气。可以身体请帮帮我。
问问题
2228 次
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 回答