数据表/表格工具:导出到 Excel 时将数据格式化为文本
-
21-12-2019 - |
题
我正在使用 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];
}
}
}
}],
. 我有解决这个问题。
很多时间都在打破了我的头...所以解释如下:
- 它修复了DataTableJS版本1.10.11中的工作正常(对于HTML Excel Export选项)
- 打开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, '&') .replace(/</g, '<') .replace(/>/g, '>') .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, '&') .replace(/</g, '<') .replace(/>/g, '>') .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的所有值。
如果有人对此解决方案有问题,我将尝试回复所有这些问题。
谢谢所有人。
我想在理查兹答案上扩展。像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, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.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, '&')
.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-BOM
从 UTF-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"
);
}
}
]
});
.
图书馆包括:
- dataTables.min.js
- dataTables.bootstrap4.min.js
- dataTables.buttons.min.js
- 按钮.flash.min.js
- jszip.min.js
- vfs_fonts.js
- 按钮.html5.min.js
并在此链接中找到了上述库 https://editor.datatables.net/examples/扩展/ exportButtons