新的表格展示利器 Bootstrap Table Ⅰ


 1.bootstrap table簡介及特征

       Bootstrap Table是國人開發的一款基於 Bootstrap 的 jQuery 表格插件,通過簡單的設置,就可以擁有強大的單選、多選、排序、分頁,以及編輯、導出、過濾(擴展)等功能。其官方網站地址 為:http://bootstrap-table.wenzhixin.net.cn/。里面可以下載使用所需的JS和CSS文件,以及參考文檔和例子。

       Bootstrap Table具有如下功能:

  • 支持 Bootstrap 3 和 Bootstrap 2
  • 自適應界面
  • 固定表頭
  • 非常豐富的配置參數
  • 直接通過標簽使用
  • 顯示/隱藏列
  • 顯示/隱藏表頭
  • 通過 AJAX 獲取 JSON 格式的數據
  • 支持排序
  • 格式化表格
  • 支持單選或者多選
  • 強大的分頁功能
  • 支持卡片視圖
  • 支持多語言
  • 支持插件

2.Bootstrap Table使用

去官網下載需要的表格插件和擴展的導出插件放入項目中:

本次測試還包括了PDF導出,在引用導出插件時,頁面需要引用的樣式文件如下:

<!-- JQuery 導出擴展引用 -->
<script src="${basePath}/js/jquery.min.js"></script>
<!-- bootstrap table css --> 
   <link rel="stylesheet" href="<%=bizpath%>/bootstrap/css/bootstrap.min.css">
  <link rel="stylesheet" 
href="/bizmodules/adminlte/bootstrap_extension/bootstrap-table-develop/dist/bootstrap-table.css">
<script src="/bizmodules/adminlte/bootstrap_extension/bootstrap-table-develop/dist/bootstrap-table.min.js"></script>
<script src="/bizmodules/adminlte/bootstrap_extension/bootstrap-table-develop/dist/locale/bootstrap-table-zh-CN.js"></script>
<script src="/bizmodules/adminlte/bootstrap_extension/bootstrap-table-develop/dist/extensions/export/bootstrap-table-export.js"></script>
<!-- pdf 導出擴展引用 -->
<script src="/bizmodules/adminlte/bootstrap_extension/tableExport/libs/pdfmake/pdfmake.min.js"></script>
<script src="/bizmodules/adminlte/bootstrap_extension/tableExport/libs/pdfmake/vfs_fonts.js"></script>
<script type="text/javascript" src="/bizmodules/adminlte/bootstrap_extension/tableExport/libs/FileSaver/FileSaver.min.js"></script>
<script type="text/javascript" src="/bizmodules/adminlte/bootstrap_extension/tableExport/libs/jsPDF/jspdf.min.js"></script>
<script type="text/javascript" src="/bizmodules/adminlte/bootstrap_extension/tableExport/libs/jsPDF-AutoTable/jspdf.plugin.autotable.js"></script>
<script type="text/javascript" src="/bizmodules/adminlte/bootstrap_extension/tableExport/tableExport.js"></script>
<!-- pdf 導出擴展引用 -->

除了BootStrap Table的插件引用外,也需要在項目中引用Bootstrap基本的js,css文件和JQuery的js文件。

3.Bootstrap Table效果

引用項目所需的樣式文件后,在業務模塊的應用效果如下:

  • 服務端分頁設置:在配置文件中設置分頁方式為服務器分頁。
    sidePagination: "server",           //分頁方式:client客戶端分頁,server服務端分頁(*)
    pageNumber: 1, //初始化加載第一頁,默認第一頁
    pageSize: 20, //每頁的記錄行數(*)
    pageList: [20, 30, 40],
  • 格式化數據列:如給對應數據列內容設置背景顏色,采用formatter提供的函數設置。格式化功能可處理時間樣式,特殊數據樣式和特殊行背景樣式。對於當列數據,也可做數據的運算,拼接處理。如原值為10,可設置value展示值為20。官方提供方法如下:
   {
align: "left",
halign: "left",
field: "price",
//width: 100,
sortable:true,
title: "原值(萬元)",
formatter: function (value) {
return "<span class='badge bg-orange' style='padding:5px 10px;'>" + value + "</span>";
}
},
formatter data-formatter Function undefined 格式化單元格內容,function(value, row, index), value:該cell本來的值,row:該行數據,index:該行序號(從0開始)
footerFormatter data-footer-formatter Function undefined 格式化footer內容,





  • 導出文件:設置表格可導出文件。
     exportDataType: "all",   //導出文件方式  支持: 'basic', 'all', 'selected'. basic:本頁數據,all,獲取服務器所有數據,selected,本頁選擇行數據
