Conversión por lotes de XLS a XLSX


12

Tengo que trabajar con una aplicación antigua que solo puede exportar archivos XLS y escribo programas en .Net usando la biblioteca EPPlus que solo es capaz de leer archivos XLSX.

¿Cuál es la forma más fácil de convertir por lotes de XLS a XLSX?

Respuestas:


6

Echa un vistazo a Office Migration Planning Manager.

El kit de herramientas también contiene el convertidor de archivos de Office (OFC), que permite conversiones de documentos en masa de binario a formatos OpenXML. ( Technet )

Descripción general en Technet

Enlace de descarga

Tenga en cuenta que también necesitará Microsoft Office Compatibility Pack for Word, Excel, and PowerPoint File Formatsla OFC para funcionar.
Ambas herramientas ya no parecen ser compatibles.


1
Parece que algunas personas, incluido yo, tienen problemas con esta herramienta que no puede convertir sus archivos xls sin razón aparente.
John

3

Recomiendo usar una macro para procesar los archivos dentro de una carpeta para convertirlos de xls a xlsx. Este código supone que todos los archivos están ubicados dentro de una carpeta y que todos los archivos xls deben convertirse, pero si desea seleccionar archivos individuales, este código podría actualizarse.

Este código debería ejecutarse desde un libro de Excel 2007 o superior.

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

Nota: Si los archivos que está convirtiendo contienen macros, entonces necesitará actualizar el FileFormat:=xlOpenXMLWorkbookpara leer FileFormat:=xlOpenXMLWorkbookMacroEnabled. O si no necesita el código de macro en los archivos convertidos, puede dejarlo solo y eliminará las macros cuando lo convierta al formato xlsx.


¿Qué sucede si quiero convertir .CSV a .XLSX?
Boris_yo

0
Sub SaveAllAsXLSX ()
Dim str Nombre de archivo como cadena
Dim strDocName como cadena
Dim strPath como cadena
Dim wbk As Workbook
Dim fDialog As FileDialog
Dim intPos como entero
Dim strPassword As String
Dim strWritePassword As String
Dim varA As String
Dim varB como cadena
Dim colFiles como nueva colección
Dim vFile como variante
Establecer fDialog = Application.FileDialog (msoFileDialogFolderPicker)
Con fDialog
    .Title = "Seleccione la carpeta y haga clic en Aceptar"
    .AllowMultiSelect = True
    .InitialView = msoFileDialogViewList
    Si .Mostrar -1 Entonces
        MsgBox "Cancelado por el usuario", "Listar el contenido de la carpeta"
        Salir Sub
    Terminara si
    strPath = fDialog.SelectedItems.Item (1)
    Si es correcto (strPath, 1) "\" Entonces strPath = strPath + "\"
Terminar con
If Left (strPath, 1) = Chr (34) Entonces
    strPath = Mid (strPath, 2, Len (strPath) - 2)
Terminara si
Establecer obj = CreateObject ("Scripting.FileSystemObject")
RecursiveDir colFiles, strPath, "* .xls", True
Para cada vFile en colFiles
        Debug.Print vFile
    strFilename = vFile
    varA = Derecha (strFilename, 3)
    If (varA = "xls" O varA = "XLSX") Entonces
     Establecer wbk = Workbooks.Open (Nombre de archivo: = strFilename)
       Si wbk.HasVBProject entonces
              wbk.SaveAs Filename: = strFilename & "m", FileFormat: = xlOpenXMLWorkbookMacroEnabled
            Más
               wbk.SaveAs Filename: = strFilename & "x", FileFormat: = xlOpenXMLWorkbook
            Terminara si
            wbk.Close SaveChanges: = False
           obj.DeleteFile (strFilename)
    Terminara si
Siguiente vFile

End Sub
Public Function RecursiveDir (colFiles As Collection, _
                             strFolder As String, _
                             strFileSpec como cadena, _
                             bIncludeSubfolders As Boolean)

    Dim strTemp As String
    Dim colFolders como nueva colección
    Dim vFolderName como variante

    'Agregar archivos en strFolder haciendo coincidir strFileSpec con colFiles
    strFolder = TrailingSlash (strFolder)
    strTemp = Dir (strFolder y strFileSpec)
    Do While strTemp vbNullString
        colFiles.Agregar strFolder y strTemp
        strTemp = Dir
    Lazo

    Si bIncludeSubfolders Entonces
        'Rellenar colFolders con la lista de subdirectorios de strFolder
        strTemp = Dir (strFolder, vbDirectory)
        Do While strTemp vbNullString
            If (strTemp ".") Y (strTemp "..") Entonces
                If (GetAttr (strFolder & strTemp) y vbDirectory) 0 Entonces
                    colFolders.Add strTemp
                Terminara si
            Terminara si
            strTemp = Dir
        Lazo

        'Llame a RecursiveDir para cada subcarpeta en colFolders
        Para cada vFolderName en colFolders
            Call RecursiveDir (colFiles, strFolder & vFolderName, strFileSpec, True)
        Siguiente vFolderName
    Terminara si

Función final
Función pública TrailingSlash (strFolder como cadena) como cadena
    Si Len (strFolder)> 0 entonces
        If Right (strFolder, 1) = "\" Entonces
            TrailingSlash = strFolder
        Más
            TrailingSlash = strFolder & "\"
        Terminara si
    Terminara si
Función final


8
En lugar de simplemente pegar un montón de código, ¿podría explicar también un poco qué hace, cómo usarlo y cuáles son las limitaciones (si las hay)? Eso sería más útil para futuros visitantes.
slhck

0

Si tiene instalado MsOffice, entonces vale la pena descargar esta herramienta para una solución rápida.

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

Cuando seleccione una carpeta para ver los archivos xls convertidos, asegúrese de marcar la opción de herramienta de conversión que usa MS Office para la conversión, no su propio convertidor.

Si usa su propio convertidor, perderá colores en las celdas y parece que sale una sola hoja. Si usa MsOffice como el convertidor parece funcionar bien. Buena herramienta para una solución rápida.


0

Así que escribí un simple VBScript para convertir archivos .xls a .xlsx de manera silenciosa.

./convert-xls-xlsx.vbs {ruta a la carpeta que contiene archivos .xls}

convert-xls-xlsx.vbs:

    Establecer args = WScript. Argumentos
    strPath = args (0)
    strPath = CreateObject ("Scripting.FileSystemObject"). GetAbsolutePathName (strPath)
    Establecer objExcel = CreateObject ("Excel.Application")
    objExcel.Visible = False
    objExcel.DisplayAlerts = False
    Establecer objFso = CreateObject ("Scripting.FileSystemObject")
    Establecer objFolder = objFso.GetFolder (strPath)
    Para cada objFile en objFolder.Files
        fileName = objFile.Path
        If (objFso.GetExtensionName (objFile.Path) = "xls") Entonces
            Establecer objWorkbook = objExcel.Workbooks.Open (fileName)
            saveFileName = Reemplazar (fileName, ". xls", ". xlsx")
            objWorkbook.SaveAs saveFileName, 51
            objWorkbook.Close ()
            objExcel.Application.DisplayAlerts = True
        Terminara si
    próximo
    MsgBox "Conversión finalizada"

NOTA: Busque espacios en la ruta de la carpeta, si su ruta tiene un espacio intermedio, ponga la ruta entre comillas.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.