Datatables/TableTools: форматировать данные в виде текста при экспорте в Excel

Я использую плагин Datatables TableTools, чтобы предоставить параметр "Экспорт в Excel" для таблицы на моей странице.

В общем, все работает по назначению. Моя единственная проблема в том, что мне нужны все данные, соответственно. столбцы в полученной таблице Excel форматируются как текст, так как в противном случае я теряю данные в некоторых столбцах.

<сильные > Примеры: - У меня есть столбец с ведущими нулями (например, 0022), который появляется только в том случае, если ведущие нули отрезаны (например, 22) в файле Excel, если они не отформатированы как текст. Другой столбец содержит 19-значные номера учетных записей (например, 1234567890123456789), которые появляются с последними четырьмя цифрами, которые заменяются на нули (например, 1234567890123450000) в файле Excel, если это не отформатировано как текст.

Есть ли способ установить это в моей инициализации Datatables/TableTools, чтобы он всегда экспортировал все данные в текст в файл Excel?

Большое спасибо за любую помощь в этом, Тим.

Ответ 1

TableTools не создает реальный файл excel, вместо этого он создает файл csv. Они содержат только сырые данные, без форматирования. Хотя ведущие нули существуют, Excel обычно их не покажет. Здесь у вас есть несколько вариантов:

  • изменить форматирование из Excel
  • откройте файл csv из диалогового окна открытия Excel, из которого вы сможете пометить столбцы как текст (вам может потребоваться изменить тип файла на txt)
  • добавить кавычки вокруг данных
  • создать реальный файл excel через некоторую внешнюю библиотеку

Ответ 2

Я попробовал первый вариант, предоставленный Aureltime, но я обнаружил небольшой побочный эффект. Если столбец содержит только цифры и вы используете функцию рендеринга, опция сортировки не работает. Надеюсь, из версии 1.10.12 datatables появилась новая опция для настройки данных перед созданием файла excel.

В этой функции настройки я добавил /u 002C, и он отлично работает, даже сортировка чисел.

        "buttons": [{
            extend: 'excel',
            exportOptions: {
                orthogonal: 'sort'
            },
            customizeData: function ( data ) {
                for (var i=0; i<data.body.length; i++){
                    for (var j=0; j<data.body[i].length; j++ ){
                        data.body[i][j] = '\u200C' + data.body[i][j];
                    }
                }
            }               
            }],

Ответ 3

У меня есть решение этой проблемы.

У меня очень сильно сломалась голова... Итак, объяснение ниже:

  • Это исправление отлично работает в DatatableJS версии 1.10.11 (для опции экспорта HTML Excel)
  • Откройте datatables.js и выполните поиск: "DataTable.ext.buttons.excelHtml5 = {"
  • Искать в последующих строках, пока не возьмите этот код, и прокомментируйте его:

             cells.push( typeof row[i] === 'number' || (row[i].match && $.trim(row[i]).match(/^-?\d+(\.\d+)?$/) && row[i].charAt(0) !== '0') ?
                '<c t="n"><v>'+row[i]+'</v></c>' :
                '<c t="inlineStr"><is><t>'+(
                    ! row[i].replace ?
                        row[i] :
                        row[i]
                            .replace(/&(?!amp;)/g, '&amp;')
                            .replace(/</g, '&lt;')
                            .replace(/>/g, '&gt;')
                            .replace(/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F-\x9F]/g, ''))+ // remove control characters
                '</t></is></c>'                                                      // they are not valid in XML
            );
    
  • Поместите этот новый код:

                cells.push( '<c t="inlineStr"><is><t>'+(
                            ! row[i].replace ?
                                row[i] :
                                row[i]
                                    .replace(/&(?!amp;)/g, '&amp;')
                                    .replace(/</g, '&lt;')
                                    .replace(/>/g, '&gt;')
                                    .replace(/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F-\x9F]/g, ''))+ // remove control characters
                        '</t></is></c>'                                                      // they are not valid in XML
                    );
    
  • Сохраните datatables.js

  • Наслаждайтесь святыми текстовыми ячейками навсегда!

Это решение помогает поддерживать формат числа, даты и десятичного формата.

Я изменил код, чтобы заставить записывать в текстовом формате все значения из HTML в XLSX.

Если у кого-то есть вопрос об этом решении, я постараюсь ответить на все из них.

Спасибо всем.

Ответ 4

Я хотел бы расширить ответ Ричардса. Как и Ричард, я не мог понять решение на основе документации Datatables. Мне нужен экспорт excelHtml5, при этом все поля экспортируются только как текст.
Решение Richards помогло мне перейти к решению, которое я опубликую ниже.

Для Datatables 1.10.12 код кнопки html5 отображается в отдельном файле buttons.html5.js.

Как заметил Ричард, выполните поиск блока DataTable.ext.buttons.excelHtml5.

Кусок кода, который меня интересовал, был:

// Detect numbers - don't match numbers with leading zeros or a negative
// anywhere but the start
if ( typeof row[i] === 'number' || (
        row[i].match &&
        $.trim(row[i]).match(/^-?\d+(\.\d+)?$/) &&
        ! $.trim(row[i]).match(/^0\d+/) )
) {
    cell = _createNode( rels, 'c', {
        attr: {
            t: 'n',
            r: cellId
        },
        children: [
            _createNode( rels, 'v', { text: row[i] } )
        ]
    } );
}
else {
    // Replace non standard characters for text output
    var text = ! row[i].replace ?
        row[i] :
        row[i]
            .replace(/&(?!amp;)/g, '&amp;')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;')
            .replace(/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F-\x9F]/g, '');

    cell = _createNode( rels, 'c', {
        attr: {
            t: 'inlineStr',
            r: cellId
        },
        children:{
            row: _createNode( rels, 'is', {
                children: {
                    row: _createNode( rels, 't', {
                        text: text
                    } )
                }
            } )
        }
    } );
}

Чтобы кнопка экспорта excelHtml5 экспортировала только текст, я удалил блок IF, который идентифицировал бы поле как потенциальный номер. У нашего клиента также был особый запрос на наличие "< > " в любом поле, которое было пустым, поэтому я удалил два метода замены для < и > .

// Replace non standard characters for text output
var text = ! row[i].replace ?
    row[i] :
    row[i]
        .replace(/&(?!amp;)/g, '&amp;')
        .replace(/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F-\x9F]/g, '');

cell = _createNode( rels, 'c', {
    attr: {
        t: 'inlineStr',
        r: cellId
    },
    children:{
        row: _createNode( rels, 'is', {
            children: {
                row: _createNode( rels, 't', {
                    text: text
                } )
            }
        } )
    }
} );

Это изменение позволяет кнопке excel экспортировать все значения в виде текста. Excel больше не переключает мой < и > и мои номера - это текст, но не научная нотация.

Ответ 5

Обновление:

Из datatables 1.10.8 и введения API-интерфейсов tabletools устарели, и вот как это сделать с помощью кнопок API:

Демо здесь

Он расширяет кнопку excel с параметром exportOptions, который допускает несколько параметров, один является ортогональным, если вы можете сказать, что он должен использовать тип 'sort':

exportOptions: {
                orthogonal: 'sort'
            }

После того, как вам нужно уточнить тип сортировки и на какие столбцы следует повлиять с помощью параметра datatable columnDefs:

columnDefs: [{
       targets:[1],
       render: function(data, type, row, meta){
          if(type === 'sort'){
             //data = ' ' + data ;
              return "\u200C" + data ; 
          }

          return data ;   

       }
    }]

Здесь рассматривается второй столбец (нулевой индекс). Для типа "сортировка" мы назначаем дату с помощью ZERO WIDTH NON-JOINER, поэтому excel будет рассматривать ее как строку. Не заметил никаких побочных эффектов.

Enjoy

есть способ сделать это через плагин tabletools для данных datatables.

Использование Остановить Excel от автоматического преобразования определенных текстовых значений в даты,

и кнопку fncellrender, решение заключается в использовании опции fnCellRender на кнопке xls следующим образом:

{
"sExtends":    "xls", 
"fnCellRender": function ( sValue, iColumn, nTr,iDataIndex ) {
     if ( iColumn === colIndexOfString ) {
         return '"=""' + sValue + '"""' ;
         }
     return sValue;
     }
}

Таким образом, данные извлекаются в csv файле специальными символами, необходимыми для того, чтобы Excel считал их строкой и избегали автоматического обнаружения типов.

И да теперь вы можете сохранить свои ведущие и конечные нули

Ответ 7

Эта конкретная проблема была отреагирована элегантно в этом посте - fooobar.com/info/18789/.... Скажем, что у вас есть целое число your_integer, которое вы хотите отобразить в виде строки (то есть отображаемые начальные нули). Затем вы просто форматируете его как таковое, прежде чем экспортировать в excel - ="<your_integer>". Когда вы автоматически загружаете excel doc, ваше целое будет отображаться в виде строки, используя этот метод.