showExport: true, //是否顯示導出按鈕
buttonsAlign:"right", //按鈕位置
exportTypes:[ 'csv', 'txt', 'sql', 'doc', 'excel', 'xlsx', 'pdf'], //導出文件支持: 'json', 'xml', 'png', 'csv', 'txt', 'sql','doc', 'excel', 'xlsx', 'pdf'
Icons:'glyphicon-export',//導出文件圖標
導出到excel文件中的效果如下 :

  •  視圖切換:切換數據的展示效果由表格變為視圖,該功能對數據列較多時,可設置為試圖模式,方便用戶查看明顯數據,設置表格參數如下:
    showToggle:true,                    //是否顯示詳細視圖和列表視圖的切換按鈕
     切換效果如下:

  • 顯示列設置:提供用戶設置,需要展示的列數據。在導出時,只導出設置顯示的列內容。

          

4.Bootstrap Table 數據綁定

ajax data-ajax Function undefined 自定義 AJAX 方法,須實現 jQuery AJAX API
method data-method String ‘get’ 服務器數據的請求方式 ‘get’ or ‘post’
url data-url String undefined 服務器數據的加載地址

 

 

 

 

Bootstrap Table做數據綁定時,可以直接設置url請求后台數據,也可通過ajax加載數據。本文通過ajax加載數據的方式如下:

 1  doSearch: function () {
 2         var params={};
 3         params.start=1;
 4         params.limit=20;
 5         // MP.doAction()函數為封裝的ajax請求后台數據的函數,數據從后台請求成功后,通過load函數,加載數據。
 6         MP.doAction("base-car-query", params, function (datas) {
 7             if(datas.success)
 8             {    //數據綁定 ,datas為json格式的數據
 9                 $("#tb_departments").bootstrapTable('load', datas);
10             }
11         }, function(datas){
12             alert("數據加載失敗");
13         }, true, true);
14     }

5.Bootstrap Bable 分頁

sidePagination data-side-pagination String ‘client’

設置在哪里進行分頁,可選值為 ‘client’ 或者 ‘server’。

設置 ‘server’時,必須設置 服務器數據地址(url)或者重寫ajax方法

 

 

 

Bootstap Table設置了兩種分頁模式,即客戶端分頁和服務器分頁。在服務器分頁時,若設置了url數據請求地址,則可直接分頁。若通過ajax加載的數據,需要傳送分頁參數到后台,重新加載數據,在分頁時重新發送ajax請求的觸發事件如下:

onPageChange page-change.bs.table number, size 更改頁碼或頁面大小時觸發.

 

 

 1  loadCharts: function ()
 2         var me = this;
 3         var tb_departments = $("#tb_departments").bootstrapTable({
 4            // 表格屬性設置.......
 5             columns: [
 6                 {
 7                     align: "left",
 8                     halign: "left",
 9                     field: "isonloan",
10                     title: "車輛是否借出",
11                     formatter: function (value) {
12                         var state;
13                         if (value == '2') {
14                             state = "<span class='badge bg-red' style='padding:5px 10px;'>外借</span>";
15                         } else {
16                             state = "<span class='badge bg-green'  style='padding:5px 10px;'>在用</span>";
17                         }
18                         return state;
19                     }
20                 }
21             ],
22             onPageChange:function(number, size)
23             {
24                 //設置在分頁事件觸發時,傳遞分頁參數給后台,重新加載數據
25                 var params={};
26                 params.start=number;
27                 params.limit=size;
28                 MP.doAction("base-car-query", params, function (datas) {
29                     if(datas.success)
30                     {
31                         $("#tb_departments").bootstrapTable('load', datas);
32                     }
33                 }, function(datas){
34                     alert("錯誤");
35                 }, true, true);
36             }
37         });
38     },

