es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Django-Import-Export asignar campo a columna específica

Tengo un formulario funcional que exporta todos los datos a xls utilizando Resource y Fields del paquete django-import-export. Pero ahora necesito ir un poco más allá y hacerlo un poco más avanzado. Necesito exportar todos los datos a una plantilla de Excel existente, asignando cada campo a una columna específica, por ejemplo: el Campo 1 debe llenarse en B3, el Campo 2 en C4, etc.

Estoy pensando que se podría utilizar after_export() pero los documentos no detallan cómo utilizar este método. ¿Alguien tiene experiencia con este paquete?

No estoy utilizando la integración del administrador.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para exportar todos los datos a una columna específica en una plantilla de Excel existente, se puede utilizar la función after_export(). Sin embargo, el paquete django-import-export no proporciona una documentación detallada sobre cómo utilizar este método. Como experto en IT especializado en python, django, excel y django-import-export, sugiero el siguiente enfoque:

    1. Crear una copia de la plantilla de Excel con espacios reservados para los campos en las columnas deseadas (por ejemplo, el Campo 1 se llenará en B3, el Campo 2 en C4, etc).
    2. En la clase de recursos de django-import-export, definir el método after_export() y abrir la plantilla de Excel utilizando el paquete xlrd.

    3. Recorrer cada fila de datos exportada y obtener los valores de campo correspondientes.

    4. Utilizar el paquete openpyxl para escribir los valores de campo en las celdas deseadas de la plantilla de Excel.

    5. Guardar el archivo de Excel modificado.

    Fragmento de código de ejemplo:

    import xlrd
    import openpyxl
    from django.core.files.temp import NamedTemporaryFile
    from django.http import HttpResponse
    from django.utils.encoding import smart_str
    from import_export import resources
    
    class CustomResource(resources.ModelResource):
    
        def after_export(self, queryset, data, *args, **kwargs):
    
            # abrir la plantilla de Excel
            ruta_plantilla = 'ruta/a/la/plantilla_de_excel.xlsx'
            wb_plantilla = xlrd.open_workbook(ruta_plantilla, formatting_info=True)
            hoja_plantilla = wb_plantilla.sheet_by_index(0)
    
            # crear un archivo temporal para almacenar la hoja de Excel modificada
            archivo_temporal = NamedTemporaryFile(delete=False, suffix='.xlsx')
    
            # recorrer cada fila exportada
            for fila_i, datos_fila in enumerate(data, start=1):
    
                # obtener los valores de campo para esta fila
                valor_campo1 = datos_fila['Campo1']
                valor_campo2 = datos_fila['Campo2']
                ...
    
                # abrir el libro de Excel y seleccionar la hoja
                wb = openpyxl.load_workbook(ruta_plantilla)
                hoja = wb.active
    
                # escribir los valores de campo en las celdas deseadas
                hoja.cell(row=3, column=2).value = valor_campo1
                hoja.cell(row=4, column=3).value = valor_campo2
                ...
    
                # guardar la hoja de Excel modificada
                wb.save(archivo_temporal)
    
            # construir la respuesta HTTP con el archivo de Excel modificado
            respuesta = HttpResponse(content_type='application/vnd.ms-excel')
            respuesta['Content-Disposition'] = 'attachment; filename=datos_exportados.xlsx'
            respuesta.write(smart_str(archivo_temporal.read()))
            archivo_temporal.close()
    
            return respuesta
    

    Ten en cuenta que este es solo un fragmento de código de ejemplo y debe adaptarse a tus requisitos específicos. También asegúrate de manejar cualquier error o excepción que pueda ocurrir durante el proceso de exportación.

Comments are closed.