使用FME或其他将多个Excel文件迁移到SQL Server

时间:2019-03-26 18:18:43

标签: sql-server excel ssis etl fme

我有几个要迁移到SQL Server 2017的Excel文件。我尝试使用SSIS 2017(ForEachLoop),但无法正常工作(而且我看到以前的回答将我指向旧版本的SSIS)。对我来说,一种解决方法是将excel文件转换为csv,然后将它们直接一对一地直接导入SSMS。我还可以使用FME将“每个” excel文件作为表格发送到SQL Server。

如果我能以某种方式遍历包含所有excel文件(不同版本,97-2003、2013等)的文件夹并将它们逐一读取到SQL Sever 2017中,那将非常好作为一个具有自己名称的单独表格-就像我一张一张地导入它们一样。

例如,abc.xlsx变成dbo.abc,def.xlsx变成dbo.def,ghi.xls变成dbo.ghi,jkl.xls变成dbo.jkl

2 个答案:

答案 0 :(得分:1)

对不起。这是晚8个月。

这不是解决上述问题的方法,但是我想我分享如何完成此任务。基本上,我使用FME将所有excel文件(按其特定名称)导入SQL Server。我没有编写任何代码,也没有遍历目录中的文件。我通过在画布(GUI)上拖动所有输入并将它们全部连接到SQL Server上其特定表(具有其特定名称)来创建工作流。

我知道这不是完成任务的有效方法,但它确实有效!

答案 1 :(得分:0)

这是一个非常有趣的问题!好吧,这对于SSIS来说无疑是一项工作。我想您尝试过了,但没有成功,对。还有其他选择!

您可以尝试一下(我没有尝试过)。

https://www.mstsolutions.com/technical/importing-multiple-excel-files-into-sql-database/

现在,当然要动态创建一堆表。

CREATE PROCEDURE sproc_BuildTable 
    @TableName NVARCHAR(128)
   ,@Column1Name NVARCHAR(32)
   ,@Column1DataType NVARCHAR(32)
   ,@Column1Nullable NVARCHAR(32)
   AS

   DECLARE @SQLString NVARCHAR(MAX)
   SET @SQLString = 'CREATE TABLE '+@TableName + '( '+ @Column1Name +' '+ @Column1DataType +' '+ @Column1Nullable +') ON PRIMARY '

   EXEC (@SQLString)
   GO

然后,将所有这些Excel文件转换为CSV文件,您可以轻松地循环浏览每个文件,并将所有文件批量插入SQL Server中的单独表中。

DECLARE @intFlag varchar
SET @intFlag = 1
WHILE (@intFlag <=5)
BEGIN

PRINT @intFlag


declare @fullpath1 varchar(1000)
select @fullpath1 = '''C:\your_path_here\test\sample' + @intFlag + '.csv'''
print(@fullpath1)

declare @cmd1 nvarchar(1000)
select @cmd1 = 'bulk insert [dbo].[sample' + @intFlag + '] from' + @fullpath1 + ' with (FIELDTERMINATOR = '','', FIRSTROW = 2, ROWTERMINATOR=''\n'')'
print(@cmd1)

exec (@cmd1)


SET @intFlag = @intFlag + 1

END
GO

仅供参考,要将文件夹中的所有Excel文件转换为CSV文件,请运行以下脚本。

Sub WorkbooksSaveAsCsvToFolder()
'UpdatebyExtendoffice20181031
Dim xObjWB As Workbook
Dim xObjWS As Worksheet
Dim xStrEFPath As String
Dim xStrEFFile As String
Dim xObjFD As FileDialog
Dim xObjSFD As FileDialog
Dim xStrSPath As String
Dim xStrCSVFName As String

    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
    On Error Resume Next
Set xObjFD = Application.FileDialog(msoFileDialogFolderPicker)
    xObjFD.AllowMultiSelect = False
    xObjFD.Title = "Kutools for Excel - Select a folder which contains Excel files"
    If xObjFD.Show <> -1 Then Exit Sub
    xStrEFPath = xObjFD.SelectedItems(1) & "\"

    Set xObjSFD = Application.FileDialog(msoFileDialogFolderPicker)

    xObjSFD.AllowMultiSelect = False
    xObjSFD.Title = "Kutools for Excel - Select a folder to locate CSV files"
    If xObjSFD.Show <> -1 Then Exit Sub
    xStrSPath = xObjSFD.SelectedItems(1) & "\"

    xStrEFFile = Dir(xStrEFPath & "*.xls*")

    Do While xStrEFFile <> ""
        Set xObjWB = Workbooks.Open(Filename:=xStrEFPath & xStrEFFile)
        xStrCSVFName = xStrSPath & Left(xStrEFFile, InStr(1, xStrEFFile, ".") - 1) & ".csv"
        xObjWB.SaveAs Filename:=xStrCSVFName, FileFormat:=xlCSV
        xObjWB.Close savechanges:=False
        xStrEFFile = Dir
  Loop
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub

