7

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

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

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

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

非常感谢您对此提供的任何帮助,蒂姆。

4

9 回答 9

19

我尝试了 Aureltime 给出的第一个选项,但我发现了一点副作用。如果该列仅包含数字并且您使用渲染功能,则排序选项不起作用。希望从 1.10.12 数据表版本开始,有一个新选项可以在创建 excel 文件之前自定义数据。

在这个自定义功能中,我添加了 /u002C,它运行良好,甚至是数字排序。

        "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];
                    }
                }
            }               
            }],
于 2016-07-14T16:19:03.450 回答
5

我有这个问题的解决方案。

很多时候我的头都被打破了......所以解释如下:

  1. 它修复在 DatatableJS 版本 1.10.11 中工作正常(用于 HTML Excel 导出选项)
  2. 打开 datatables.js 并搜索:“DataTable.ext.buttons.excelHtml5 = {”
  3. 在以下行中搜索,直到获取此代码,然后对其进行注释:

             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
            );
    
  4. 把这个新代码:

                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
                    );
    
  5. 保存你的 datatables.js

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

此解决方案有助于维护数字、日期和十进制格式。

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

如果有人对此解决方案有任何疑问,我将尝试回答所有问题。

谢谢大家。

于 2016-03-21T21:33:44.793 回答
4

TableTools 不会创建一个真实的 excel文件,而是创建一个csv文件。那些只包含原始数据,没有格式。尽管有前导零,但 Excel 通常不会显示它们。您在这里有几个选择:

  • 从 Excel 中更改格式
  • 从 Excel 的打开对话框中打开csv文件,您应该可以从中将列标记为文本(您可能需要将文件类型更改为txt
  • 在数据周围添加引号
  • 通过一些外部库创建一个真正的excel 文件
于 2014-06-05T07:53:36.480 回答
2

我想扩展理查兹的答案。像 Richard 一样,我无法根据 Datatables 文档找出解决方案。我想要一个 excelHtml5 导出,所有字段都只导出为文本。
理查兹解决方案帮助我找到了我将在下面发布的解决方案。

对于 Datatables 1.10.12,html5 按钮代码出现在单独的文件buttons.html5.js 中。

正如 Richard 所指出的,搜索 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 不再切换我的 < 和 > 并且我的数字都是文本,没有科学计数法。

于 2016-06-03T19:45:40.837 回答
1

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

于 2016-10-27T13:47:00.413 回答
0

更新 :

从 datatables 1.10.8 和 Buttons API 的引入开始,tabletools 已被弃用,这是通过按钮 API 进行操作的方法:

演示在这里

它使用 exportOptions 参数扩展了 excel 按钮,该参数允许很少的选项,当您可以说它应该使用“排序”类型时,一个是正交的:

exportOptions: {
                orthogonal: 'sort'
            }

在您需要精确排序类型以及哪些列应该受到 columnDefs 数据表选项的影响之后:

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

          return data ;   

       }
    }]

这里考虑第二列(零索引)。对于“排序”类型,我们在日期前加上零宽度非连接符,因此 excel 会将其视为字符串。没有注意到任何副作用。

享受

有一种方法可以通过数据表的 tabletools 插件来实现。

使用停止 Excel 自动将某些文本值转换为日期

fncellrender按钮选项,解决方案是在 xls 按钮上使用 fnCellRender 选项,如下所示:

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

这种方式将数据提取到 csv 文件中,其中包含使 Excel 将其视为字符串所需的特殊字符,并避免使用自动类型检测。

是的,现在您可以保留前导零和尾随零

于 2015-04-03T23:53:04.777 回答
0

带有特殊字符的数据表导出 CSV 的解决方案。从https://cdn.datatables.net/buttons/1.1.2/js/buttons.html5.jshttps://cdn.datatables.net/buttons/1.1.2/js/buttons.html5.min查找字符集.js

并将其更改UTF-8-BOMUTF-8

于 2016-08-30T10:21:55.297 回答
0

对于 19 位数字,问题实际上是 Excel 在打开数据时对数字进行四舍五入。请参阅此线程以获取更多信息和可能的解决方法: https ://datatables.net/forums/discussion/comment/132633#Comment_132633

于 2018-06-07T12:31:27.787 回答
0

下面的代码将帮助您创建一个查询数据表,并将导出到文本文件作为自定义选项。还包括开箱即用的副本、excel、csv。

     $('#tableid').DataTable({
           buttons: [
                {
                    extend: 'copyHtml5',
                    filename: function() {
                        return "Copy Table";
                    }
                },
                {
                    extend: 'excelHtml5',

                    filename: function() {
                        return "Export To Excel";
                    }
                },
                {
                    extend: 'csvHtml5',

                    filename: function() {
                        return "Export to CSV";
                    }
                },
                {
                    text: 'Text',
                    footer: false,
                    header: false,
                    exportOptions: {
                        orthogonal: 'sort'
                    },
                    action: function(e, dt, node, config) {

                        var data = dt.buttons.exportData();
                        var retContent = [];
                        var retString = '';
                        for (var i = 0; i < data.body.length; i++) {
                            var text = '\u200C' + data.body[i];
                            retContent.push(text);
                        }
                        retString = retContent.join(',\r\n');
                        $.fn.dataTable.fileSave(
                            new Blob( [ retString ] ),
                            "Export to text"+ ".txt"
                        );
                    }
                }
            ]
        });

包含的库有:

  1. 数据表.min.js
  2. dataTables.bootstrap4.min.js
  3. dataTables.buttons.min.js
  4. button.flash.min.js
  5. jszip.min.js
  6. vfs_fonts.js
  7. button.html5.min.js

并在此链接中找到上述库https://editor.datatables.net/examples/extensions/exportButtons

于 2019-03-20T18:34:31.037 回答