Миграция нескольких файлов Excel на SQL Server с использованием FME или чего-то еще - PullRequest
2 голосов
/ 26 марта 2019

У меня есть несколько файлов Excel, которые я хочу перенести в SQL Server 2017. Я пытался использовать 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

1 Ответ

0 голосов
/ 13 июня 2019

Это очень интересный вопрос! Ну, это, безусловно, звучит как работа для 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 / простой разговор / SQL / TSQL-программирование / вопросы-о-с использованием TSQL-к-импорту-первенствует-данные, что Вы были слишком shy- к-аск /

...