Convertir ficheros MS Excel a CSV (xlhtml)
Muchas veces he tenido que vermelas con ficheros en formato MS Excel y he tenido que realizar tareas más o menos automáticas con ellos. Lo que suelo hacer es trabajar con CSV, ya que es un formato estandar y puedo sacar mucho más partido a estos ficheros que a un Excel (introducir los datos a una base de datos, generar XMLs, etc).
Bien, la pregunta es cómo conseguir pasar un fichero de formato MS Excel a CSV. He realizado un pequeño script en BASH que se encarga justamente de eso.
El único pre-requisito es el comando xlhtml, disponible mediante apt-get install xlhtml, en cualquier distribución Debian. (Para las demás distribuciones, la forma de hacerse con él no debe ser muy distinta, si tienes problemas comentamelo).
Lo primero que hace mi script es conocer si el fichero es de tipo MS Excel. En ese caso procederá a parsearlo a CSV.
TIPO_FICHERO=`file -b "$1"` if [ "$TIPO_FICHERO" == "Microsoft Office Document" ]; then # Si es un Excel if [ $DEBUG -eq 1 ]; then echo -e "${MORADO}\t\tEl fichero $1 es EXCEL ${SIN_COLOR}\n" read fi transformaEXCEL2CSV "$1" # Transfo else #Puede ser un txt, un IdeTrans.. ya se irá viendo.... echo "El fichero $1 no es un Excel" fi |
La función transformaEXCEL2CSV recibe como parámetro el nombre del fichero MS Excel a convertir a CSV. Esta función lo primero que hace es conocer el número de hojas de la hoja de cálculo, para parsear cada una de ellas.
NUMEROHOJAS=`bash ./getNumeroHojas.sh "$1"` |
Como podemos ver, he creado un pequeño script que me indica el número de hojas de las que consta un fichero MS Excel.
Él código es el siguiente:
xlhtml -dp -te "$1" | awk -f filtrarExcelDP.awk |
La salida de la primera parte del comando es la siguiente
<HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <meta name="GENERATOR" content="xlhtml"> <TITLE>Desktop/altas.xls</TITLE> </HEAD> <BODY TEXT="#000000" BGCOLOR="#FFFFFF"><br&gt <p>There are 3 pages total.Page:0 Name:Hoja1 MaxRow:13 MaxCol:13</p&gt <p>Page:1 Name:Hoja2 MaxRow:-1 MaxCol:-1</p&gt <p>Page:2 Name:Hoja3 MaxRow:-1 MaxCol:-1</p&gt </BODY&gt |
De ahí que tengamos que utilizar el último filtro (awk) para obtener el número de páginas de la hoja de Excel. Hay que fijarse en la línea:
<p>There are 3 pages total.</p> |
Una vez que tenemos el número de hojas, lo que tenemos que hacer es generar la salida CSV de cada una de ellas. Para ello nos valdremos del siguiente comando:
xlhtml -fw -asc -xp:$CONTADOR "$1" >> "${1}"."temp" # La libreria no permite mezclar los 2 canales |
Podeis usar el man del xlhtml para conseguir toda la ayuda de los parámetros que se pueden usar con él.
Os dejo un zip con el código fuente para que hagais vuestras pruebas.