Convertir csv, htm, xml, txt, xls en formato Excel xlsb utilizando un script vbs

Imaginemos el escenario en el que tenemos un documento csv, o un documento html con tags Excel (como si desde Excel hicieramos salvar como pagina web), un xls de office 2003, básicamente cualquier tipo de documento capaz de abrirse en excel y queremos convertirlo en un formato Excel 2007 / 2010.

Imaginemos que esta conversión la queremos realizar de forma automática en un servidor antes de devolver el documento al usuario o en una aplicación cliente.

Me encontré con este problema recientemente en un proyecto, y antes de cambiar cientos de informes para que se generen en formato xls o xlsx se me ocurrió hacerlo utilizando un scrips vbs.

Este script lo que hace es abrir el documento original con el propio Excel, y guardarlo en el formato que yo quiera. Es como un script mini-conversor, con la ventaja de que el que hace la conversión es el propio Excel que lo hace mejor que nadie.

En mi caso yo necesitaba que el Excel de entrada fuera un documento excel con extension .htm y con una carga de datos externa por fichero que se refrescase antes de convertirlo. Siempre busca un fichero que se llame igual que él, pero con extension csv o txt. Si no lo encuentra no realiza la carga de datos y simplemente convierte el documento de entrada. En el script veréis código que realiza estasa tareas, simplemente si no lo necesitais podéis comentarlo.

Aqui os dejo el script posiblemente necesite algún retoque para adaptarlo a vuestras necesidades, es más, como de vbs no tengo mucha idea, no me extrañaría que tuviera más de un defecto, sin embargo en si la idea me ha venido bastante bien.

Option Explicit
'mirastro.wordpress.com
ShowExcel

Sub ShowExcel() 

On Error Resume Next

' Recoger por parametros la ruta y nombre del fichero (sin extension)
dim filename, path
if WScript.Arguments.Count = 0 then
    WScript.Echo "Uso " &  WScript.ScriptName & " <Dir> <Fichero sin extension>"
    exit sub
else
    path = WScript.Arguments(0)
    filename = WScript.Arguments(1)
end if
'Desactivamos las alertas que pueda dar Excel 'Activarlo para debug
xlObj.displayalerts = false

'Abrir el fichero original (pasado por parametros) con extension htm
xlObj.Workbooks.Open ( path & filename & ".htm")

'Salvarlo como xlsb
xlObj.ActiveWorkbook.SavecopyAs xlObj.ActiveWorkbook.Path & "\" & filename & ".xlsb"
'No mostrar Excel
xlObj.ActiveWindow.Close
'xlObj.Quit

'Abrir el nuevo
xlObj.Workbooks.Open path & filename & ".xlsb"
xlObj.visible=true

'Hacemos la carga con resume next 'No descomentar el resume next
xlObj.Range("A3:O4").Select
On Error Resume Next

'Determinar el fichero de carga puede ser csv o txt
'Especifico de mi proyecto, busca si existe un fichero csv o txt
Dim fso, loadFilename, prefixFilename
Set fso = CreateObject("Scripting.FileSystemObject")
prefixFilename = xlObj.ActiveWorkbook.Path & "\" & replace (replace (filename, "COL", ""), "LIN", "")
loadFilename = prefixFilename & ".txt"
If ( not fso.FileExists(loadFilename)) then
    loadFilename = prefixFilename & ".csv"
    If ( not fso.FileExists(loadFilename)) then
        'No hay fichero de carga
        Set xlObj = Nothing
        exit sub
    end if
end if

'Modificar el origen de datos 'La conexión la establece por fichero (.Connection = "TEXT;"...) pero en principio podría ser de cualquier tipo With xlObj.Selection.QueryTable
    .Connection = "TEXT;" & loadFilename
    .TextFilePlatform = 1252
    .TextFileStartRow = 1
    .TextFileParseType = 1
    .TextFileTextQualifier = -4142
    .TextFileConsecutiveDelimiter = True
    .TextFileTabDelimiter = False
    .TextFileSemicolonDelimiter = True
    .TextFileCommaDelimiter = False
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(1, 1)
    .TextFileTrailingMinusNumbers = True
    .Refresh.BackgroundQuery false
End With

'Activar de nuevo las alertas
xlObj.displayalerts = true

 'Refrescar el primer data source que encontremos
xlObj.ActiveWorkbook.Connections(1).Refresh

'Limpiar
Set xlObj = Nothing 

End Sub

Este script le he salvado como showScript.vbs
Podría ser ejecutado desde una linea de comandos de la siguiente manera:
showExcel c:\reports informe
Si ‘informe’ es un fichero informe.htm que por ejemplo realiza una carga de datos de un fichero informe.txt, el script devolvería un fichero informe.xlsb en formato Office 2010.
Creo que aqui es el punto donde podéis coger el vbs y adaptarlo a vuestra necesidad!!

Este script tiene una ventaja, podría ser ejecutado mismamente desde un java con Runtime.exec (“cmd /c showExcel.vbs c:\reports\ informe”);
En un servidor (Windows) con un cliente Excel se podría hacer esta conversión antes de devolverlo al usuario.

Espero que a alguien le sirva de ayuda, lamento no explicarlo todo más claro,  cualquier duda o comentario será bienvenido.

3 pensamientos en “Convertir csv, htm, xml, txt, xls en formato Excel xlsb utilizando un script vbs

  1. Hola, quisiera implementar tu solución pero no entiendo muy bien como va la cosa. Tengo una aplicación en php que genera un xls y en algunos clientes genera el error que se menciona. Mis dudas son: Tu solución se ejecutaría cada vez que se genere un excel? Como ejecutaría dicho script desde mi código?
    Gracias

    • Hola Zae,
      Antes de nada, comprueba que el xls que recibe el usuario no esté vacío, este error también se produce cuando el fichero que se está abriendo no tiene datos.
      Compruebalo antes de romperte la cabeza🙂

      Si lo has comprobado, entonces veamos si la solución te sirve:
      ¿El servidor donde se aloja tu aplicación php es Windows y tiene Excel instalado?
      Por otro lado entiendo que estás generando el xls con contenido htm.
      Si todo esto es así, entonces se trata de que en tu aplicación php grabes el fichero *xls (con contenido html) en una carpeta del servidor.
      Ejecuta desde php con la función exec (http://php.net/manual/es/function.exec.php) el script vbs pasándole los parámetros como se indica.
      Obtendrás el fichero *.xlsb que se puede devolver al usuario.

      Aunque sea un poco rápida la respuesta espero haberte ayudado.

      Un saludo

      • (Disculpa la tardanza) Si mi servidor es Windows y no tiene instalado Excel, debe tenerlo instalado?. Yo genero un csv con el contenido HTML.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s