logotipo de el mundo de deckerix
El mundo de deckerix
mascotas
El mundo de deckerix. [x]
logotipo de el mundo de deckerix

El mundo de Deckerix 0.4


by Oscar Carrascosa Blanco


Deprecated: Function split() is deprecated in /homepages/43/d272195232/htdocs/src/utiles/Fecha.php on line 65

Deprecated: Function split() is deprecated in /homepages/43/d272195232/htdocs/src/utiles/Fecha.php on line 66
Septiembre 02 2008 20:28:35

Convertir ficheros MS Excel a CSV (xlhtml) by deckerix

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>
<p>There are 3 pages total.Page:0 Name:Hoja1 MaxRow:13 MaxCol:13</p>
<p>Page:1 Name:Hoja2 MaxRow:-1 MaxCol:-1</p>
<p>Page:2 Name:Hoja3 MaxRow:-1 MaxCol:-1</p>
</BODY>

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.

Nombre * (obligatorio)

Email

Web

El mundo de Deckerix es una creación de Óscar Carrascosa Blanco.

deckerix@gmail.com