6.Bootstrap Table 排序

服務器模式排序,是前台傳入排序字段,排序方式到后台,后台重新加載排序后的結果返回前台。本質與分頁類似,都是需要通過重新發送ajax數據請求。在排序時的觸發事件如下:

onSort               sort.bs.table name,order 當用戶對列進行排序時觸發,參數包含:
name: 排序列字段名
order: 排序列的順序

 

 

后台代碼需接收前台的排序字段,對於前台中文(數據庫存儲的是數字或英文,需要翻譯為中文描述信息)展示的字段,約定字段規則,定義為數據庫字段名稱加字符串“Desc”,參考代碼如下:

 1  /**
 2      * 解析前段傳入的參數
 3      *
 4      * @param inMap 傳入參數
 5      * @return
 6      */
 7     public static Map getPubQueryParams(Map inMap) {
 8         Map queryParams = new HashMap();
 9         String order = inMap.get("order") == null ? "" : inMap.get("order").toString();  //排序規則
10         String sort = inMap.get("sort") == null ? "" : inMap.get("sort").toString();     //排序字段
11         if (StringUtil.isNotEmpty()) {
12             sort = sort.replaceAll("Desc", "");                                      //去掉描述信息映射回數據庫中的字段
13             sort = sort.replaceAll("([A-Z])", "_$1").toLowerCase();                //正則表達式替換駝峰為數據庫格式
14         }
15         queryParams.put("order", order);
16         queryParams.put("sort", sort);
17         Integer start = inMap.get("start") == null ? 0 : (Integer) inMap.get("start");
18         Integer limit = inMap.get("start") == null ? 50 : (Integer) inMap.get("limit");
19         if (start > 0) {
20             start = (start - 1) * limit;
21         }
22         queryParams.put("start", start);
23         queryParams.put("limit", limit);
24         return queryParams;
25     }

