本文深入解析Bootstrap Table的高级应用,涵盖根据状态动态设置行背景色、集成x-editable实现单元格行内编辑、利用HTML属性进行行列合并以及多格式数据导出功能。通过具体代码示例,展示如何配置参数、引入扩展文件及处理后端交互,帮助开发者快速掌握表格组件的核心进阶技巧。
Bootstrap Table系列教程:
JS表格组件神器bootstrap table详解(基础版)
JS组件系列之Bootstrap table表格组件神器【终结篇】
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
Bootstrap Table是一款轻量级且功能丰富的数据表格组件,支持单选、复选框、排序、分页、显示或隐藏列、固定表头滚动、响应式设计、Ajax加载JSON数据、列排序及卡片视图等功能。本文将重点介绍Bootstrap Table的高级功能,包括行样式、行内编辑、行列合并及数据导出,帮助读者全面掌握该组件的使用。
功能效果展示
一、功能效果展示
1、表格行样式定制
以订单管理页面为例,不同状态的订单需要显示不同的颜色以区分,具体效果如下图所示:

2、表格行内编辑功能
在之前的教程中,有读者询问是否支持行内编辑,答案是肯定的。首先查看行内编辑的实际效果:
编辑前状态

点击任意单元格触发编辑


编辑完成后的状态

3、表格行列合并功能
行列合并是报表开发中的常见需求,效果如下所示:

由于当前页面显示内容有限,点击进入详情页查看完整效果。整体表现良好。
4、表格数据导出功能
Bootstrap Table支持三种导出模式:basic(当前页数据)、all(所有数据)和selected(选中数据)。同时支持导出为Excel、XML、JSON等多种格式文件。
导出当前页数据至Excel


导出表格所有数据


导出选中行数据


