К сожалению DataTables
не поддерживает многострочный нижний колонтитул таблицы, но есть функция настройки, которая позволяет настроить файл XLSX:
customize
Поскольку: 1.2.0
Этот метод можно использовать для изменения файла XLSX, созданного кнопками. Первый передаваемый параметр - это объект, который содержит файлы XML, а структура объекта соответствует путям файловой системы для этих файлов в файле XLSX. Настройка файла XLSX представляет собой сложную топи c - подробные сведения см. В разделе Настройка в документации excelHtml5 button
.
По состоянию на кнопки 1.5.2 этой функции передаются три параметра:
- Объект, содержащий файлы XML в структуре файла ZIP, используемой в Excel
- Объект конфигурации кнопки
- Экземпляр API DataTables для таблицы, к которой принадлежит кнопка.
Мы можем использовать обратный вызов customize
и объединить его с чтением нижнего колонтитула таблицы и добавлением дополнительных строк нижнего колонтитула в XML XLS с использованием jQuery:
$(document).ready( function () {
$('#table').DataTable({
dom: 'Bfrtip',
buttons: [
{
extend: 'excelHtml5',
footer: true,
customize: (xlsx, config, dataTable) => {
let sheet = xlsx.xl.worksheets['sheet1.xml'];
let footerIndex = $('sheetData row', sheet).length;
let $footerRows = $('tr', dataTable.footer());
// If there are more than one footer rows
if ($footerRows.length > 1) {
// First header row is already present, so we start from the second row (i = 1)
for (let i = 1; i < $footerRows.length; i++) {
// Get the current footer row
let $footerRow = $footerRows[i];
// Get footer row columns
let $footerRowCols = $('th', $footerRow);
// Increment the last row index
footerIndex++;
// Create the new header row XML using footerIndex and append it at sheetData
$('sheetData', sheet).append(`
<row r="${footerIndex}">
${$footerRowCols.map((index, el) => `
<c t="inlineStr" r="${String.fromCharCode(65 + index)}${footerIndex}" s="2">
<is>
<t xml:space="preserve">${$(el).text()}</t>
</is>
</c>
`).get().join('')}
</row>
`);
}
}
}
}
]
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="//cdn.datatables.net/1.10.20/js/jquery.dataTables.min.js"></script>
<script src="//cdn.datatables.net/buttons/1.6.1/js/dataTables.buttons.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jszip/3.1.3/jszip.min.js"></script>
<script src="//cdn.datatables.net/buttons/1.6.1/js/buttons.html5.min.js"></script>
<link href="//cdn.datatables.net/1.10.20/css/jquery.dataTables.min.css" rel="stylesheet"/>
<table id="table">
<thead>
<tr>
<th>Header</th>
<th>Header</th>
<th>Header</th>
</tr>
</thead>
<tbody>
<tr>
<td>body</td>
<td>body</td>
<td>body</td>
</tr>
</tbody>
<tfoot>
<tr>
<th>Footer 1</th>
<th>Footer 1</th>
<th>Footer 1</th>
</tr>
<tr>
<th>Footer 2</th>
<th>Footer 2</th>
<th>Footer 2</th>
</tr>
<tr>
<th>Footer 3</th>
<th>Footer 3</th>
<th>Footer 3</th>
</tr>
</tfoot>
</table>