7.表格示例代碼

 本例完整的js初始化表格,加載數據代碼如下:

  1 Scdp.define("TestTable.view.testtableView", {
  2     extend: 'Scdp.bootstrap.mvc.AbstractCrudView',
  3     initView: function () {
  4         var me = this;
  5         me.loadCharts();
  6     },
  7     loadCharts: function () {
  8         var me = this;
  9         var t_limit=20;                       //設置默認分頁參數
 10         var t_size=1;                         //設置默認分頁參數
 11         var t_sort="uuid";                    //設置默認排序參數
 12         var t_order="desc";                   //設置默認排序規則
 13         var tb_departments = $("#tb_departments").bootstrapTable({
 14             method: 'post',                      //請求方式(*)
 15             height: MP.Const.dataGridHeight,
 16             toolbar: '#toolbar',                //工具按鈕用哪個容器
 17             striped: true,                      //是否顯示行間隔色
 18             cache: false,                       //是否使用緩存,默認為true,所以一般情況下需要設置一下這個屬性(*)
 19             pagination: true,                   //是否顯示分頁(*)
 20             sortable: true,                     //是否啟用排序
 21             sortOrder: "asc",                   //排序方式
 22             sidePagination: "server",           //分頁方式:client客戶端分頁,server服務端分頁(*)
 23             pageNumber: 1,                       //初始化加載第一頁,默認第一頁
 24             pageSize: 20,                       //每頁的記錄行數(*)
 25             pageList: [20, 30, 40],        //可供選擇的每頁的行數(*)
 26             //search: true,                       //是否顯示表格搜索,此搜索是客戶端搜索,不會進服務端,所以,個人感覺意義不大
 27             strictSearch: true,
 28             //showPaginationSwitch: true,
 29             showExport: true,
 30             exportDataType: "all",
 31             showExport: true,  //是否顯示導出按鈕
 32             buttonsAlign:"right",  //按鈕位置
 33             exportTypes:[ 'csv', 'txt', 'sql', 'doc', 'excel', 'xlsx', 'pdf'],  //導出文件類型
 34             Icons:'glyphicon-export',
 35             showColumns: true,                  //是否顯示所有的列
 36             showToggle:true,                    //是否顯示詳細視圖和列表視圖的切換按鈕
 37             showRefresh: true,                  //是否顯示刷新按鈕
 38             minimumCountColumns: 1,             //最少允許的列數
 39             clickToSelect: true,                //是否啟用點擊選中行
 40             cardView: false,                    //是否顯示詳細視圖
 41             detailView: false,                   //是否顯示父子表
 42             showHeader: true,
 43             columns: [
 44                 //{
 45                 //    title: "全選",
 46                 //    field: "select",
 47                 //    checkbox: true,
 48                 //    width: 20,//寬度
 49                 //    align: "left",//水平
 50                 //    valign: "middle"//垂直
 51                 //},
 52                 {
 53                     title: '編號',//標題  可不加
 54                     formatter: function (value, row, index) {
 55                         return index+1;
 56                     }
 57                 },
 58                 {
 59                     align: "left",//水平居中
 60                     halign: "left",//垂直居中
 61                     field: "vehplate",
 62                     title: "車牌號碼"
 63                 },{
 64                     align: "left",
 65                     halign: "left",
 66                     field: "price",
 67                     sortable:true,
 68                     title: "原值(萬元)",
 69                     formatter: function (value) {
 70                         return "<span class='badge bg-orange'  style='padding:5px 10px;'>" + value + "</span>";
 71                     }
 72                 },
 73                 {
 74                     align: "left",
 75                     halign: "left",
 76                     field: "netvalue",
 77                     sortable:true,
 78                     title: "凈值(萬元)",
 79                     formatter: function (value) {
 80                         return "<span class='badge bg-green'  style='padding:5px 10px;'>" + value + "</span>";
 81                     }
 82                 },
 83                 {
 84                     align: "left",
 85                     halign: "left",
 86                     field: "accumulatedmileage",
 87                     sortable:true,
 88                     title: "累計里程"
 89                 },
 90                 {
 91                     align: "left",
 92                     halign: "left",
 93                     field: "accumulateddepreciation",
 94                     sortable:true,
 95                     title: "累計折舊(萬元)"
 96                 },
 97                 {
 98                     align: "left",
 99                     halign: "left",
100                     field: "vehClass",
101                     title: "車型"
102                 },
103                 {
104                     align: "left",
105                     halign: "left",
106                     field: "vehtype1Desc",
107                     title: "車類",
108                 }, {
109                     align: "left",
110                     halign: "left",
111                     field: "vehtype2Desc",
112                     //width: 100,
113                     title: "車類明細"
114                 }, {
115                     align: "left",
116                     halign: "left",
117                     field: "vehtype3Desc",
118                    // width: 100,
119                     title: "行駛證車輛類型"
120                 },
121                 {
122                     align: "left",
123                     halign: "left",
124                     field: "isonloan",
125                     title: "車輛是否借出",
126                     formatter: function (value) {
127                         var state;
128                         if (value == '2') {
129                             state = "<span class='badge bg-red' style='padding:5px 10px;'>外借</span>";
130                         } else {
131                             state = "<span class='badge bg-green'  style='padding:5px 10px;'>在用</span>";
132                         }
133                         return state;
134                     }
135                 }, {
136                     align: "left",
137                     halign: "left",
138                     field: "usedepartDesc",
139                    // width: 170,
140                     title: "車輛使用部門"
141                 }, {
142                     align: "left",
143                     halign: "left",
144                     field: "managedepartDesc",
145                     //width: 170,
146                     title: "車輛管理部門",
147                 }, {
148                     align: "left",
149                     halign: "left",
150                     field: "affiliationDesc",
151                     //width: 170,
152                     title: "車輛所屬單位"
153                 }, {
154                     align: "left",
155                     halign: "left",
156                     field: "locatecityDesc",
157                     //width: 170,
158                     title: "區域"
159                 },
160                 {
161                     align: "left",
162                     halign: "left",
163                     field: "buydate",
164                     title: "購置日期",
165                     sortable:true,
166                    // width: 200,
167                     formatter: function (value) {
168                         return MP.dateFormatter(new Date(value));
169                     }
170                 },
171                 {
172                     align: "left",
173                     halign: "left",
174                     field: "remark",
175                     //width: 270,
176                     title: "備注"
177                 }
178             ],
179             onPageChange:function(number, size)
180             {
181                 //設置在分頁事件觸發時,傳遞分頁參數給后台,重新加載數據
182                 t_limit=number;
183                 t_size=size;
184                 var params={};
185                 params.start=number;
186                 params.limit=size;
187                 //加上排序的參數
188                 params.sort=t_sort;
189                 params.order=t_order;
190                 me.ajaxGetData(params);
191             },
192             onSort: function (name, order) {
193                 t_sort=name;
194                 t_order=order;
195                 var params={};
196                 //加上分頁的參數
197                 params.start=t_limit;
198                 params.limit=t_size;
199                 params.sort=t_sort;
200                 params.order=t_order;
201                 me.ajaxGetData(params);
202             }
203         });
204     },
205     //ajax后台請求數據
206     ajaxGetData: function (params) {
207         MP.doAction("base-car-query", params, function (datas) {
208             if (datas.success) {
209                 $("#tb_departments").bootstrapTable('load', datas);
210             }
211         }, function (datas) {
212             alert("數據加載失敗");
213         }, true, true);
214     }
215 });
View Code

 對於表格多列數據展示問題及換行問題,可參考Bootstrap對table的class 定義樣式。參考網站:http://www.runoob.com/bootstrap/bootstrap-tables.html