其他格式文件的导出流程与Excel类似,此处不再赘述具体效果。
表格行样式实现代码
二、表格行样式实现代码
关于表格行的样式设置,其他是它一个最基础的功能,为什么要把它放在第三篇?是因为博主觉得这功能可能到处都用得着。当然,效果并不难,自己用jQuery设置tr的背景色也可以实现,但是博主觉得,既然bootstrap table提供了机制设置行的背景色,我们何不用它内置的api呢。我们看看如何实现。
在初始化表格时配置参数
//初始化Table
$('#tb_order').bootstrapTable({
url: '/TableStyle/GetOrder', //请求后台的URL(*)
method: 'get', //请求方式(*)
//toolbar: '#toolbar', //工具按钮用哪个容器
striped: true, //是否显示行间隔色
cache: false, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
pagination: true, //是否显示分页(*)
sortable: false, //是否启用排序
sortOrder: "asc", //排序方式
queryParams: oTableInit.queryParams,//传递参数(*)
sidePagination: "server", //分页方式:client客户端分页,server服务端分页(*)
pageNumber: 1, //初始化加载第一页,默认第一页
pageSize: 10, //每页的记录行数(*)
pageList: [10, 25, 50, 100], //可供选择的每页的行数(*)
search: true, //是否显示表格搜索,此搜索是客户端搜索,不会进服务端,所以,个人感觉意义不大
strictSearch: true,
showColumns: true, //是否显示所有的列
showRefresh: true, //是否显示刷新按钮
minimumCountColumns: 2, //最少允许的列数
clickToSelect: true, //是否启用点击选中行
height: 500, //行高,如果没有设置height属性,表格自动根据记录条数觉得表格高度
uniqueId: "ID", //每一行的唯一标识,一般为主键列
showToggle: true, //是否显示详细视图和列表视图的切换按钮
cardView: false, //是否显示详细视图
detailView: false, //是否显示父子表
rowStyle: function (row, index) {
//这里有5个取值代表5中颜色['active', 'success', 'info', 'warning', 'danger'];
var strclass = "";
if (row.ORDER_STATUS == "待排产") {
strclass = 'success';//还有一个active
}
else if (row.ORDER_STATUS == "已删除") {
strclass = 'danger';
}
else {
return {};
}
return { classes: strclass }
},
columns: [{
checkbox: true
}, {
field: 'ORDER_NO',
title: '订单编号'
}, {
field: 'ORDER_TYPE',
title: '订单类型'
}, {
field: 'ORDER_STATUS',
title: '订单状态'
}, {
field: 'REMARK',
title: '备注'
}, ]
});
核心在于配置以下参数:
rowStyle: function (row, index) {
//这里有5个取值代表5中颜色['active', 'success', 'info', 'warning', 'danger'];
var strclass = "";
if (row.ORDER_STATUS == "待排产") {
strclass = 'success';//还有一个active
}
else if (row.ORDER_STATUS == "已删除") {
strclass = 'danger';
}
else {
return {};
}
return { classes: strclass }
},
Bootstrap Table支持五种行背景色类名:'active'、'success'、'info'、'warning'和'danger'。运行代码即可看到对应颜色。该方法必须返回一个包含classes属性的JSON对象,格式为:{ classes: strclass }。
表格行内编辑实现代码
三、表格行内编辑实现代码
实现行内编辑功能需要引入Bootstrap Table的扩展JS文件。
1、引入必要的JS文件
<link rel="stylesheet" href="//rawgit.com/vitalets/x-editable/master/dist/bootstrap3-editable/css/bootstrap-editable.css">
<script src="https://rawgit.com/vitalets/x-editable/master/dist/bootstrap3-editable/js/bootstrap-editable.js"></script>
<script src="~/Content/bootstrap-table/extensions/editable/bootstrap-table-editable.js"></script>
2、在CSHTML页面定义表格时,添加相关属性
<table id="tb_departments">
<thead>
<tr>
<th data-field="Name" data-editable="true">部门名称</th>
<th data-field="ParentName">上级部门</th>
<th data-field="Level" data-editable="true">部门级别</th>
<th data-field="Desc" data-editable="true">描述</th>
</tr>
</thead>
</table>
若在JS中初始化表格,写法如下:
{
field: "name",
title: "名称",
editable:true
}
3、在JS初始化时注册编辑保存事件
$('#tb_departments').bootstrapTable({
url: '/Editable/GetDepartment', //请求后台的URL(*)
method: 'get', //请求方式(*)
toolbar: '#toolbar', //工具按钮用哪个容器
striped: true, //是否显示行间隔色
cache: false, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
pagination: true, //是否显示分页(*)
sortable: false, //是否启用排序
sortOrder: "asc", //排序方式
queryParams: oTableInit.queryParams,//传递参数(*)
sidePagination: "server", //分页方式:client客户端分页,server服务端分页(*)
pageNumber: 1, //初始化加载第一页,默认第一页
pageSize: 10, //每页的记录行数(*)
onEditableSave: function (field, row, oldValue, $el) {
$.ajax({
type: "post",
url: "/Editable/Edit",
data: { strJson: JSON.stringify(row) },
success: function (data, status) {
if (status == "success") {
alert("编辑成功");
}
},
error: function () {
alert("Error");
},
complete: function () {
}
});
}
});
重点在于事件处理方法的实现
onEditableSave: function (field, row, oldValue, $el) {
$.ajax({
type: "post",
url: "/Editable/Edit",
data: { strJson: JSON.stringify(row) },
success: function (data, status) {
if (status == "success") {
alert("编辑成功");
}
},
error: function () {
alert("Error");
},
complete: function () {
}
});
}
该方法需自行处理保存逻辑。四个参数分别为:field(当前列名)、row(当前行数据对象)、oldValue(更新前的值)和$el(编辑单元格的jQuery对象)。
表格行列合并实现代码
四、表格行列合并实现代码
行列合并功能无需引入额外JS文件,只需在CSHTML页面中使用table标签的colspan和rowspan属性即可实现。
1、CSHTML页面代码
<table id="tb_report">
<thead>
<tr>
<th colspan="4" data-valign="middle" data-align="center">第一季度</th>
<th colspan="4" data-valign="middle" data-align="center">第二季度</th>
<th colspan="4" data-valign="middle" data-align="center">第三季度</th>
<th colspan="4" data-valign="middle" data-align="center">第四季度</th>
<th data-field="TotalCount" rowspan="2" data-valign="middle" data-align="center">年度汇总</th>
</tr>
<tr>
<th data-field="JanCount" data-align="center">一月</th>
<th data-field="FebCount" data-align="center">二月</th>
<th data-field="MarCount" data-align="center">三月</th>
<th data-field="FirstQuarter" data-align="center">第一季度</th>
<th data-field="AprCount" data-align="center">四月</th>
<th data-field="MayCount" data-align="center">五月</th>
<th data-field="JunCount" data-align="center">六月</th>
<th data-field="SecondQuarter" data-align="center">第二季度</th>
<th data-field="JulCount" data-align="center">七月</th>
<th data-field="AguCount" data-align="center">八月</th>
<th data-field="SepCount" data-align="center">九月</th>
<th data-field="ThirdQuarter" data-align="center">第三季度</th>
<th data-field="OctCount" data-align="center">十月</th>
<th data-field="NovCount" data-align="center">十一月</th>
<th data-field="DecCount" data-align="center">十二月</th>
<th data-field="ForthQuarter" data-align="center">第四季度</th>
</tr>
</thead>
</table>
2、JS初始化无需特殊处理
$('#tb_report').bootstrapTable({
url: '/GroupColumns/GetReport', //请求后台的URL(*)
method: 'get', //请求方式(*)
toolbar: '#toolbar', //工具按钮用哪个容器
striped: true, //是否显示行间隔色
cache: false, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
pagination: true, //是否显示分页(*)
sortOrder: "asc", //排序方式
queryParams: oTableInit.queryParams,//传递参数(*)
sidePagination: "server", //分页方式:client客户端分页,server服务端分页(*)
pageNumber: 1, //初始化加载第一页,默认第一页
pageSize: 10, //每页的记录行数(*)
pageList: [10, 25, 50, 100], //可供选择的每页的行数(*)
});
实现过程非常简洁。实际上,如果不涉及特殊事件处理,可以直接在CSHTML中通过table属性设置url、分页等信息,因为Bootstrap Table的每个初始化参数都对应一个table属性。
若表格无需特殊事件处理,这种直接设置属性的方式是完全可行的。
表格数据导出实现代码
五、表格数据导出实现代码
数据导出功能同样需要引入扩展JS支持。
1、引入必要的JS文件
<script src="~/Content/bootstrap-table/extensions/export/bootstrap-table-export.js"></script>
<script src="https://rawgit.com/hhurz/tableExport.jquery.plugin/master/tableExport.js"></script>
2、JS初始化配置
$('#tb_departments').bootstrapTable({
url: '/Export/GetDepartment', //请求后台的URL(*)
method: 'get', //请求方式(*)
toolbar: '#toolbar', //工具按钮用哪个容器
striped: true, //是否显示行间隔色
cache: false, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
pagination: true, //是否显示分页(*)
sortable: false, //是否启用排序
sortOrder: "asc", //排序方式
queryParams: oTableInit.queryParams,//传递参数(*)
sidePagination: "client", //分页方式:client客户端分页,server服务端分页(*)
pageNumber: 1, //初始化加载第一页,默认第一页
pageSize: 10, //每页的记录行数(*)
pageList: [10, 25, 50, 100], //可供选择的每页的行数(*)
clickToSelect:true,
showExport: true, //是否显示导出
exportDataType: "basic", //basic', 'all', 'selected'.
columns: [{
checkbox: true
}, {
field: 'Name',
title: '部门名称'
}, {
field: 'ParentName',
title: '上级部门'
}, {
field: 'Level',
title: '部门级别'
}, {
field: 'Desc',
title: '描述'
}, ]
});
重点关注以下两个属性:
showExport: true, //是否显示导出
exportDataType: "basic", //basic', 'all', 'selected'.
showExport表示是否显示导出的按钮,exportDataType表示导出的模式是当前页、所有数据还是选中数据。
总结与问题探讨
六、总结与问题探讨
以上展示了各项功能的效果及简单实现代码。博主发现仍有几个问题值得探讨。
1、行内编辑目前是每个单元格单独提交到后台,导致数据库频繁操作,体验不佳。是否有更好的方式实现整行数据一次性提交?
2、导出功能虽实用,但遗憾的是不支持IE浏览器。经测试官网示例,IE环境下同样无法导出,这一点有待进一步验证和解决。
以上就是对Bootstrap Table高级功能的详细介绍,希望能为各位开发者提供实际帮助。