Допущения:
Похоже, у вас уже есть встроенный styles.xml
, настроенный так, как вы хотите, и поэтому вы знаете, на какие значения индекса стиля ссылаться, из его <cellXfs>
section.
Похоже, что недостающая часть знает, какие ячейки DataTables были заданы каким классам стилей CSS, поэтому вы можете выбрать соответствующие <cellXfs>
индексы для эквивалентных ячеек Excel.
Предлагаемый подход:
Это использует тот факт, что функции customize
можно передать 3 переменные:
- файлы XML для Excel
- объект, представляющий объект (ы) кнопки
- экземпляр DataTable
Мы используем последний для сопоставления классы в HTML ячейках в Excel:
var table = $('#example').dataTable({
dom: 'Bfrtip',
buttons: [
{
extend: 'excelHtml5',
title: '', // no title row
text: 'Excel',
customize: function ( xlsx, btnObj, tableInst ){
var cellIndexes = tableInst.cells(".mycustom").indexes();
for (var i = 0; i < cellIndexes.length; i++) {
var cellIndex = cellIndexes[i];
var tblRow = cellIndex['row']+1; // adjusted from 0 indexed
var tblCol = cellIndex['column']+1; // adjusted from 0 indexed
var xlCol = String.fromCharCode(64 + tblCol); // DANGER: fails after Z (26 columns)
alert('table row ' + tblRow + ' col ' + tblCol
+ ' maps to excel cell ref ' + xlCol + tblRow);
}
}
}
]
});
Это не применяет никаких стилей, это просто показывает вам, как определить, каким ячейкам DataTable был присвоен определенный стиль c, и переводит эти индексы ячеек в ячейку в стиле Excel r ссылки.
Итак, для следующих образцов данных ...
<table id="example" class="display nowrap dataTable cell-border" style="width:100%">
<thead>
<tr>
<th>Head 1</th>
<th>Head 2</th>
<th>Head 3</th>
</tr>
</thead>
<tbody>
<tr>
<td>Row 1 column 1</td>
<td>Row 1 column 2</td>
<td>Row 1 column three</td>
</tr>
<tr>
<td>Row 2 column 1</td>
<td>Row 2 column 2</td>
<td>Row 2 column 3</td>
</tr>
<tr>
<td>Row 3 column 1</td>
<td class="mycustom">Row 3 column 2</td>
<td>Row 3 column 3</td>
</tr>
<tr>
<td>Row 4 column 1</td>
<td>Row 4 column 2</td>
<td>Row 4 column 3</td>
</tr>
<tr>
<td class="mycustom">Row 5 column 1</td>
<td>Row 5 column 2</td>
<td>Row 5 column 3</td>
</tr>
</tbody>
</table>
... приведенный выше код генерирует 2 предупреждения следующим образом:
table row 3 col 2 maps to excel cell ref B3
table row 5 col 1 maps to excel cell ref A5
Вы можете затем используйте значения B3
и A5
в нужных вам селекторах - например:
$('c[r=B3] t', sheet).attr( 's', '25' );
Дополнительные примечания :
Функция DataTables cells().indexes()
описан здесь .
Моя наивная реализация завершится ошибкой для более чем 26 столбцов:
var xlCol = String.fromCharCode(64 + tblCol);
Но не должно быть слишком сложно расширить это для столбцов Excel «AA», «AB» и т. Д., Если необходимо.
Если вы хотите работать на уровне столбца (или строки), а не на уровне ячейки, я этого не пробовал, но это должно быть быть немного более простой версией вышеупомянутого.