Cómo Exportar a un Excel con Python y Django

Django en un Framework en Python 3 que permite crear aplicaciones ágilmente pasando del concepto a tener la aplicación completa de forma muy rápida. Django es muy seguro, está lleno hasta el tope de características, librerías y además es sumamente escalable. Pero algo que siempre vas a necesitar en cualquier aplicación es exportar información a un excel o una hoja de cálculo en open document format (ods).

Cómo Exportar a un Excel con Python y Django

Exportar datos de una aplicación a una hoja de calculo es una de las características que casi cualquier aplicación debe proveer. Para hacer esto con Django y Python 3 no podía ser mas sencillo.

Si tienes un modelo (que es una tabla en la base de datos) puedes extraer registros directamente a un archivo, pero si quieres formatearlos tal vez necesites utilizar un arreglo y luego asignarlo la hoja de calculo que guardarás después como un archivo.

Para poder exportar datos a un archivo en un formato que pueda ser usado en una hoja de cálculo como Excel, Cacl de LibreOffice puedes utilizar el paquete de python llamado django_excel. Para instalarlo puedes ejecutar el comando siguiente:

pip install django_excel

Para poder utilizarlo se debe importar el paquete con la línea

import django_excel as excel

Una vez que has importado el paquete en tu archivo .py puedes llamar a los objetos y/o funciones que permiten exportar datos a Excel en Django. Para exportar esos datos lo que se debe hacer es crear un array en el que puedes poner la primera linea con los títulos de las columnas, luego agregarás los datos de la tabla en un renglón del array (tantos como necesites), para posteriormente exportar los datos al archivo.

from datetime import datetime,
from core.models import Server, FileToBackup, Result, ServerGroup, 
import django_excel as excel

def listresults(request):
    export = []
    # Se agregan los encabezados de las columnas
    export.append([
        'date',
        'group',
        'server',

    # Se obtienen los datos de la tabla o model y se agregan al array
    results = Result.objects.all()
    for result in results:
        # ejemplo para dar formato a fechas, estados (si/no, ok/fail) o
        # acceder a campos con relaciones y no solo al id
        export.append([
                "{0:%Y-%m-%d %H:%M}".format(result.date),
                result.hostname_id.group.groupname,
                result.hostname_id,
                ])

    # Obtenemos la fecha para agregarla al nombre del archivo
    today    = datetime.now()
    strToday = today.strftime("%Y%m%d")

    # se transforma el array a una hoja de calculo en memoria
    sheet = excel.pe.Sheet(export)

    # se devuelve como "Response" el archivo para que se pueda "guardar"
    # en el navegador, es decir como hacer un "Download"
    return excel.make_response(sheet, "csv", file_name="results-"+strToday+".csv")

Es posible que este código te muestre algún error si quieres ejecutarlo por que tendrías que tener declarado los modelos y las relaciones. Pero es un ejemplo de como implementar la exportación de datos a un archivo .csv.

Está implementado en una aplicación que monitorea la ejecución de respaldos diarios y registra el estado de cara resultado del respaldo, su resguardo en un host remoto y valida la integridad del archivo en el resguardo contra el original. Y aquí te muestro como opera este código.

El paquete django-excel solo provee la capacidad para exportar en .csv, si requieres exportar en los formatos de excel .xlsx y de libreoffice .ods necesitas agregar otros 4 paquetes: pyexcel-ods, odfpy, pyexcel-xlsxw y pyexcel-xlsx.

pip install django_excel pyexcel-ods odfpy pyexcel-xlsxw pyexcel-xlsx

Si quisieras agregar un modo para generar los 3 formatos .csv, .xlsx y .ods con el mismo código solo tendrías que agregar una forma de detectar que formato quieres agregar en la URL una variable que nos lo indique.

Podríamos agregar la URL /results/export/[formato_exp] para indicar cual formato deseas. En el archivo urls.py agregaríamos una línea que reciva un string de nombre formato_exp.

urlpatterns = [
    path('admin/',             admin.site.urls),

    # Paths for results view and announces 
    path('results/',                        views.listresults),
    path('results/export/<str:format_exp>', views.listresults),

Y recibimos el dato en la función listresutls que donde recibimos la variable format_exp como parámetro.

def listresults(request, format_exp=None):
    results = Result.objects.all()

...

    if format_exp == "csv":
        return excel.make_response(sheet, "csv", file_name="results-"+strToday+".csv")
    elif format_exp == "ods":
        return excel.make_response(sheet, "ods", file_name="results-"+strToday+".ods")
    elif format_exp == "xlsx":
        return excel.make_response(sheet, "xlsx", file_name="results-"+strToday+".xlsx")
    else:
        messages.error(request, 'Export format {} not supported'.format(format_exp))

De esta forma cuando llamemos /results/export/csv nos descargará el archivo en formato .csv, mientras que con /results/export/ods tendremos un archivo en Open Document Format de extensión .ods para LibreOffice y /results/export/xlsx generará un archivo para Excel.

En forma resumida podemos decir que para generar el archivo de Excel en Django solo necesitamos:

# Agregar el paquete
import django_excel as excel

def listresults(request):
    # Definir los datos en un array
    export = [] 
    export.append(['date', 'group'])
    export.append(['2019-06-10', 'Tiendas'])
    export.append(['2019-06-09', 'Default'])

    # Transcribir la data a una hoja de calculo en memoria
    sheet = excel.pe.Sheet(export)

    # Generar el archivo desde la hoja en memoria con 
    # un nombre de archivo que recibirás en el navegador
    return excel.make_response(sheet, "csv", file_name="results.csv")

Esto es muy sencillo, si te fijas se puede hacer con dos líneas de código :

sheet = excel.pe.Sheet(export)
return excel.make_response(sheet, "csv", file_name="results.csv")

Por esto me encanta Django y Python 3 te permiten enfocarte en la lógica de tu aplicación en vez de estar batallando en ver como hacer para que algo funcione, como por ejemplo exportar datos de una tabla a un archivo en excel o en alguno de estos formatos que se pueden abrir en una hoja de cálculo.

Espero que este post te ayude a trabajar con Django y la exportación de datos archivos archivos de excel. Si tienes dudas con gusto déjame un comentario y trataré de responderte en cuanto me sea posible.

This entry was posted in Python and tagged , , , . Bookmark the permalink.

2 Responses to "Cómo Exportar a un Excel con Python y Django"

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *


*