Bootstrap-table 合併相同單元格
Bootstrap-table 官方提供了合併單元格方法 mergeCells,它根據四個引數可以合併任意個單元格,我們要做的只是告訴它怎麼合併。
要合併同一列相同的單元格,無非兩種辦法,一種是一邊遍歷一邊合併,遍歷完了再合併。這裡採用第二種辦法,這裡不需要遍歷所有資料,因為使用者只能看到當前頁的資料,所以只遍歷當前頁的資料更省時間。
下面是我實現的獲取合併資訊演算法,最終返回的是一個雜湊表,比如下面的這個表格,如果要對「性別」這一列進行合併,很明顯前面兩個“男”需要合併成一個單元格,再去看下 Bootstrap-table 提供的 API,它需要的是從哪個單元格開始,合併多少個單元格,也就是它需要的是兩個數值型別的引數。
姓名 | 性別 | 年齡 |
---|---|---|
張三 | 男 | 23 |
李四 | 男 | 19 |
王二 | 女 | 20 |
麻子 | 男 | 21 |
所以我把雜湊表設定為,鍵存的是索引,值存的是從這個索引開始後面連續有多少個和它一樣的單元格,那麼上述表格性別這一列所得到的合併資訊雜湊表就為:
{
0: 2,
2: 1,
3: 1
}
下面演算法很簡單,使用兩個指標遍歷指定的列,如果兩個指標所指向的資料相同,那麼就將鍵所對應的值進行加一操作,整個方法只會對該列資料遍歷一邊,所以時間複雜度為 O(n)。
let getMergeMap = function (data, index: number) {
let preMergeMap = {};
// 第 0 項為表頭,索引從 2 開始為了防止陣列越界
for (let i = 2; i < data.length; i++) {
let preText = $(data[i-1]).find('td')[index].innerText;
let curText = $(data[i]).find('td')[index].innerText;
let key = i - 2;
preMergeMap[key] = 1;
while ((preText == curText) && (i < data.length-1)) {
preMergeMap[key] = parseInt(preMergeMap[key]) + 1;
i++;
preText = $(data[i - 1]).find('td')[index].innerText;
curText = $(data[i]).find('td')[index].innerText;
}
// while迴圈跳出後,陣列最後一項沒有判斷
if (preText == curText) {
preMergeMap[key] = parseInt(preMergeMap[key]) + 1;
}
}
return preMergeMap;
}
上述演算法得到了單列資料的合併資訊,下一步就是按照這個資訊進行相同單元格的合併了,因此封裝了下面的方法按照指定雜湊表進行合併。
let mergeCells = function (preMergeMap: Object, target, fieldName: string) {
for (let prop in preMergeMap) {
let count = preMergeMap[prop];
target.bootstrapTable('mergeCells', { index: parseInt(prop), field: fieldName, rowspan: count });
}
}
到目前為止,我們實現的都只是對單列資料進行合併,要實現對多列資料進行合併,那麼只需要對所有列都進行相同的操作即可。
export let mergeCellsByFields = function (data: Object[], target, fields) {
for (let i = 0; i < fields.length; i++) {
let field = fields[i];
// 保證 field 與 i 是相對應的
let preMergeMap = getMergeMap(data, i);
let table = target.bootstrapTable();
mergeCells(preMergeMap, table, field);
}
}
因為我在程式中做了一點處理,保證了fields
中每個值得索引與對應表頭的索引是一樣的,因此不需要額外傳入索引資訊。簡單來說就是我所實現的表格會根據fields
的順序,實現列之間的動態排序。你需要注意的是這一點很可能和你不一樣。
到現在已經能夠合併所有的列了,檢視 Bootstrap-table 的配置資訊發現,它有個屬性是 onPostBody 它會在 table body 載入完成是觸發,所以把這個屬性配置成我們的合併單元格方法即可。
// groups 為要合併的哪些列
onPostBody: function () {
mergeCellsByFields($('#table' + ' tr'), $('#table'), groups);
}
再說一點不太相關的,我實現的是讓使用者可以自己選可以合併多少列,即用了一個可多選的下拉選單框供使用者選擇,根據使用者選擇的數量去合併,所以傳入了一個groups
引數。
最後推薦一個排序外掛 thenBy,你可以用它進行多欄位排序,比如用在合併相同單元格的場景,在繪製表格前先對資料進行排序,那麼最後合併的結果就是把所有相同的資料聚合到一起了,並且還將它們合併到一起了,起到了一個隱形的過濾查詢功能。
相關文章
- PowerBuilder---合併相同單元格UI
- elementui——表格的相同內容單元格合併UI
- js實現table合併相同列單元格JS
- JavaScript合併表格中的內容相同的單元格JavaScript
- Html合併單元格HTML
- 使用jquery合併表格中相同文字的相鄰單元格jQuery
- vue表格合併單元格Vue
- EasyExcel-合併單元格Excel
- js 表格合併單元格JS
- Html Table 合併單元格HTML
- GridView合併單元格View
- 自定義的單元格合併
- element中表格合併單元格
- Element-plus 合併單元格
- excel合併的單元格重新填充Excel
- postgresql高階應用之合併單元格SQL
- td單元格合併程式碼例項
- springboot-實現excle檔案匯出的單元格相同內容合併Spring Boot
- Excel合併單元格的兩種簡單方法Excel
- elementui表格動態資料單元格合併UI
- table表格單元格合併程式碼例項
- JS動態生成表格後 合併單元格JS
- Excel合併單元格資料的方法教程Excel
- el-table自定義合併單元格後,單元格錯亂的問題
- table表格單元格橫向和屬性合併
- 【專案實戰】---EasyUI DataGrid單元格合併UI
- NPOI擴充套件--判斷指定單元格是否為合併單元格和輸出該單元格的行列跨度(維度)套件
- Java Servlet 實現合併多單元格匯出ExcelJavaServletExcel
- excel合併單元格快捷鍵 excel多個表格內容合併到一起Excel
- 關於HTML表格合併單元格的靈魂拷問HTML
- GridView列相同合併View
- devexpress report 合併列具有重複值的單元格devExpress
- 效率爆表!EasyExcel合併單元格這樣實現才是yydsExcel
- 快速查詢EXCEL整個工作表中的合併單元格Excel
- table表格單元格橫向和屬性合併程式碼例項
- Excel應用技巧:不規則合併單元格之批量填充序列Excel
- 玩電腦的豈能不知道excel怎麼合併單元格?Excel
- JAVA使用poi匯出Excel,合併單元格,設定自動列寬JavaExcel