Escribir un fichero Excel desde Python

Hace ya unos años, cuando hablábamos mucho de PHP por aquí (mi vida laboral me llevó a tener que centrarme en el SQL y el javascript principalmente) vimos cómo importar y exportar ficheros de Excel con PHP. Pero ¿cómo podemos escribir un fichero de Excel usando Python?

Hay muchas librerías para realizar esta tarea, yo en mi caso he elegido XslxWriter, que podéis descargar desde este enlace. También es muy popular xlrd/xlwt, aunque creo que solo permite exportar en formato xls, pero tiene la parte positiva de permitir importar datos.

Veamos entonces paso a paso, con ejemplos de código, cómo escribir un fichero simple xlsx con Python. Los primeros pasos en nuestro código serán importar la librería, crear un nuevo libro de trabajo y crear una nueva hoja. Lo haríamos así:

import xlsxwriter

libro = xlsxwriter.Workbook('Presupuesto1.xlsx')
hoja = libro.add_worksheet()

El constructor Workbook() nos permite crear un nuevo objeto que representaría un libro de Excel. Es importante destacar que XlsxWriter no nos permite modificar ni leer ficheros de Excel, solo podemos crearlos.

La función add_worksheet() del objeto Workbook nos permite crear nuevas hojas en nuestro libro. Si invocamos esta función sin parámetros creará las hojas con un nombre numerado de forma consecutiva (Sheet1, Sheet2, Sheet3…) pero si le pasamos una cadena esta será el nombre de la hoja.

Ahora, para continuar con el ejemplo, vamos a escribir los datos que queremos mostrar en nuestra hoja de cálculo.

# El presupuesto que pintaremos en la hoja de cálculo
presupuesto = (
    ['Equipos',     4000],
    ['Cable',        100],
    ['Armario',      200],
    ['Switch',        99],
    ['AP',            50],
    ['Router',       150],
    ['Mano de Obra', 350],
)

Ok, tenemos los datos a pintar. Tenemos la librería importada y los objetos creados. ¿Qué nos queda? Unos simples pasos: primero nos posicionamos al inicio del documento, después iteramos sobre la colección de datos pintando cada columna con el método write(), que recibirá la fila, la columna y el valor. Finalmente añadiremos una fila con los totales, calculados ya con una fórmula de sumatorio, y cerraremos el objeto Workbook().

# Nos posicionamos en la primera columna de la primera fila
row = 0
col = 0

# Iteramos los datos para ir pintando fila a fila
for concepto, precio in (presupuesto):
    hoja.write(row, col,     concepto)
    hoja.write(row, col + 1, precio)
    row += 1

#Pintamos la fila de totales
hoja.write(row, 0, 'Total:')
hoja.write(row, 1, '=SUM(B1:B7)')

#Cerramos el libro
libro.close()


Importando y exportando archivos csv con PHP

Los ficheros CSV (abreviatura de comma-separated values) son de gran utilidad, dado que nos permiten importar y exportar datos fácilmente en un formato libre que puede ser abierto por casi cualquier hoja de cálculo.

Para el ejemplo de generación de CSV vamos a suponer que habéis lanzado una consulta contra una base de datos SQL y ya tenéis los datos recuperados en el array pertinente (en este caso le llamaré $datos en el ejemplo), pero además de imprimirlos en pantalla tenéis que exportarlos a un formato con el que pueda trabajar, por ejemplo, Excel (cuando estaba en Nática tuve que hacer algo similar pero con ASP). Bueno, pues la cosa iría como en el siguiente ejemplo:

$file = fopen("exportacion.csv","w"); //abrimos el archivo csv para escritura
$s = ","; //establecemos un separador

while($registro = mysql_fetch_array($datos) ) {
	$fila = $registro['id'].$s.$regisro['nombre'].$s.$registro['telefono']."\n";
	fwrite($file,$fila);
}
fclose($file);

Bueno, la cosa es simple. Primero abrimos el archivo (en este caso le llamé exportacion.csv) en modo de escritura. Establecemos una variable con un valor como separador (en este caso, la coma) y recorremos el array con un bucle while, creando una variable $fila con todos los datos que guardamos en cada iteración del bucle. Con todo esto ya tenemos generado nuesto .csv

Pero ¿y el caso contrario? ¿Y si lo que queremos es abrir un fichero csv desde nuestro php para imprimirlo en pantalla o para guardarlo en la base de datos? Bueno, en el siguiente ejemplo veremos como leer el archivo:

$file = fopen ( "exportacion.csv" , "r" );
while (( $data = fgetcsv ($file,1000,",")) !== FALSE ){
    $i = 0;
    foreach($data as $row) {
        echo "registro $i: $row<br/>";
        // Imprime toda la fila
        $i++ ;
    }
    echo "<br/><br/>";
}
fclose ( $file );

 

Bueno, la explicación es rápida también. Primero abrimos el archivo de antes en modo lectura. Tras esto, usando la función fgetcsv recuperamos la información del archivo y con el bucle foreach recorremos todas las filas, en este caso imprimiéndolas. Podríamos, por ejemplo, usar la función split para partir la fila por las comas y acceder así a los valores por separado de cada una

En fin, espero que esto os sirva como ayuda e introducción para trabajar con estos archivos en php