Konwersja wsadowa XLS na XLSX

12

Muszę pracować ze starą aplikacją, która może eksportować tylko pliki XLS i piszę programy w .Net przy użyciu biblioteki EPPlus, która jest w stanie odczytywać tylko pliki XLSX.

Jaki jest najprostszy sposób na konwersję wsadową z XLS na XLSX?

Pochodzenie
źródło

Odpowiedzi:

6

Sprawdź Menedżera planowania migracji pakietu Office.

Zestaw zawiera także konwerter plików Office (OFC), który umożliwia konwersję dokumentów zbiorczych z formatów binarnych na formaty OpenXML. ( Technet )

Omówienie Technet

Link do pobrania

Pamiętaj, że będziesz również potrzebować Microsoft Office Compatibility Pack for Word, Excel, and PowerPoint File FormatsOFC do działania.
Oba narzędzia tak naprawdę nie są już obsługiwane.

ChrisN
źródło
1
Wygląda na to, że sporo osób, w tym ja, ma problem z tym, że to narzędzie nie konwertuje plików xls bez wyraźnego powodu.
John
3

Polecam użycie makra do przetwarzania plików w folderze w celu konwersji ich z XLS na XLSX. Ten kod zakłada, że ​​wszystkie pliki znajdują się w jednym folderze i że wszystkie pliki xls muszą zostać przekonwertowane, ale jeśli chcesz wybrać pojedyncze pliki, ten kod może zostać zaktualizowany.

Ten kod musiałby zostać uruchomiony ze skoroszytu programu Excel 2007 lub nowszego.

Option Explicit

' Convert all xls files in selected folder to xlsx

Public Sub convertXLStoXLSX()

    Dim FSO As Scripting.FileSystemObject
    Dim strConversionPath As String
    Dim fFile As File
    Dim fFolder As Folder
    Dim wkbConvert As Workbook

    ' Open dialog and select folder
    With Application.FileDialog(msoFileDialogFolderPicker)
        .AllowMultiSelect = False
        .Show
        On Error Resume Next ' Prevent debug mode if user cancels selection
        strConversionPath = .SelectedItems(1)
        On Error GoTo 0      ' Re-enable default error handling
    End With

    Set FSO = New Scripting.FileSystemObject

    ' Check if the folder exists
    If FSO.FolderExists(strConversionPath) Then
        Set fFolder = FSO.GetFolder(strConversionPath)

        ' Disable confirmation dialogs (to prevent "unsaved changes" dialog popping up)
        ' and screen updates (to speed up conversion)
        Application.DisplayAlerts = False
        Application.ScreenUpdating = False

        ' Loop through files, find the .xls files
        For Each fFile In fFolder.Files
            If LCase$(Right(fFile.Name, 4)) = ".xls" Then
                ' Open temporary workbook
                Set wkbConvert = Workbooks.Open(fFile.Path)
                ' Save as OpenXML workbook - if your .xls files contain macros
                ' then change to FileFormat:=xlOpenXMLWorkbookMacroEnabled
                wkbConvert.SaveAs FSO.BuildPath(fFile.ParentFolder, _
                                    Left(fFile.Name, Len(fFile.Name) - 4)) & ".xlsx", _
                                  FileFormat:=xlOpenXMLWorkbook
                wkbConvert.Close SaveChanges:=False
                ' Delete original file
                fFile.Delete Force:=True
            End If
        Next fFile

        ' Re-enable confirmation dialogs and screen updates
        Application.DisplayAlerts = True
        Application.ScreenUpdating = True

    End If

End Sub

Uwaga: jeśli pliki, które konwertujesz, zawierają makra, musisz zaktualizować plik FileFormat:=xlOpenXMLWorkbookdo odczytu FileFormat:=xlOpenXMLWorkbookMacroEnabled. Lub jeśli nie potrzebujesz kodu makr w przekonwertowanych plikach, możesz zostawić go w spokoju i usunie makra, gdy konwertuje go do formatu xlsx.

Nick Perkins
źródło
Co jeśli chcę przekonwertować .CSV na .XLSX?
Boris_yo,
1

Napisałem więc prosty VBScript do cichej konwersji plików .xls na .xlsx.

./convert-xls-xlsx.vbs {ścieżka do folderu zawierającego pliki .xls}

convert-xls-xlsx.vbs:

    Ustaw args = WScript.Arguments
    strPath = args (0)
    strPath = CreateObject ("Scripting.FileSystemObject"). GetAbsolutePathName (strPath)
    Ustaw objExcel = CreateObject („Excel.Application”)
    objExcel.Visible = False
    objExcel.DisplayAlerts = False
    Ustaw objFso = CreateObject ("Scripting.FileSystemObject")
    Ustaw objFolder = objFso.GetFolder (strPath)
    For Each objFile In objFolder.Files
        nazwa_pliku = objFile.Path
        Jeśli (objFso.GetExtensionName (objFile.Path) = "xls"), to
            Ustaw objWorkbook = objExcel.Workbooks.Open (fileName)
            saveFileName = Zamień (fileName, ". xls", ". xlsx")
            objWorkbook.SaveAs saveFileName, 51
            objWorkbook.Close ()
            objExcel.Application.DisplayAlerts = True
        End If
    Kolejny
    MsgBox „Zakończono konwersję”

