2
三
四
五
六
七
八
九
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
四十二個
43
四十四
45
46
47
48
四十九個
50
51
五十二個
53
54
55
五十六歲
57
58
59
60
61
62
63
64
65
66
67
六十八
六十九
70
71
七十二個
73
74
75
76
77
七十八
79
80
81
82
83
84
八十五歲
86
87
88
八十九
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
包org . jeecgframe . poi . util;
導入Java . util . ArrayList;
導入Java . util . hashmap;
導入Java . util . list;
導入Java . util . map;
導入Java . util . set;
導入org . Apache . commons . lang 3 . string utils;
導入org . Apache . poi . ss . user model . cell;
導入org . Apache . poi . ss . user model . row;
導入org . Apache . poi . ss . user model . sheet;
import org . Apache . poi . ss . util . cellrangeaddress;
import org . JEE cgframework . poi . excel . entity . params . merge entity;
/**
*垂直合並單元格工具類
* @作者玨月
* @ date 2065438+June 265438+2005 11:21:40am
*/
公共最終類PoiMergeCellUtil {
private PoiMergeCellUtil(){
}
/**
*垂直合並具有相同內容的單元格。
*
* @param工作表
* @param mergeMap鍵列,值相關列,不為null。
* @param startRow起始行
*/
公共靜態空合並單元格(Sheet sheet,Map & ltInteger,int【】》;mergeMap,int startRow ){
地圖& ltInteger,MergeEntity & gtmergeDataMap = new HashMap & ltInteger,MergeEntity & gt();
if(merge map . size()= = 0 ){
返回;
}
Row行;
設置& lt整數& gtsets = merge map . keyset();
字符串文本;
for(int I = startRow;我& lt= sheet . getlastrownum();i++) {
row = sheet . getrow(I);
for(整數索引:集){
if(row . get cell(index)= = null ){
merge data map . get(index)。setEndRow(I);
}否則{
text = row . get cell(index)。getStringCellValue();
if(string utils . isnotempty(text)){
hanlderMergeCells(index,I,text,mergeDataMap,sheet,row . get cell(index),
merge map . get(index));
}否則{
mergeCellOrContinue(index,mergeDataMap,sheet);
}
}
}
}
if(merge data map . size()& gt;0) {
for(整數索引:merge data map . keyset()){
sheet . addmergedregion(new cell range address(merge data map . get(index)。getStartRow(),
merge data map . get(index)。getEndRow(),index,index));
}
}
}
/**
*處理合並單元格
*
* @param index
* @param rowNum
* @param text
* @param mergeDataMap
* @param工作表
* @param單元格
* @param delys
*/
私有靜態void hanlderMergeCells(整數索引,int rowNum,字符串文本,
地圖& ltInteger,MergeEntity & gt合並數據映射,工作表工作表,
Cell cell,int【】delys ){
if(merge data map . contains key(index)){
if(checkIsEqualByCellContents(merge data map . get(index),text,cell,delys,rowNum)({
merge data map . get(index)。setEndRow(rowNum);
}否則{
sheet . addmergedregion(new cell range address(merge data map . get(index)。getStartRow(),
merge data map . get(index)。getEndRow(),index,index));
merge data map . put(index,createMergeEntity(text,rowNum,cell,delys));
}
}否則{
merge data map . put(index,createMergeEntity(text,rowNum,cell,delys));
}
}
/**
*判斷角色何時為空。
*
* @param index
* @param mergeDataMap
* @param工作表
*/
私有靜態void mergeCellOrContinue(整數索引,Map & ltInteger,MergeEntity & gtmergeDataMap,
工作表工作表)
if(merge data map . contains key(index)
& amp& ampmerge data map . get(index)。getEndRow()!= merge data map . get(index)。getStartRow()){
sheet . addmergedregion(new cell range address(merge data map . get(index)。getStartRow(),
merge data map . get(index)。getEndRow(),index,index));
merge data map . remove(index);
}
}
私有靜態merge entity createMergeEntity(String text,int rowNum,Cell cell,int【】delys ){
merge entity merge entity = new merge entity(text,rowNum,rowNum);
列表& lt字符串& gtlist = new ArrayList & lt字符串& gt(delys . length);
merge entity . setrelylist(list);
for(int I = 0;我& ltdelys.lengthi++) {
list . add(getCellNotNullText(cell,delys【I】,rowNum);
}
返回mergeEntity
}
私有靜態布爾checkIsEqualByCellContents(merge entity merge entity,String text,
Cell cell,int【】delys,int rowNum ){
//沒有依賴關系
if(delys = = null | | delys . length = = 0 ){
返回mergeEntity.getText()。equals(文本);
}
//存在依賴關系。
if(merge entity . gettext()。等於(文本)){
for(int I = 0;我& ltdelys.lengthi++) {
如果(!getCellNotNullText(單元格,delys【I】,rowNum)。等於(
mergeEntity.getRelyList()。get(I))){
返回false
}
}
返回true
}
返回false
}
/**
*獲取單元格的值,並確保單元格必須有值,或向上查詢。
*
* @param單元格
* @param index
* @param rowNum
* @返回
*/
私有靜態字符串getCellNotNullText(單元格Cell,int index,int rowNum ){
String temp = cell.getRow()。getCell(index)。getStringCellValue();
while(string utils . isempty(temp)){
temp = cell.getRow()。getSheet()。getRow(-rowNum)。getCell(index)。getStringCellValue();
}
返回溫度;
}
}