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.
By pedro 05/21/2021 - 2:10 pm
Muy bueno pero cuando traigo mis datos en excel con catalogos me genera error y con csv no a que se deberá
algo asi no jala result.catColonia
By Enrique 06/17/2021 - 7:18 am
Excelente post!! muy claro y concreto. Gracias!!