阿里巴巴EasyExcel自定义表格样式

2022-08-09 13:27:22

阿里巴巴EasyExcel自定义表格样式

基于注解方式设置标题栏-------@ExcelProperty

/**
     * 行政区名称
     */@ExcelProperty({"行政区名称","行政区名称"})@ColumnWidth(9)privateString areaName;/**
     * 疫木处置总重量(公斤)
     */@ExcelProperty({"1","疫木处置总体情况","疫木处置总重量(公斤)"})@ColumnWidth(12)privateDouble totalWeight;/**
     * 疫木处置树干重量(公斤)
     */@ExcelProperty({"2","疫木处置总体情况","疫木处置树干重量(公斤)"})@ColumnWidth(14)privateDouble trunkWeight;/**
     * 疫木处置枝桠重量(公斤)
     */@ExcelProperty({"3","疫木处置总体情况","疫木处置枝桠重量(公斤)"})@ColumnWidth(14)privateDouble branchWeight;

导出样式

image-20211224110553826

在@ExcelProperty({"","",…,""})中可以放置多个字段名称,有几个双引号代表表格头就有几行,名称相同会自动合并单元格。

设置单元格样式

可以是基于注解方式设置表头格式

@ColumnWidth(12)@HeadStyle(fillBackgroundColor=9)@HeadFontStyle(bold=false,fontHeightInPoints=10)

也可以是通过代码方式自定义表格头部和内容样式

//内容样式策略WriteCellStyle contentWriteCellStyle=newWriteCellStyle();//垂直居中,水平居中
contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);//设置 自动换行
contentWriteCellStyle.setWrapped(true);// 字体策略WriteFont contentWriteFont=newWriteFont();// 字体大小,加粗,字体类型
contentWriteFont.setFontName("宋体");
contentWriteFont.setFontHeightInPoints((short)10);
contentWriteCellStyle.setWriteFont(contentWriteFont);//头部样式策略WriteCellStyle headWriteCellStyle=newWriteCellStyle();
headWriteCellStyle.setWriteFont(contentWriteFont);// 输出为文件EasyExcel.write("C:\\Users\\Desktop\\Excel自定义样式.xlsx",WeightCountySummaryDTO.class).sheet("自定义").registerWriteHandler(HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle)).relativeHeadRowIndex(1)// 设置表格头从第几行开始.doWrite(dataList);

代码自定义表格的样式优先级高于基于注解定义。也就是说你已经基于注解方式定义了表格样式,但后来你又用代码设置了头部样式,那么导出的表格样式是通过代码设置的样式。

扩展-自动合并连续出现的相同单元格

编写一个实现CellWriteHandler的类

publicclassExcelCellMergeStrategyimplementsCellWriteHandler{// 设置合并相同名称的单元列privateint[] mergeColumnIndex;// 从哪行开始合并privateint mergeRowIndex;publicExcelFillCellMergeStrategy(){}publicExcelFillCellMergeStrategy(int mergeRowIndex,int[] mergeColumnIndex){this.mergeRowIndex= mergeRowIndex;this.mergeColumnIndex= mergeColumnIndex;}@OverridepublicvoidbeforeCellCreate(WriteSheetHolder writeSheetHolder,WriteTableHolder writeTableHolder,Row row,Head head,Integer columnIndex,Integer relativeRowIndex,Boolean isHead){}@OverridepublicvoidafterCellCreate(WriteSheetHolder writeSheetHolder,WriteTableHolder writeTableHolder,Cell cell,Head head,Integer relativeRowIndex,Boolean isHead){}@OverridepublicvoidafterCellDataConverted(WriteSheetHolder writeSheetHolder,WriteTableHolder writeTableHolder,CellData cellData,Cell cell,Head head,Integer integer,Boolean aBoolean){}@OverridepublicvoidafterCellDispose(WriteSheetHolder writeSheetHolder,WriteTableHolder writeTableHolder,List<CellData> list,Cell cell,Head head,Integer integer,Boolean aBoolean){//当前行int curRowIndex= cell.getRowIndex();//当前列int curColIndex= cell.getColumnIndex();if(curRowIndex> mergeRowIndex){for(int i=0; i< mergeColumnIndex.length; i++){if(curColIndex== mergeColumnIndex[i]){mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex);break;}}}}/**
     * 当前单元格向上合并
     *
     * @param writeSheetHolder
     * @param cell             当前单元格
     * @param curRowIndex      当前行
     * @param curColIndex      当前列
     */privatevoidmergeWithPrevRow(WriteSheetHolder writeSheetHolder,Cell cell,int curRowIndex,int curColIndex){//获取当前行的当前列的数据和上一行的当前列列数据,通过上一行数据是否相同进行合并Object curData= cell.getCellTypeEnum()==CellType.STRING? cell.getStringCellValue(): cell.getNumericCellValue();Cell preCell= cell.getSheet().getRow(curRowIndex-1).getCell(curColIndex);Object preData= preCell.getCellTypeEnum()==CellType.STRING? preCell.getStringCellValue(): preCell.getNumericCellValue();// 比较当前行的第一列的单元格与上一行是否相同,相同合并当前单元格与上一行if(curData.equals(preData)){Sheet sheet= writeSheetHolder.getSheet();List<CellRangeAddress> mergeRegions= sheet.getMergedRegions();boolean isMerged=false;for(int i=0; i< mergeRegions.size()&&!isMerged; i++){CellRangeAddress cellRangeAddr= mergeRegions.get(i);// 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元if(cellRangeAddr.isInRange(curRowIndex-1, curColIndex)){
                    sheet.removeMergedRegion(i);
                    cellRangeAddr.setLastRow(curRowIndex);
                    sheet.addMergedRegion(cellRangeAddr);
                    isMerged=true;}}// 若上一个单元格未被合并,则新增合并单元if(!isMerged){CellRangeAddress cellRangeAddress=newCellRangeAddress(curRowIndex-1, curRowIndex, curColIndex, curColIndex);
                sheet.addMergedRegion(cellRangeAddress);}}}}

使用时仅需将该策略注册即可

EasyExcel.write(response.getOutputStream(), clazz).sheet(sheetName).registerWriteHandler(newExcelCellMergeStrategy(mergeRowIndex,mergeColumnIndex)).doWrite(dataList);

总结

通过以上步骤设置导出表格样式即可导出类似于这样的excel数据。当然也有其他方式,我这只是其中一种,并且存在一些问题,欢迎指正!!!
image-20211229141853299

  • 作者:Jack_aim
  • 原文链接:https://blog.csdn.net/Jack_aim/article/details/122215679
    更新时间:2022-08-09 13:27:22