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

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

例子: - 我有一列有前导零(例如 0022),仅在前导零被切断时出现(例如 22) 在 Excel 文件中(如果其格式不是文本)。- 另一列包含 19 位帐号(例如 1234567890123456789),最后四位数字更改为零(例如 1234567890123450000) 在 Excel 文件中(如果其格式不是文本)。

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

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

有帮助吗?

解决方案

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

  • 从 Excel 中更改格式
  • 打开 csv 从 Excel 的打开对话框中打开文件,您应该能够将列标记为文本(您可能需要将文件类型更改为 txt)
  • 在数据周围添加引号
  • 创建一个 真实的 通过一些外部库的 excel 文件

其他提示

我尝试了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];
                    }
                }
            }               
            }],
.

我有解决这个问题。

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

  1. 它修复了DataTableJS版本1.10.11中的工作正常(对于HTML Excel Export选项)
  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. 永远享受圣洁文本细胞!!
  7. 此解决方案有助于维护数字,日期和十进制格式。

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

    如果有人对此解决方案有问题,我将尝试回复所有这些问题。

    谢谢所有人。

我想在理查兹答案上扩展。像Richard一样,我无法根据DataTables文档弄清楚解决方案。我想要一个Excelhtml5导出,所有字段仅导出为文本。
理查兹解决方案帮助我进入了我将在下面发布的解决方案。

对于DataTables 1.10.12 HTML5按钮代码出现在单独的文件按钮中.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不再切换我的<和>,我的号码是所有文本,没有科学符号。

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

更新:

从DataTables 1.10.8并引入按钮API,推荐折旧Babletools是通过按钮API进行执行方法:

演示在这里

它将Excel按钮与Exportoptions参数扩展,允许少量选项,一个是正交的,当您可以说它应该使用“排序”类型:

exportOptions: {
                orthogonal: 'sort'
            }
.

需要精确排序类型,并且应该使用ColumnDefs DataTable选项影响哪个列:

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

          return data ;   

       }
    }]
.

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

享受

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

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

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

这种方式在CSV文件中提取数据,使用特殊字符使Excel认为将其视为String并避免使用自动类型检测。

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

数据表导出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.js

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

对于19位数的数字,问题实际上是Excel在打开数据时舍入数字。有关更多信息和可能的解决方法/讨论/评论/ 132633#评论_132633

以下代码将帮助您创建一个查询数据表,其中包含导出到文本文件作为自定义选项。还包括外框外副本,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. dataTables.min.js
  2. dataTables.bootstrap4.min.js
  3. dataTables.buttons.min.js
  4. 按钮.flash.min.js
  5. jszip.min.js
  6. vfs_fonts.js
  7. 按钮.html5.min.js
  8. 并在此链接中找到了上述库 https://editor.datatables.net/examples/扩展/ exportButtons

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top