Пакетное преобразование XLS в XLSX


12

Мне приходится работать со старым приложением, которое может экспортировать только файлы XLS, и я пишу программы в .Net с использованием библиотеки EPPlus, которая способна только читать файлы XLSX.

Какой самый простой способ пакетного преобразования из XLS в XLSX?

Ответы:


6

Посмотрите на менеджера по планированию миграции Office.

Инструментарий также содержит конвертер файлов Office (OFC), который позволяет выполнять массовые преобразования документов из двоичных форматов в OpenXML. ( Technet )

Обзор на Technet

Ссылка на скачивание

Обратите внимание, что вам также понадобится Microsoft Office Compatibility Pack for Word, Excel, and PowerPoint File Formatsдля работы OFC.
Оба инструмента, похоже, больше не поддерживаются.


1
Похоже, многие люди, включая меня, имеют проблемы с этим инструментом, который не может конвертировать свои файлы xls без видимой причины.
Джон

3

Я бы рекомендовал использовать макрос для обработки файлов в папке, чтобы преобразовать их из xls в xlsx. В этом коде предполагается, что все файлы находятся в одной папке и что все xls-файлы необходимо преобразовать, но если вы хотите выбрать отдельные файлы, этот код можно обновить.

Этот код должен быть запущен из книги Excel 2007 или выше.

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

Примечание. Если конвертируемые файлы содержат макросы, необходимо обновить их FileFormat:=xlOpenXMLWorkbookдля чтения FileFormat:=xlOpenXMLWorkbookMacroEnabled. Или, если вам не нужен код макроса в преобразованных файлах, вы можете оставить его в покое, и он будет удалять макросы при преобразовании его в формат xlsx.


Что если я захочу конвертировать .CSV в .XLSX?
Boris_yo

0
Sub SaveAllAsXLSX ()
Dim strFilename As String
Dim strDocName As String
Dim strPath As String
Dim WBK As Workbook
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 As New Collection
Dim vFile As Variant
Set fDialog = Application.FileDialog (msoFileDialogFolderPicker)
С помощью fDialog
    .Title = "Выберите папку и нажмите ОК"
    .AllowMultiSelect = True
    .InitialView = msoFileDialogViewList
    Если .Show -1, то
        MsgBox "Отменено пользователем", "Список содержимого папки"
        Exit Sub
    End If
    strPath = fDialog.SelectedItems.Item (1)
    Если верно (strPath, 1) "\" Тогда strPath = strPath + "\"
Конец с
Если осталось (strPath, 1) = Chr (34), то
    strPath = Mid (strPath, 2, Len (strPath) - 2)
End If
Set obj = CreateObject ("Scripting.FileSystemObject")
RecursiveDir colFiles, strPath, "* .xls", True
Для каждого vFile в colFiles
        Debug.Print vFile
    strFilename = vFile
    varA = Right (strFilename, 3)
    Если (varA = "xls" или varA = "XLSX"), то
     Set wbk = Workbooks.Open (имя файла: = имя_строки)
       Если wbk.HasVBProject, то
              Имя файла wbk.SaveAs: = имя_файла & "m", формат файла: = xlOpenXMLWorkbookMacroEnabled
            еще
               wbk.SaveAs Имя файла: = имя_файла & "x", формат файла: = xlOpenXMLWorkbook
            End If
            wbk.Close SaveChanges: = False
           obj.DeleteFile (strFilename)
    End If
Следующий vFile

End Sub
Открытая функция RecursiveDir (colFiles As Collection, _
                             strFolder As String, _
                             strFileSpec As String, _
                             bIncludeSubfolders As Boolean)

    Dim strTemp As String
    Dim colFolders As New Collection
    Dim vFolderName As Variant

    'Добавить файлы в strFolder, соответствующие strFileSpec, в colFiles
    strFolder = TrailingSlash (strFolder)
    strTemp = Dir (strFolder & strFileSpec)
    Делай пока strTemp vbNullString
        colFiles.Add strFolder & strTemp
        strTemp = Dir
    петля

    Если bIncludeSubfolders То
        'Заполнить colFolders списком подкаталогов strFolder
        strTemp = Dir (strFolder, vbDirectory)
        Делай пока strTemp vbNullString
            If (strTemp ".") И (strTemp "..") Тогда
                If (GetAttr (strFolder & strTemp) и vbDirectory) 0 Тогда
                    colFolders.Add strTemp
                End If
            End If
            strTemp = Dir
        петля

        Вызовите RecursiveDir для каждой подпапки в colFolders
        Для каждого vFolderName В colFolders
            Вызовите RecursiveDir (colFiles, strFolder & vFolderName, strFileSpec, True)
        Next vFolderName
    End If

Конечная функция
Открытая функция TrailingSlash (strFolder As String) как String
    Если Лен (strFolder)> 0, то
        Если верно (strFolder, 1) = "\" Тогда
            TrailingSlash = strFolder
        еще
            TrailingSlash = strFolder & "\"
        End If
    End If
Конечная функция


8
Вместо того, чтобы просто вставлять кучу кода, не могли бы вы также немного объяснить, что он делает, как его использовать и каковы ограничения (если есть)? Это было бы более полезно для будущих посетителей.
slhck

0

Если у вас установлен MsOffice, возможно, стоит быстро скачать этот инструмент.

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

Когда вы выбираете папку, чтобы увидеть преобразованные файлы xls, убедитесь, что вы отметили опцию инструмента конвертации, которая использует MS Office для конвертации, а не их собственный конвертер.

Если вы используете их собственный конвертер, вы потеряете цвета в ячейках, и, похоже, один лист выйдет. Если вы используете MsOffice в качестве конвертера, похоже, работает хорошо. Хороший инструмент для быстрого исправления.


0

Поэтому я написал простой VBScript для автоматического преобразования файлов .xls в .xlsx.

./convert-xls-xlsx.vbs {путь к папке, содержащей файлы .xls}

convert-xls-xlsx.vbs:

    Установить args = WScript.Arguments
    strPath = args (0)
    strPath = CreateObject ("Scripting.FileSystemObject"). GetAbsolutePathName (strPath)
    Установите objExcel = CreateObject ("Excel.Application")
    objExcel.Visible = False
    objExcel.DisplayAlerts = False
    Установите objFso = CreateObject ("Scripting.FileSystemObject")
    Установите objFolder = objFso.GetFolder (strPath)
    Для каждого objFile В objFolder.Files
        fileName = objFile.Path
        If (objFso.GetExtensionName (objFile.Path) = "xls"), то
            Установите objWorkbook = objExcel.Workbooks.Open (fileName)
            saveFileName = Replace (fileName, ". xls", ". xlsx")
            objWorkbook.SaveAs saveFileName, 51
            objWorkbook.Close ()
            objExcel.Application.DisplayAlerts = True
        End If
    следующий
    MsgBox "Законченное преобразование"

ПРИМЕЧАНИЕ. Обратите внимание на наличие пробелов в пути к папке. Если в пути есть пробел между ними, укажите путь в кавычках.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.