网站建设原则包括哪些方面,网站开发公司需要什么资质,59一起做网站,php 网站开发缓存有那几种前言#xff1a;
在使用easyExcel填充list时#xff0c;第一行存在合并单元格的情况下#xff0c;后面使用forceNewRow()填充的行却没有合并样式。
模板#xff1a; 填充后#xff1a; 自定义拦截器#xff1a;
根据官方文档的提示#xff0c;我们需要自定义拦截器来…前言
在使用easyExcel填充list时第一行存在合并单元格的情况下后面使用forceNewRow()填充的行却没有合并样式。
模板 填充后 自定义拦截器
根据官方文档的提示我们需要自定义拦截器来对单元格进行操作。拦截器MyHandler继承了easyExcel的AbstractMergeStrategy类并重写了merge方法用于定义具体的单元格合并逻辑。
merge方法主要用于检查当前单元格的上一行对应位置的单元格是否已被合并。如果已被合并则在当前单元格的位置创建一个新的合并区域并设置该区域的边框样式以此来保持填充list时合并区域的连续性。
public class MyHandler extends AbstractMergeStrategy {Overrideprotected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {if(relativeRowIndexnull ||relativeRowIndex0){return;}int rowIndex cell.getRowIndex();int colIndex cell.getColumnIndex();sheetcell.getSheet();Row preRow sheet.getRow(rowIndex - 1);Cell preCell preRow.getCell(colIndex);//获取上一行的该格ListCellRangeAddress list sheet.getMergedRegions();for (int i 0; i list.size(); i) {CellRangeAddress cellRangeAddress list.get(i);if (cellRangeAddress.containsRow(preCell.getRowIndex()) cellRangeAddress.containsColumn(preCell.getColumnIndex())) {int lastColIndex cellRangeAddress.getLastColumn();int firstColIndex cellRangeAddress.getFirstColumn();int firstRowIndex cellRangeAddress.getFirstRow();CellRangeAddress cra new CellRangeAddress(rowIndex, rowIndex, firstColIndex, lastColIndex);sheet.addMergedRegion(cra);//设置合并区域cra的边框RegionUtil.setBorderBottom(BorderStyle.THIN, cra, sheet);RegionUtil.setBorderLeft(BorderStyle.THIN, cra, sheet);RegionUtil.setBorderRight(BorderStyle.THIN, cra, sheet);RegionUtil.setBorderTop(BorderStyle.THIN, cra, sheet);return;}}}
}
定义好拦截器后我们要在填充时调用registerWriteHandler()将定义的拦截器作为参数。 填充后 单元格列合并
上面的效果已经满足了大部分人的需求。但可能有些人会有将第一列相同的item单元格进行列合并的需求那么我们只需要将拦截器中merge方法的新增合并区域cra修改如下。如果当前单元格的内容和上一行单元格内容相等我们要先移除上一行单元格的合并区域再和当前单元格组成新的合并区域而不能直接合并上一行单元格否则会报错 修改的部分调用了getCellContent()方法这个方法主要是来获取单元格的内容来进行比较的具体的实现如下
private String getCellContent(Cell cell) {if (cell null) {return null;}switch (cell.getCellType()) {case STRING:return cell.getStringCellValue();case NUMERIC:if (DateUtil.isCellDateFormatted(cell)) {return cell.getDateCellValue().toString();} else {return Double.toString(cell.getNumericCellValue());}case BOOLEAN:return Boolean.toString(cell.getBooleanCellValue());case FORMULA:return cell.getCellFormula();default:return ;}
}
填充后 分页线
可以看到现在第一列的item相同内容的已经进行列合并了。但是我发现一个问题就是分页线错位了在填充完list之后分页线并没有随数据一起下移。所以我们需要在拦截器的merge方法中添加下面几行代码就可以重新设置分页线了。
下面代码将分页线设置在填充的list最后一行数据的下一行有其他需求的伙伴可以看情况自行修改 填充后 参考EasyExcel填充时合并单元格_easyexcel填充数据合并单元格-CSDN博客