Saltar al contenido

¿Cómo exportar todas las filas de Datatables usando Ajax?

Verificamos de forma exhaustivamente cada una de las reseñas en nuestro sitio web con la meta de mostrarte en todo momento información más veraz y actualizada.

Solución:

Debe decirle a la función AJAX que obtenga todos los datos, luego realice la exportación pero cancele el sorteo real para que todos esos datos no se carguen en el DOM. Sin embargo, los datos completos seguirán existiendo en la memoria para la API de DataTables, por lo que debe actualizarlos a la forma en que estaban antes de la exportación.

var oldExportAction = function (self, e, dt, button, config) 
    if (button[0].className.indexOf('buttons-excel') >= 0) 
        if ($.fn.dataTable.ext.buttons.excelHtml5.available(dt, config)) 
            $.fn.dataTable.ext.buttons.excelHtml5.action.call(self, e, dt, button, config);
        
        else 
            $.fn.dataTable.ext.buttons.excelFlash.action.call(self, e, dt, button, config);
        
     else if (button[0].className.indexOf('buttons-print') >= 0) 
        $.fn.dataTable.ext.buttons.print.action(e, dt, button, config);
    
;

var newExportAction = function (e, dt, button, config) 
    var self = this;
    var oldStart = dt.settings()[0]._iDisplayStart;

    dt.one('preXhr', function (e, s, data) 
        // Just this once, load all data from the server...
        data.start = 0;
        data.length = 2147483647;

        dt.one('preDraw', function (e, settings) 
            // Call the original action function 
            oldExportAction(self, e, dt, button, config);

            dt.one('preXhr', function (e, s, data) 
                // DataTables thinks the first item displayed is index 0, but we're not drawing that.
                // Set the property to what it was before exporting.
                settings._iDisplayStart = oldStart;
                data.start = oldStart;
            );

            // Reload the grid with the original page. Otherwise, API functions like table.cell(this) don't work properly.
            setTimeout(dt.ajax.reload, 0);

            // Prevent rendering of the full data to the DOM
            return false;
        );
    );

    // Requery the server with the new one-time export settings
    dt.ajax.reload();
;

y:

        botones: [
        
            extend: 'excel',
            action: newExportAction
        ,

According to DataTables documentation there is no way to export all rows when you are using server side:

Special note on server-side processing: When using DataTables in server-side processing mode (serverSide) the selector-modifier has very little effect on the rows selected since all processing (ordering, search etc) is performed at the server. Therefore, the only rows that exist on the client-side are those shown in the table at any one time, and the selector can only select those rows which are on the current page.

I worked this around by adding an ‘ALL’ parameter to the length menu and training end users to display all records before doing a PDF (or XLS) export:

var table = $('#example').DataTable(
    serverSide: true,
    ajax: "/your_ajax_url/",
    lengthMenu: [[25, 100, -1], [25, 100, "All"]]pageLength: 25, botones: [
        
            extend: 'excel',
            text: ' Excel Export',
            exportOptions: 
                modifier: 
                    search: 'applied',
                    order: 'applied'
                
            
        
    ], // otras opciones );

Muchas gracias al usuario “kevinpo”. Él ha dado la forma en que todos los registros de jquery datatable se descargan como Excel cuando el procesamiento del lado del servidor está activado. Según su respuesta, aquí tengo implementada la funcionalidad de exportación completa (copiar, sobresalir, csv, pdf, imprimir) por procesamiento del lado del servidor.

dentro $(document).ready() defina la siguiente función y llame a esta función en action de cada botón de exportación como a continuación:

/* For Export Buttons available inside jquery-datatable "server side processing" - Start
- due to "server side processing" jquery datatble doesn't support all data to be exported
- below function makes the datatable to export all records when "server side processing" is on */

function newexportaction(e, dt, button, config) 
    var self = this;
    var oldStart = dt.settings()[0]._iDisplayStart;
    dt.one('preXhr', function (e, s, data) 
        // Just this once, load all data from the server...
        data.start = 0;
        data.length = 2147483647;
        dt.one('preDraw', function (e, settings) 
            // Call the original action function
            if (button[0].className.indexOf('buttons-copy') >= 0) 
                $.fn.dataTable.ext.buttons.copyHtml5.action.call(self, e, dt, button, config);
             else if (button[0].className.indexOf('buttons-excel') >= 0) 
                $.fn.dataTable.ext.buttons.excelHtml5.available(dt, config) ?
                    $.fn.dataTable.ext.buttons.excelHtml5.action.call(self, e, dt, button, config) :
                    $.fn.dataTable.ext.buttons.excelFlash.action.call(self, e, dt, button, config);
             else if (button[0].className.indexOf('buttons-csv') >= 0) 
                $.fn.dataTable.ext.buttons.csvHtml5.available(dt, config) ?
                    $.fn.dataTable.ext.buttons.csvHtml5.action.call(self, e, dt, button, config) :
                    $.fn.dataTable.ext.buttons.csvFlash.action.call(self, e, dt, button, config);
             else if (button[0].className.indexOf('buttons-pdf') >= 0) 
                $.fn.dataTable.ext.buttons.pdfHtml5.available(dt, config) ?
                    $.fn.dataTable.ext.buttons.pdfHtml5.action.call(self, e, dt, button, config) :
                    $.fn.dataTable.ext.buttons.pdfFlash.action.call(self, e, dt, button, config);
             else if (button[0].className.indexOf('buttons-print') >= 0) 
                $.fn.dataTable.ext.buttons.print.action(e, dt, button, config);
            
            dt.one('preXhr', function (e, s, data) 
                // DataTables thinks the first item displayed is index 0, but we're not drawing that.
                // Set the property to what it was before exporting.
                settings._iDisplayStart = oldStart;
                data.start = oldStart;
            );
            // Reload the grid with the original page. Otherwise, API functions like table.cell(this) don't work properly.
            setTimeout(dt.ajax.reload, 0);
            // Prevent rendering of the full data to the DOM
            return false;
        );
    );
    // Requery the server with the new one-time export settings
    dt.ajax.reload();
;
//For Export Buttons available inside jquery-datatable "server side processing" - End

Y para los botones, defina como se muestra a continuación

"buttons": [
                           
                               "extend": 'copy',
                               "text": '',
                               "titleAttr": 'Copy',                               
                               "action": newexportaction
                           ,
                           
                               "extend": 'excel',
                               "text": '',
                               "titleAttr": 'Excel',                               
                               "action": newexportaction
                           ,
                           
                               "extend": 'csv',
                               "text": '',
                               "titleAttr": 'CSV',                               
                               "action": newexportaction
                           ,
                           
                               "extend": 'pdf',
                               "text": '',
                               "titleAttr": 'PDF',                               
                               "action": newexportaction
                           ,
                           
                                "extend": 'print',
                                "text": '',
                                "titleAttr": 'Print',                                
                                "action": newexportaction
                           
],

Eso es todo. Ahora tu descarga está lista.

Más adelante puedes encontrar las notas de otros usuarios, tú incluso tienes el poder insertar el tuyo si lo crees conveniente.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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