我正在使用Datatables TableTools插件,以便为我页面上的表提供“导出到Excel”选项。
一般来说,一切都按预期工作。 我唯一的问题是我需要所有数据。生成的Excel表格中的列被格式化为文本,否则我将丢失某些列中的数据。
示例:
- 我有一个包含前导零(例如0022
)的列,只有在Excel文件格式化时才会显示前导零(例如22
)。
- 另一列包含19位帐号(例如1234567890123456789
),如果未格式化为文本,则Excel文件中最后四位数字将更改为零(例如1234567890123450000
)。
有没有什么方法可以在我的Datatables / TableTools初始化中设置它,以便它总是将所有数据作为文本导出到Excel文件中?
非常感谢你提供任何帮助,蒂姆。
答案 0 :(得分:13)
我尝试了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 :(得分:4)
TableTools不会创建真实的 excel
文件,而是创建csv
文件。那些只包含原始数据,没有格式。尽管存在前导零,但Excel通常不会显示它们。你有几个选择:
csv
文件,您应该可以从中将列标记为文本(您可能需要将文件类型更改为txt
)答案 2 :(得分:4)
我有解决此问题的方法。
很多时候我的头都被打破了......所以解释如下:
搜索以下行,直到获取此代码并对其进行评论:
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的所有值。
如果有人对此解决方案有疑问,我会尝试回答所有问题。
感谢所有人。
答案 3 :(得分:2)
我想拓展理查兹的答案。像理查德一样,我无法找到基于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, '&')
.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块。 我们的客户也有一个特定的要求,要求&#39;&lt;&gt;&#39;在任何空白的字段中,所以我删除了&lt;的两个替换方法。和&gt;。
// 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不再切换我的&lt;和&gt;我的数字都是文字,没有科学记谱。
答案 4 :(得分:0)
更新:
从datatables 1.10.8和Buttons API的介绍中,不推荐使用tabletools,这是通过按钮API实现的方法:
它使用exportOptions参数扩展了excel按钮,该参数允许很少的选项,一个是正交的,当你可以说它应该使用&#39; sort&#39;输入:
exportOptions: {
orthogonal: 'sort'
}
在需要精确排序类型以及应该使用columnDefs数据表选项影响哪些列之后:
columnDefs: [{
targets:[1],
render: function(data, type, row, meta){
if(type === 'sort'){
//data = ' ' + data ;
return "\u200C" + data ;
}
return data ;
}
}]
这里考虑第二列(零索引)。对于&#39;排序&#39;类型,我们在日期前加上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将其视为字符串,并避免使用自动类型检测。
是的,现在你可以保留你的领先和尾随零
答案 5 :(得分:0)
具有特殊字符的数据表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.js
查找字符集并将其从UTF-8-BOM
UTF-8
答案 6 :(得分:0)
在这篇文章中https://stackoverflow.com/a/165052/6169225已经优雅地回答了这个具体问题。我们假设您有一个整数your_integer
,您希望将其显示为字符串(即显示的前导零)。然后,在导出到excel - ="<your_integer>"
之前,只需将其格式化即可。当excel doc自动下载时,您的整数将使用此方法显示为字符串。
答案 7 :(得分:0)
对于19位数字,问题实际上是Excel在打开数据时舍入数字。请参阅此主题以获取更多信息和可能的解决方法:https://datatables.net/forums/discussion/comment/132633#Comment_132633
答案 8 :(得分: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"
);
}
}
]
});
包含的库是:
,并在此链接https://editor.datatables.net/examples/extensions/exportButtons
中位于上述库中