我尝试将导出按钮添加到我的数据表中,我的表中包含选择框,问题是 - 它导出选择框中包含的所有选项值...我使用ajax从服务器获取结果然后在使用dataSrc
函数进行渲染之前处理不同的数据,如下所示:
dataTableInit: function (columns_def) {
var me = this;
me.dataTable_obj = $('#leads_table').DataTable({
"pageLength": per_page,
dom: 'Blfrtip',
buttons: [
'copy', 'csv', 'excel', 'pdf', 'print'
],
"order": [order],
"ajax": {
url: route,
type: method,
data: filtering_data,
"dataSrc": function (json) {
return me.setLeadsTableData(json);
}
},
"columns": columns_def,
....
在setLeadsTableData
我检查从服务器返回的列然后如果它是一个应该是选择框的列我正在改变它的模板如下:
setStatusesSelectBox: function (status_obj, lead_id) {
var me = this;
var statuses_list = '';
var bg_color = status_obj.name == "new" ? me.new_status_row_bg_color : '';
$.each(me.client_statuses, function (key, val) {
if (val.id != status_obj.id) {
if (typeof val.is_won !== "undefined" && val.is_won != 0) {
statuses_list += "<option data-icon='fa fa-thumbs-o-up' value='" + val.id + "'>" + val.name + "</option>";
} else if (typeof val.is_lost !== "undefined" && val.is_lost != 0) {
statuses_list += "<option data-icon='fa fa-thumbs-o-down' value='" + val.id + "'>" + val.name + "</option>";
} else {
statuses_list += "<option value='" + val.id + "'>" + val.name + "</option>";
}
} else {
if (typeof val.row_bg_color !== 'undefined') {
bg_color = val.row_bg_color;
}
if (typeof status_obj.is_won !== "undefined" && status_obj.is_won != 0) {
statuses_list += "<option data-icon='fa fa-thumbs-o-up' value='" + val.id + "' selected>" + val.name + "</option>";
} else if (typeof status_obj.is_lost !== "undefined" && status_obj.is_lost != 0) {
statuses_list += "<option data-icon='fa fa-thumbs-o-down' value='" + val.id + "' selected>" + val.name + "</option>";
} else {
statuses_list += "<option value='" + val.id + "' selected>" + val.name + "</option>";
}
}
});
statuses_list += "</select>";
var select_start = "<select name='status' data-show-icon='true' data-row-bg='" + bg_color + "' class='form-control status-select' data-lead-id='" + lead_id + "'>";
;
return select_start + statuses_list;
},
任何答案都会有所帮助,欣赏它
答案 0 :(得分:6)
使用exportOptions
&#39; format.body
回调来控制导出的数据。使用dataTables API查找每个<select>
框的当前选定值。这里是第一列和pdf:
buttons: [
{
extend : 'pdf',
exportOptions : {
format: {
body: function( data, row, col, node ) {
if (col == 0) {
return table
.cell( {row: row, column: col} )
.nodes()
.to$()
.find(':selected')
.text()
} else {
return data;
}
}
}
},
...
}
]
table
是表格实例,在您的情况下为me.dataTable_obj
。现在只需更改if (col == 0) {
,以便它回复您有<select>
个框的列(我不知道)。
答案 1 :(得分:2)
如果您只对可见列使用导出格式,固定列索引会对您起作用,所以在我的情况下帮助检查节点子节点以及是否为select,然后使格式为< / p>
body: function(data, row, col,node) {
var elementType = node.firstChild;
if (elementType != null) {
if (elementType.nodeName == "SELECT") return
$(elementType).find(':selected').text();
else return data;
}
else return data
答案 2 :(得分:0)
感谢Mikhail Ushakov让我开始。有一些机会可以简化代码并使其工作更顺畅(在我的情况下)最大的问题是我的表中的所有内容都是链接或选择。在链接的情况下,其他代码也捕获链接的html,而不是文本。在我的情况下,我也有像桌子这样奇怪的东西,所以我不得不预测每个节点中有多个孩子。也选择不使用JQuery;)
exportOptions: {
format : {
body : (data, row, col, node) => {
let node_text = '';
const spacer = node.childNodes.length > 1 ? ' ' : '';
node.childNodes.forEach(child_node => {
const temp_text = child_node.nodeName == "SELECT" ? child_node.selectedOptions[0].textContent : child_node.textContent;
node_text += temp_text ? `${temp_text}${spacer}` : '';
});
return node_text;
}
}
},