在上面的示例中,我有5个CSV文件,因此我要遍历5x文件夹中的文件。

您可以轻松地将所有Excel文件加载到Access中的单独表中,然后将每个Access表导出到SQL Server中的单独表中。

Option1:
        Dim strPathFile As String, strFile As String, strPath As String
        Dim strTable As String
        Dim blnHasFieldNames As Boolean

        ' Change this next line to True if the first row in EXCEL worksheet
        ' has field names
        blnHasFieldNames = False

        ' Replace C:\Documents\ with the real path to the folder that
        ' contains the EXCEL files
        strPath = "C:\Documents\"

        ' Replace tablename with the real name of the table into which
        ' the data are to be imported
        strTable = "tablename"

        strFile = Dir(strPath & "*.xls")
        Do While Len(strFile) > 0
              strPathFile = strPath & strFile
              DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _
                    strTable, strPathFile, blnHasFieldNames

        ' Uncomment out the next code step if you want to delete the
        ' EXCEL file after it's been imported
        '       Kill strPathFile

              strFile = Dir()
        Loop


Option2:
Dim blnHasFieldNames as Boolean
Dim strWorksheet As String, strTable As String
Dim strPath As String, strPathFile As String

' Change this next line to True if the first row in EXCEL worksheet
' has field names
blnHasFieldNames = False

' Replace C:\Documents\ with the real path to the folder that
' contains the EXCEL files
strPath = "C:\Documents\"

' Replace worksheetname with the real name of the worksheet that is to be
' imported from each file
strWorksheet = "worksheetname"

' Import the data from each workbook file in the folder
strFile = Dir(strPath & "*.xls")
Do While Len(strFile) > 0
      strPathFile = strPath & strFile
      strTable = "tbl_" & Left(strFile, InStrRev(strFile, ".xls") - 1)

      DoCmd.TransferSpreadsheet acImport, _
            acSpreadsheetTypeExcel9, strTable, strPathFile, _
            blnHasFieldNames, strWorksheet & "$"

      ' Uncomment out the next code step if you want to delete the
      ' EXCEL file after it's been imported
      ' Kill strPathFile

      strFile = Dir()
Loop


Option3:
        Dim blnHasFieldNames As Boolean, blnEXCEL As Boolean, blnReadOnly As Boolean
        Dim intWorkbookCounter As Integer
        Dim lngCount As Long
        Dim objExcel As Object, objWorkbook As Object
        Dim colWorksheets As Collection
        Dim strPath As String, strFile As String
        Dim strPassword As String

        ' Establish an EXCEL application object
        On Error Resume Next
        Set objExcel = GetObject(, "Excel.Application")
        If Err.Number <> 0 Then
              Set objExcel = CreateObject("Excel.Application")
              blnEXCEL = True
        End If
        Err.Clear
        On Error GoTo 0

        ' Change this next line to True if the first row in EXCEL worksheet
        ' has field names
        blnHasFieldNames = False

        ' Replace C:\MyFolder\ with the actual path to the folder that holds the EXCEL files
        strPath = "C:\MyFolder\"

        ' Replace passwordtext with the real password;
        ' if there is no password, replace it with vbNullString constant
        ' (e.g., strPassword = vbNullString)
        strPassword = "passwordtext"

        blnReadOnly = True ' open EXCEL file in read-only mode

        strFile = Dir(strPath & "*.xls")

        intWorkbookCounter = 0

        Do While strFile <> ""

              intWorkbookCounter = intWorkbookCounter + 1

              Set colWorksheets = New Collection

              Set objWorkbook = objExcel.Workbooks.Open(strPath & strFile, , _
                    blnReadOnly, , strPassword)

              For lngCount = 1 To objWorkbook.Worksheets.Count
                    colWorksheets.Add objWorkbook.Worksheets(lngCount).Name
              Next lngCount

              ' Close the EXCEL file without saving the file, and clean up the EXCEL objects
              objWorkbook.Close False
              Set objWorkbook = Nothing

              ' Import the data from each worksheet into a separate table
              For lngCount = colWorksheets.Count To 1 Step -1
                    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _
                          "tbl" & colWorksheets(lngCount) & intWorkbookCounter, _
                          strPath & strFile, blnHasFieldNames, _
                          colWorksheets(lngCount) & "$"
              Next lngCount

              ' Delete the collection
              Set colWorksheets = Nothing

              ' Uncomment out the next code step if you want to delete the
              ' EXCEL file after it's been imported
              ' Kill strPath & strFile

              strFile = Dir()

        Loop

        If blnEXCEL = True Then objExcel.Quit
        Set objExcel = Nothing

只需四舍五入,请查看下面的链接以获取更多信息。

https://www.red-gate.com/simple-talk/sql/t-sql-programming/questions-about-using-tsql-to-import-excel-data-you-were-too-shy-to-ask/