Кнопки экспорта данных Datatable-angular создают только заголовки столбцов, а не данные

Кнопки экспорта экспортируют только заголовки столбцов, а не данные. Я использую таблицы данных в angular5 с обработкой на стороне сервера.

Раньше я использовал обработку на стороне клиента со всеми данными, и она работала нормально, позже я перешел на обработку на стороне сервера с кодом ниже.

this.table = $('#my-data-table').DataTable({
  serverSide: true,
  filter: false,
  sort: true,
  orderCellsTop: true,
  columnDefs: [{
    targets: [-1, 0, 1, 2, 4, 10, 12],
    orderable: false,
  }],
  ajax: (dataTablesParameters: any, callback) => {
    this.draw += 1;
    let info = $('#early-detection-data-table').DataTable().page.info();
    if (info.length > 10) {
      if (info.page > 0) {
        this.offset = ((info.length) * (info.page));
      } else {
        this.offset = (((info.page + 1) * 10) - 10);
      }
    } else {
      this.offset = (((info.page + 1) * 10) - 10);
    }
    this.countNumber = (this.offset + 1);
    let limit = info.length;
    this.patientService.getRecentTransmission(limit.toString(), this.offset.toString(), this.searchCriterian).subscribe(
      (data: any) => {
        this.earlyDetections = data;
        let total: number;
        $('.showbox').css('display', 'none');
        //this.setVisiblility();
        if (data[0] && data[0].recordsTotal > 0) {
          total = data[0].recordsTotal;
        } else {
          total = 0;
        }
        callback({
          recordsTotal: total,
          recordsFiltered: total,
          data: [],//JSON.stringify(data),
        });
        console.log(data)
        if (data && data.length != 0) {
          $('td.dataTables_empty').hide();
        } else {
          $('td.dataTables_empty').show();
        }
      });
  }, loadingIndicator: true,
  dom: 'lBfrtip',
  // "order": [[ 7, "desc" ]],
  buttons: {
    buttons: [
      { extend: 'print', className: 'btn btn-primary btn-round' },
      { extend: 'excel', className: 'btn btn-primary btn-round' },
      { extend: 'pdf', className: 'btn btn-primary btn-round' }
    ]
  },
});

Пожалуйста, помогите мне и дайте мне знать, если что-то еще требуется с моей стороны.


person Pavan Patidar    schedule 15.07.2019    source источник


Ответы (1)


На прошлой неделе у меня была такая же проблема.
Я потратил почти 2 дня, чтобы решить ее, решение, которое я нашел, было следующим:
Перейдите в библиотеку кнопок экспорта и найдите, где данные были созданы перед экспортом в файл.< бр>

Вы найдете там:

var = data;
data = {
body: [] //actual data of the table
footer: [] //footer of the table if exists 
header:  [] //header of the table
}

В моем случае это объект данных:

body: []
footer: null
header: (4) ["#", "Serial Number", "Filter Type", ""]
__proto__: Object

Итак, как вы можете видеть, тело пусто, и поэтому отображаются только заголовки.
Что я сделал, так это построил тело из ответа на вызов сервера и сохранил его в локальном хранилище (чтобы я мог получить к нему доступ отовсюду).

Вот пример кода:

 const TableData = [...resp.controllers];
 this.utilService.getDataArrayForExport(TableData, 'Controllers');

    getDataArrayForExport(TableData, TableType) {
        const DataArray = [];
        let formatedObject = {};
        TableData.forEach(function (object, i) {
            switch (TableType) {
                case "Clients":
                    formatedObject = {
                        'email': object.email,
                        'name': object.name,
                        'jobDescription': object.jobDescription,
                        'company': object.company,
                        'countries': object.countries
                    };
                    break;
                case "Controllers":
                    formatedObject = {
                        'controllerSN': object.controllerSN,
                        'filterType': object.filterType
                    };
                    break;
                case "Flushes":
                    const pipeFlush = new DatePipe('en-US');
                    const timeFlush = pipeFlush.transform(object.time, 'short');
                    formatedObject = {
                        'controllerSN': object.controllerId,
                        'description': object.description,
                        'time': timeFlush,
                        'dpBefore': object.dpBefore,
                        'dpAfter': object.dpAfter
                    };
                    break;
                case "Alerts":
                    const pipe = new DatePipe('en-US');
                    const time = pipe.transform(object.time, 'short');
                    formatedObject = {
                        'controllerSN': object.controllerId,
                        'description': object.description,
                        'time': time,
                    };
                    break;
                case "Admins":
                    formatedObject = {
                        'email': object.email,
                        'jobDescription': object.jobDescription,
                        'company': object.company,
                        'countries': object.countries
                    };
                    break;
            }
            const array = [];
            array.push((i + 1).toString());
            $.each(formatedObject, function (key, value) {
                array.push(value);
            });

            DataArray.push(array);
        });
        localStorage.setItem('export', JSON.stringify(DataArray));
        console.dir(DataArray);
    }

Теперь добавим небольшую логику при экспорте, если data.body — пустой массив:

var data = dt.buttons.exportData( config.exportOptions );
    var ddd = JSON.parse(localStorage.getItem("export"));
        if(data.body.length === 0){
            data.body = ddd;
        }

Теперь объект данных заполнен данными:

body: (10) [Array(3), Array(3), Array(3), Array(3), Array(3), Array(3), Array(3), Array(3), Array(3), Array(3)]
footer: null
header: (4) ["#", "Serial Number", "Filter Type", ""]
__proto__: Object

Итак, теперь все настроено, и у вас получится правильно экспортировать все данные.
Надеюсь, мой пост вам поможет.

Если у вас есть какие-то вопросы, вы можете задать их :)

person Misha Beskin    schedule 22.12.2019