UWAGA: Zwróć uwagę na spacje w ścieżce folderu, jeśli na ścieżce jest spacja między nimi, umieść ścieżkę w cudzysłowie.

revosftw
źródło
Zmieniłem DisplayAlerts na = False, ponieważ nie chcę wiedzieć o żadnych makrach, po prostu je usuń, dlatego przede wszystkim przekształcam te rzeczy. Następnie usunąłem końcowy MsgBox, ponieważ nie chciałem, żeby mnie to wkurzyło.
BeowulfNode42
@ BeowulfNode42 cool, ale myślę, że zachowałem DisplayAlerts tylko dlatego, że moje skoroszyty były uszkodzone. Ale z drugiej strony nie pamiętam teraz dokładnie.
revosftw
0
Sub SaveAllAsXLSX ()
Dim strFilename As String
Dim strDocName As String
Dim strPath As String
Dim wbk jako skoroszyt
Dim fDialog As FileDialog
Dim intPos As Integer
Dim strPassword As String
Dim strWritePassword As String
Dim varA As String
Dim varB As String
Dim colFiles jako nowa kolekcja
Dim vFile As Variant
Ustaw fDialog = Application.FileDialog (msoFileDialogFolderPicker)
Z fDialog
    .Title = "Wybierz folder i kliknij OK"
    .AllowMultiSelect = True
    .InitialView = msoFileDialogViewList
    Jeśli .Pokaż -1 to
        MsgBox „Anulowane przez użytkownika”, „Lista zawartości folderu”
        Wyjdź z Sub
    End If
    strPath = fDialog.SelectedItems.Item (1)
    Jeśli Right (strPath, 1) „\” Następnie strPath = strPath + „\”
Kończyć z
Jeśli lewy (strPath, 1) = Chr (34), to
    strPath = Mid (strPath, 2, Len (strPath) - 2)
End If
Ustaw obj = CreateObject ("Scripting.FileSystemObject")
RecursiveDir colFiles, strPath, „* .xls”, True
Dla każdego pliku vFile w colFiles
        Debug.Print vFile
    strFilename = vFile
    varA = Right (strFilename, 3)
    Jeśli (varA = „xls” lub varA = „XLSX”), to
     Ustaw wbk = skoroszyty. Otwórz (Nazwa pliku: = strFilename)
       Jeśli wbk.HasVBProject Then
              wbk.SaveAs Nazwa pliku: = strFilename & "m", FileFormat: = xlOpenXMLWorkbookMacroEnabled
            Jeszcze
               wbk.SaveAs Nazwa pliku: = strFilename & "x", FileFormat: = xlOpenXMLWorkbook
            End If
            wbk.Close SaveChanges: = False
           obj.DeleteFile (strFilename)
    End If
Następny plik v

Napis końcowy
Public Function RecursiveDir (colFiles As Collection, _
                             strFolder As String, _
                             strFileSpec As String, _
                             bIncludeSubfolders As Boolean)

    Dim strTemp As String
    Dim colFolders jako nowa kolekcja
    Dim vFolderName jako wariant

    „Dodaj pliki w strFolder pasujące do strFileSpec do colFiles
    strFolder = TrailingSlash (strFolder)
    strTemp = Dir (strFolder i strFileSpec)
    Do While strTemp vbNullString
        colFiles.Add strFolder & strTemp
        strTemp = reż
    Pętla

    Jeśli bIncludeSubfolders to
        „Wypełnij colFolders listą podkatalogów strFolder
        strTemp = Dir (strFolder, vbDirectory)
        Do While strTemp vbNullString
            Jeśli (strTemp „.”) I (strTemp „..”) To
                Jeśli (GetAttr (strFolder & strTemp) i vbDirectory) 0 to
                    colFolders.Add strTemp
                End If
            End If
            strTemp = reż
        Pętla

        „Call RecursiveDir dla każdego podfolderu w colFolderach
        For Each vFolderName In colFolders
            Call RecursiveDir (colFiles, strFolder & vFolderName, strFileSpec, True)
        Następny vFolderName
    End If

Funkcja zakończenia
Funkcja publiczna TrailingSlash (strFolder As String) As String
    Jeśli Len (strFolder)> 0 to
        Jeśli Right (strFolder, 1) = "\" To
            TrailingSlash = strFolder
        Jeszcze
            TrailingSlash = strFolder i „\”
        End If
    End If
Funkcja zakończenia

pratap
źródło
8
Zamiast po prostu wkleić kilka fragmentów kodu, czy mógłbyś też trochę wyjaśnić, co robi, jak go używać i jakie są ograniczenia (jeśli w ogóle)? Byłoby to bardziej pomocne dla przyszłych gości.
slhck
0

Jeśli masz zainstalowany MsOffice, to narzędzie może być warte pobrania w celu szybkiej naprawy.

http://www.softinterface.com/Convert-XLS/Features/Convert-XLS-To-XLSX.htm

Po wybraniu folderu, w którym chcesz przekonwertować pliki xls, zaznacz opcję narzędzia do konwersji używającego MS Office do konwersji, a nie własnego konwertera.

Jeśli użyjesz własnego konwertera, stracisz kolory w komórkach i wydaje się, że wychodzi pojedynczy arkusz. Jeśli używasz MsOffice, ponieważ konwerter wydaje się działać dobrze. Dobre narzędzie do szybkiej naprawy.

99Sono
źródło