easyExcel导出自定义表头
1、自定义拦截器,写入头部样式
publicclassCustomCellWriteHandlerextendsAbstractCellStyleStrategyimplementsCellWriteHandler{
Workbook workbook;@OverridepublicvoidbeforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead){super.beforeCellCreate(writeSheetHolder, writeTableHolder, row, head, columnIndex, relativeRowIndex, isHead);}@OverridepublicvoidafterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead){super.afterCellDispose(writeSheetHolder, writeTableHolder, cellDataList, cell, head, relativeRowIndex, isHead);}@OverridepublicvoidafterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead){this.initCellStyle(writeSheetHolder.getSheet().getWorkbook());this.setHeadCellStyle(cell,head,relativeRowIndex);}@OverrideprotectedvoidinitCellStyle(Workbook workbook){this.workbook= workbook;}@OverrideprotectedvoidsetHeadCellStyle(Cell cell, Head head, Integer integer){if(cell.getRowIndex()==0){
cell.setCellStyle(EasyExcelUtils.getColumnTopStyle(workbook,30));}elseif(cell.getRowIndex()==1){
cell.setCellStyle(EasyExcelUtils.getColumnSecondLineStyle(workbook,10));}if(cell.getRowIndex()>1){
cell.setCellStyle(EasyExcelUtils.getColumnStyle(workbook));}}@OverrideprotectedvoidsetContentCellStyle(Cell cell, Head head, Integer integer){}}
2、样式
publicclassEasyExcelUtils{publicstatic CellStylegetColumnTopStyle(Workbook workbook,int fontSize){if(fontSize==0){
fontSize=10;}
Font font= workbook.createFont();
font.setFontHeightInPoints((short) fontSize);
font.setBold(true);
font.setFontName("宋体");
CellStyle style= workbook.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER);
style.setVerticalAlignment(VerticalAlignment.CENTER);
style.setBorderBottom(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
style.setBorderRight(BorderStyle.THIN);
style.setBorderTop(BorderStyle.THIN);
style.setFont(font);
style.setWrapText(false);return style;}publicstatic CellStylegetColumnSecondLineStyle(Workbook workbook,int fontSize){if(fontSize==0){
fontSize=10;}
Font font= workbook.createFont();
font.setFontHeightInPoints((short) fontSize);
font.setFontName("Arial");
CellStyle style= workbook.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER);
style.setVerticalAlignment(VerticalAlignment.CENTER);
style.setBorderBottom(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
style.setBorderRight(BorderStyle.THIN);
style.setBorderTop(BorderStyle.THIN);
style.setFont(font);
style.setWrapText(false);return style;}publicstatic CellStylegetColumnStyle(Workbook workbook){
Font font= workbook.createFont();
font.setFontHeightInPoints((short)10);
font.setFontName("Arial");
CellStyle style= workbook.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER);
style.setVerticalAlignment(VerticalAlignment.CENTER);
style.setBorderBottom(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
style.setBorderRight(BorderStyle.THIN);
style.setBorderTop(BorderStyle.THIN);
style.setFont(font);
style.setWrapText(true);return style;}}
3、合并单元格utils
publicclassExcelFillCellMergeStrategyimplementsCellWriteHandler{private List<Integer> mergeColumnIndex;privateint mergeRowIndex;publicExcelFillCellMergeStrategy(){}public List<Integer>getMergeColumnIndex(){return mergeColumnIndex;}publicvoidsetMergeColumnIndex(List<Integer> mergeColumnIndex){this.mergeColumnIndex= mergeColumnIndex;}publicintgetMergeRowIndex(){return mergeRowIndex;}publicvoidsetMergeRowIndex(int mergeRowIndex){this.mergeRowIndex= mergeRowIndex;}publicExcelFillCellMergeStrategy(int mergeRowIndex, List<Integer> 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 integer, Boolean aBoolean){}@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&& mergeColumnIndex.contains(curColIndex)){mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, 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);}}}}
4、使用
List<FirProfessionalByDeptVo> list=(List<FirProfessionalByDeptVo>) stringListMap.get("resultList");
List<Integer> mergeColumnIndex= Arrays.asList(newInteger[]{0,1,2,3});int mergeRowIndex=1;
Set<String> excludeColumnFiledNames=newHashSet<String>();
excludeColumnFiledNames.add("params");
excludeColumnFiledNames.add("ratingNum");
excludeColumnFiledNames.add("remark");
excludeColumnFiledNames.add("rating");
ExcelWriter excelWriter= null;try{
WriteWorkbook writeWorkbook=newWriteWorkbook();
writeWorkbook.setOutputStream(outputStream);
writeWorkbook.setClazz(FirProfessionalByDeptVo.class);
writeWorkbook.setHead(head(ratingYear+"年"+material.getDeptName()+"评价总体情况分析表"));
writeWorkbook.setExcelType(ExcelTypeEnum.XLS);
writeWorkbook.setExcludeColumnFiledNames(excludeColumnFiledNames);
writeWorkbook.setAutoCloseStream(Boolean.TRUE);
List<WriteHandler> customWriteHandlerList=newArrayList<>();
customWriteHandlerList.add(newCustomCellWriteHandler());
customWriteHandlerList.add(newExcelFillCellMergeStrategy(mergeRowIndex, mergeColumnIndex));
writeWorkbook.setCustomWriteHandlerList(customWriteHandlerList);
excelWriter=newExcelWriter(writeWorkbook);
WriteSheet writeSheet=newWriteSheet();
writeSheet.setSheetName("XXXXXXX表");
excelWriter.write(list, writeSheet);
WriteContext writeContext= excelWriter.writeContext();
Sheet sheet= writeContext.getCurrentSheet();
Iterator<Row> rowIterator= sheet.rowIterator();while(rowIterator.hasNext()){
Row row= rowIterator.next();int rowNum= row.getRowNum();if(rowNum> mergeRowIndex&& list.size()> rowNum- mergeRowIndex-1){
FirProfessionalByDeptVo vo= list.get(rowNum- mergeRowIndex-1);
Cell cell= row.getCell(4);
cell.setCellValue(vo.getNowYearDeduction());
cell= row.getCell(5);
cell.setCellValue(vo.getLastYearDeduction());
cell= row.getCell(6);
cell.setCellValue(vo.getNowYearRemark());
cell= row.getCell(7);
cell.setCellValue(vo.getLastYearRemark());}}}catch(Exception e){
logger.error("生成评分卡文件失败",e);}finally{if(excelWriter!= null){
excelWriter.finish();}}privatestatic List<List<String>>head(String headTitle){
List<List<String>> list=newArrayList<List<String>>();
List<String> head1=newArrayList<String>();
head1.add(headTitle);
head1.add("模块");
List<String> head2=newArrayList<String>();
head2.add(headTitle);
head2.add("一级指标");
List<String> head3=newArrayList<String>();
head3.add(headTitle);
head3.add("二级指标");
List<String> head4=newArrayList<String>();
head4.add(headTitle);
head4.add("评分内容");
List<String> head5=newArrayList<String>