<table id="tb_departments" class="table text-nowrap"></table>   //表示表格產生橫向滾動條,內容設置為一行
<table id="tb_departments" class="table table-striped"></table>   //不產生橫向滾動條,數據內容折行顯示

8.未解決事項

  •  全部導出文件問題:在導出表格數據到文件時,發現設置導出模式為”all“時,重新請求了后台查詢數據,但是攜帶的分頁參數依舊是當頁的分頁參數,導致后台請求到的數據不是所有的數據。針對這個問題,目前還未解決。有一個解決思路可測試一下,參考代碼在basic,all模式下js導出函數是如何處理的,通過查看js的導出實現函數,看能否修改分頁參數的值,修改后台獲取的數據數量。
  • pdf文件導出內容顯示不全問題:通過引用本例的js插件,已經處理了pdf導出中文亂碼問題,修改了js中的部分字體代碼,詳情查看網址:http://m.blog.csdn.net/youand_me/article/details/76642434。目前發現導出的pdf展示數據列不全,后面的部分的數據列內容在pdf中無法展示的問題。分析原因是因為pdf文件的寬度有限,多列數據列展示時,不像excel一樣可以拖動展示。同樣情況下的word文件導出時,word文件能展示數據,只是格式變亂了(標題變窄)。所以,這個問題針對少量數據列時,導出到pdf文件中,沒有問題,多數據列時,無論是導出到pdf或者word文件中,在格式方面均不好,可根據實際項目看是否處理,個人覺得意義不大,數據列多時,始終展示界面會不好。

9.相關插件

請點擊鏈接可下載BootStrap Table(當前版本 v 1.1.1)插件。bootstrap-table-develop.zip

 10.參考網址

http://bootstrap-table.wenzhixin.net.cn/

http://www.runoob.com/bootstrap/bootstrap-tables.html

http://blog.csdn.net/rickiyeat/article/details/56483577

 

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM