Datatables / TableTools:在导出到Excel时将数据格式化为文本

我正在使用Datatables TableTools插件为我的页面上的表提供一个导出到Excel选项。

一般来说,一切都按预期运作。 我唯一的问题是,我需要所有的数据。 生成的Excel表格中的列被格式化为文本,否则我会丢失某些列中的数据。

例如: – 我有一个前导零(例如0022 )的列,如果这个列没有格式化为文本,那么它只会在Excel文件中出现前导零(例如22 )。 – 另一列包含19位帐号(例如1234567890123456789 ),如果未格式化为文本,则Excel文件中的最后四位数字将被更改为零(例如1234567890123450000 )。

有什么办法可以在我的Datatables / TableTools初始化中设置它,以便它始终将所有数据作为文本导出到Excel文件中?

Tim非常感谢你的帮助。

TableTools不创build一个真正的 excel文件,而是创build一个csv文件。 那些只包含原始数据,没有格式。 虽然前面的零在那里,Excel通常不会显示它们。 你有几个select在这里:

  • 从Excel中更改格式
  • 从Excel打开的对话框中打开csv文件,从中可以将列标记为文本(您可能需要将文件types更改为txt
  • 在数据周围添加引号
  • 通过一些外部库创build一个真正的 Excel文件

我尝试了Aureltime给出的第一个选项,但是我发现了一点副作用。 如果该列只包含数字,而您使用了渲染function,则sorting选项不起作用。 希望从1.10.12 datatables版本有一个新的选项来创buildexcel文件之前自定义数据。

在这个自定义函数中,我添加了/ u002C,它的工作原理是完美的,即使是数字的sorting。

  "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]; } } } }], 

我有这个问题的解决scheme。

这是我的头非常多的时间…所以下面的解释是:

  1. 它修复了DatatableJS版本1.10.11(对于HTML Excel导出选项)
  2. 打开datatables.js并search:“DataTable.ext.buttons.excelHtml5 = {”
  3. 在下面的行中search,直到拿到这段代码,然后发表评论:

      cells.push( typeof row[i] === 'number' || (row[i].match && $.trim(row[i]).match(/^-?\d+(\.\d+)?$/) && row[i].charAt(0) !== '0') ? '<ct="n"><v>'+row[i]+'</v></c>' : '<ct="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 ); 
  4. 把这个新的代码:

      cells.push( '<ct="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 ); 
  5. 保存你的datatables.js

  6. 永远享受你的神圣的文本细胞!

此解决scheme有助于维护数字,date和小数格式。

我更改了代码,强制以文本格式将HTML中的所有值写入XLSX。

如果有人对这个解决scheme有疑问,我会尽量回答所有的问题。

谢谢大家。

我想展开理查兹的回答。 像Richard一样,我无法根据Datatables文档找出解决scheme。 我想要一个excelHtml5导出,所有的字段仅作为文本导出。
Richards解决scheme帮助我find了我将在下面发布的解决scheme。

对于Datatables 1.10.12 html5button代码出现在单独的文件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 } ) } } ) } } ); } 

为了使excelHtml5button仅导出文本,我删除了可以将字段标识为潜在编号的IF块。 我们的客户还有一个具体的请求,在任何空白字段中都有“<>”,所以我删除了<和>的两个replace方法。

 // 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 } ) } } ) } } ); 

此更改允许excelbutton将所有值导出为文本。 Excel不再切换我的<和>和我的号码都是文本,没有科学记数法。

更新:

从数据表1.10.8和buttonAPI的引入,tabletools已被弃用,这是通过buttonAPI的方式:

在这里演示

它使用exportOptions参数来扩展excelbutton,这个参数允许有很less的选项,当你可以说它应该使用'sort'types时,它是正交的:

 exportOptions: { orthogonal: 'sort' } 

在需要确定sortingtypes以及哪些列应该受到columnDefs数据表选项的影响之后:

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

这里考虑第二列(零索引)。 对于“sorting”types,我们在“零宽度无连接器”前加上date,这样excel会将其视为string。 没有注意到任何副作用。

请享用

有一种方法可以通过datatables的tabletools插件来完成。

使用Stop Excel自动将某些文本值转换为date ,

和fncellrenderbutton选项,解决scheme是使用xlsbutton上的fnCellRender选项,如下所示:

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

这样,数据在csv文件中被提取,使用Excel所需的特殊字符作为string,避免使用自动types检测。

是的,现在你可以保持你的前导和尾随零

用特殊字符解决datatable expord CSV。 从https://cdn.datatables.net/buttons/1.1.2/js/buttons.html5.js或https://cdn.datatables.net/buttons/1.1.2/js/buttons.html5.min查找字符&#x96C6;.js文件

并将其从UTF-8更改为UTF-8-BOM

这个特定的问题已经在这篇文章中得到了很好的回答 – https://stackoverflow.com/a/165052/6169225 。 假设你有一个整数your_integer ,你想显示为一个string(即前导零显示)。 然后,在输出为excel – ="<your_integer>"之前,只需将其格式化即可。 当Excel文档自动下载时,您的整数将已经显示为使用此方法的string。