首页 文章

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

提问于
浏览
5

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

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

Examples: - 我有一个具有前导零的列(例如 0022 ),如果未将其格式化为文本,则只会在Excel文件中显示前导零(例如 22 ) . - 另一列包含19位帐号(例如 1234567890123456789 ),如果未将其格式化为文本,则Excel文件中最后四位数将更改为零(例如 1234567890123450000 ) .

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

蒂姆,非常感谢你提供的任何帮助 .

8 回答

  • 0

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

    • 从Excel中更改格式

    • 从Excel的打开对话框中打开 csv 文件,您应该可以从中将列标记为文本(您可能需要将文件类型更改为 txt

    • 在数据周围添加引号

    • 通过一些外部库创建一个真正的excel文件

  • 0

    我尝试了Aureltime给出的第一个选项,但我发现了一点副作用 . 如果列仅包含数字并且您使用渲染功能,则排序选项不起作用 . 希望从1.10.12 datatables版本开始,有一个新选项可以在创建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];
                        }
                    }
                }               
                }],
    
  • 3

    I have the solution to this problem.

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

    • 它修复在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的所有值 .

    如果有人对此解决方案有疑问,我会尝试回答所有问题 .

    谢谢大家 .

  • 0

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

    对于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不再切换我的<和>,我的数字都是文本,没有科学记数法 .

  • 2

    Update :

    从datatables 1.10.8和Buttons API的介绍,不推荐使用tabletools,这是通过按钮API实现的方法:

    Demo here

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

    exportOptions: {
                    orthogonal: 'sort'
                }
    

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

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

    这里考虑第二列(零索引) . 对于'sort'类型,我们在日期前加上ZERO WIDTH NON-JOINER,因此excel会将其视为字符串 . 没有注意到任何副作用 .

    请享用

    有一种方法可以通过datatables的tabletools插件来实现 .

    使用Stop Excel from automatically converting certain text values to dates

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

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

    这种方式数据是在csv文件中提取的特殊字符使Excel将其视为字符串并避免使用自动类型检测 .

    是的,现在你可以保持你的领先和尾随零

  • 4

    具有特殊字符的数据表expord 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 将其更改为 UTF-8-BOM

  • 12

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

  • 0

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

相关问题