我是靠谱客的博主 明理草丛,这篇文章主要介绍poi 导出excel表格时 ,合并单元格(根据相同列值),现在分享给大家,希望可以做个参考。

效果如上
不多说 ,直接上代码

复制代码
1
2
3
4
5
6
7
8
9
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
package com.aheadbiotech.cms.modular.util.excel; import com.aheadbiotech.cms.modular.util.excel.model.MergeRecord; import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellRangeAddress; import java.util.ArrayList; import java.util.List; public class ExcelUtil { // needMergeColName:需要合并的列名集合 startMergeRowNum: 需要从哪一行开始合并 public static Workbook mergeSameCell(Workbook workbook , List<String> needMergeColName , Integer startMergeRowNum){ List<MergeRecord> mergeRecords = new ArrayList<>(); List<Integer> needMergeColNum = new ArrayList<>(); Sheet sheet = workbook.getSheetAt(0); if(workbook != null && needMergeColName != null){ // 遍历获取所有相同单元格 , 并记录 // 遍历表头 ,获取需要合并的 colnum , Row firstRow = sheet.getRow(0); if (firstRow != null) { // 找出所有需要合并单元格的列号 for (String needName : needMergeColName) { for (int i = 0; i < firstRow.getLastCellNum(); i++) { String cellContent = firstRow.getCell(i).getStringCellValue(); if (StringUtils.isNotEmpty(cellContent)) { if (cellContent.equals(needName)) { needMergeColNum.add(i); break; } } } } } // 找出所有需要合并的单元格 for(Integer needCol : needMergeColNum){ Integer allRows = sheet.getLastRowNum(); String sameContent = null; Integer firstRowNum = null ; Integer lastRowNum = null; Integer firstColNum = null; Integer lastColNum = null; MergeRecord mergeRecord = null; for(int rowNum = startMergeRowNum ; rowNum < allRows + 1 ; rowNum ++){ // 如果本行与下一行的值一样 ,则需要新建一个合并区域 Row row = sheet.getRow(rowNum); Row nextRow = sheet.getRow(rowNum + 1); String cellVal = row.getCell(needCol).getStringCellValue(); String nextCellVal = null; if(nextRow != null){ nextCellVal = nextRow.getCell(needCol).getStringCellValue(); } // 如果当行值等于相同值的话 ,合并行加1 if(sameContent != null && sameContent.equals(nextCellVal)){ lastRowNum = rowNum + 1; continue; } // 如果下一行的值与当前值不相同 或者已经到最后一行,那么结束本次的合并单元格任务 if(((sameContent != null && !sameContent.equals(nextCellVal))) || (nextRow == null && sameContent != null)){ mergeRecord = new MergeRecord(); mergeRecord.setMergeContent(sameContent); mergeRecord.setCulomnNum(needCol); mergeRecord.setFirstRow(firstRowNum); mergeRecord.setLastRow(lastRowNum); mergeRecord.setFirstCol(firstColNum); mergeRecord.setLastCol(lastColNum); mergeRecords.add(mergeRecord); // 将相同内容置空 ,并寻找下一个需要合并的单元格 sameContent = null; } // 如果第一次两个值一样的话 if(cellVal.equals(nextCellVal)){ sameContent = cellVal ; firstRowNum = rowNum ; lastRowNum = rowNum + 1; firstColNum = needCol; lastColNum = needCol; } } } } // 找完所有的单元格后 ,开始合并 for(MergeRecord mergeRecord : mergeRecords){ sheet.addMergedRegion(new CellRangeAddress(mergeRecord.getFirstRow(), mergeRecord.getLastRow(), mergeRecord.getFirstCol(), mergeRecord.getLastCol())); } return workbook; } // list 的第一个为需要做合并判断逻辑的 , list中其他的合并逻辑跟第一个相同 public static Workbook mergeSameCellByMainCol(Workbook workbook , List<String> needMergeColName , Integer startMergeRowNum){ List<MergeRecord> mergeRecords = new ArrayList<>(); List<Integer> needMergeColNum = new ArrayList<>(); Sheet sheet = workbook.getSheetAt(0); if(workbook != null && needMergeColName != null){ // 遍历获取所有相同单元格 , 并记录 // 遍历表头 ,获取需要合并的 colnum , Row firstRow = sheet.getRow(0); if (firstRow != null) { // 找出所有需要合并单元格的列号 for (String needName : needMergeColName) { for (int i = 0; i < firstRow.getLastCellNum(); i++) { String cellContent = firstRow.getCell(i).getStringCellValue(); if (StringUtils.isNotEmpty(cellContent)) { if (cellContent.equals(needName)) { needMergeColNum.add(i); break; } } } } } // 找出所有需要合并的单元格 Integer needCol = needMergeColNum.get(0); Integer allRows = sheet.getLastRowNum(); String sameContent = null; Integer firstRowNum = null ; Integer lastRowNum = null; Integer firstColNum = null; Integer lastColNum = null; MergeRecord mergeRecord = null; for(int rowNum = startMergeRowNum ; rowNum < allRows + 1 ; rowNum ++){ // 如果本行与下一行的值一样 ,则需要新建一个合并区域 Row row = sheet.getRow(rowNum); Row nextRow = sheet.getRow(rowNum + 1); String cellVal = row.getCell(needCol).getStringCellValue(); String nextCellVal = null; if(nextRow != null){ nextCellVal = nextRow.getCell(needCol).getStringCellValue(); } // 如果当行值等于相同值的话 ,合并行加1 if(sameContent != null && sameContent.equals(nextCellVal)){ lastRowNum = rowNum + 1; continue; } // 如果下一行的值与当前值不相同 或者已经到最后一行,那么结束本次的合并单元格任务 if(((sameContent != null && !sameContent.equals(nextCellVal))) || (nextRow == null && sameContent != null)){ mergeRecord = new MergeRecord(); mergeRecord.setMergeContent(sameContent); mergeRecord.setCulomnNum(needCol); mergeRecord.setFirstRow(firstRowNum); mergeRecord.setLastRow(lastRowNum); mergeRecord.setFirstCol(firstColNum); mergeRecord.setLastCol(lastColNum); mergeRecords.add(mergeRecord); // 将相同内容置空 ,并寻找下一个需要合并的单元格 sameContent = null; } // 如果第一次两个值一样的话 if(cellVal.equals(nextCellVal)){ sameContent = cellVal ; firstRowNum = rowNum ; lastRowNum = rowNum + 1; firstColNum = needCol; lastColNum = needCol; } } // 其他列的合并情况跟第一列都一样 List<MergeRecord> lastAll = new ArrayList<>(); for(int i = 1 ; i < needMergeColNum.size() ; i++){ List<MergeRecord> tempList = new ArrayList<>(); for(MergeRecord record : mergeRecords){ MergeRecord mergeRecord1 = new MergeRecord(); mergeRecord1.setFirstRow(record.getFirstRow()); mergeRecord1.setLastRow(record.getLastRow()); mergeRecord1.setFirstCol(needMergeColNum.get(i)); mergeRecord1.setLastCol(needMergeColNum.get(i)); tempList.add(mergeRecord1); } lastAll.addAll(tempList); } mergeRecords.addAll(lastAll); } // 找完所有的单元格后 ,开始合并 for(MergeRecord mergeRecord : mergeRecords){ sheet.addMergedRegion(new CellRangeAddress(mergeRecord.getFirstRow(), mergeRecord.getLastRow(), mergeRecord.getFirstCol(), mergeRecord.getLastCol())); } return workbook; } }

使用方法

复制代码
1
2
3
4
5
6
7
8
//合并单元格需要的逻辑 String[] names = {"医生用户" , "医生姓名" ,"当前使用设备号" , "历史使用设备数" , "备注" , "创建时间" }; List<String> needColNames = Arrays.asList(names); ExcelUtil.mergeSameCellByMainCol(workbook , needColNames , 2);``` 第二个参数为需要合并的列名称 , 第三个参数为需要从第几行开始合并单元格

最后

以上就是明理草丛最近收集整理的关于poi 导出excel表格时 ,合并单元格(根据相同列值)的全部内容,更多相关poi内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部