1.合并单元格
/**
* 合并同列多行单元格
* 思路:根据同列单元格值相同则合并,找到起始行索引与结束行索引
* @param allCell 涉及到的列数
* @param allRow 总行数
* @param sheet1 sheet页
*/
public void mergeCell(Integer allCell, Integer allRow, XSSFSheet sheet1 ){
List<CellRangeAddress> mergeRegions = new ArrayList<>();
// 循环列数
for (int i = 0; i < allCell; i++) {
//循环行数
for (int rowIndex = 1; rowIndex < allRow; rowIndex++) {
Row row = sheet1.getRow(rowIndex);
// 跳过空行
if (row == null) {
continue;
}
Cell cell= row .getCell(i);
// 跳过没有值的单元格
if (cell== null) {
continue;
}
String currentValue = cell.getStringCellValue();
int startRow = rowIndex;
// 寻找相同值的最后一行
while (rowIndex + 1 < allRow && sheet1.getRow(rowIndex + 1).getCell(i).getStringCellValue().equals(currentValue)) {
rowIndex++;
}
int endRow = rowIndex;
if (startRow != endRow) {
//同列合并,所以起始列与终止列都是i;
mergeRegions.add(new CellRangeAddress(startRow, endRow, i, i));
}
}
}
// 应用合并区域
for (CellRangeAddress mergeRegion : mergeRegions) {
sheet1.addMergedRegion(mergeRegion);
}
}
2.读取合并单元格的值
/**获取合并后单元格的值
*思路:获取所有合并区域集合,找到目标单元格所在的合并区域,获取该合并区域第一个单元格的
值
*@param sheetAt sheet页
*@param cell 要取值的单元格
*/
publich String getMergeRegionsValue(XSSFSheet sheetAt, XSSFCell cell) {
List<CellRangeAddress> mergedRegions = sheetAt.getMergedRegions();
if (null == cell){
//由于合并后的单元格值都是再第一个单元格中保存,cell可能为null
return null;
}
for (CellRangeAddress mergedRegion : mergedRegions) {
if (mergedRegion.isInRange(cell.getRowIndex(), cell.getColumnIndex())) {
// 如果在合并区域内,获取合并区域的第一个单元格的值
Row firstRow = sheetAt.getRow(mergedRegion.getFirstRow());
Cell firstCell = firstRow.getCell(mergedRegion.getFirstColumn());
// 输出合并区域第一个单元格的值
if (firstCell != null) {
return firstCell.getStringCellValue();
}
}
}
return cell.getStringCellValue();
}