在使用easyexcel默认配置导出excel的情况下标题是加粗、宋体,内容样式是Calibri字体。业务希望标题不加粗,内容使用宋体。所以需要自定义一个全局的导出样式使用。

定义全局样式工具类

我们需要分别定义表头的样式和内容的样式,代码如下:


import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.VerticalAlignment;

/**
 * EasyExcel 样式工具类
 */
public class CustomExcelStyleUtil {
    
    /**
     * 标题样式
     *
     */
    public static WriteCellStyle getHeadStyle() {
        // 头的策略
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        // 背景颜色
        headWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
        headWriteCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        
        // 字体
        WriteFont headWriteFont = new WriteFont();
        //设置字体名字
        headWriteFont.setFontName("宋体");
        //设置字体大小
        headWriteFont.setFontHeightInPoints((short) 11);
        //取消字体加粗
        headWriteFont.setBold(Boolean.FALSE);
        //在样式用应用设置的字体;
        headWriteCellStyle.setWriteFont(headWriteFont);

        //设置底边框;
        headWriteCellStyle.setBorderBottom(BorderStyle.THIN);
        //设置左边框;
        headWriteCellStyle.setBorderLeft(BorderStyle.THIN);
        //设置右边框;
        headWriteCellStyle.setBorderRight(BorderStyle.THIN);
        //设置顶边框;
        headWriteCellStyle.setBorderTop(BorderStyle.THIN);

        //取消标题自动换行;
        headWriteCellStyle.setWrapped(Boolean.FALSE);
        // 锁定标题
        headWriteCellStyle.setLocked(true);
    
        //设置水平对齐的样式为居中对齐;
        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        //设置垂直对齐的样式为居中对齐;
        headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        
        return headWriteCellStyle;
    }
    
    
    /**
     * 内容样式
     */
    public static WriteCellStyle getContentStyle() {
        // 内容的策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        
        // 设置字体
        WriteFont contentWriteFont = new WriteFont();
        contentWriteFont.setFontHeightInPoints((short) 11);//设置字体大小
        contentWriteFont.setFontName("宋体"); //设置字体名字
        contentWriteCellStyle.setWriteFont(contentWriteFont);//在样式用应用设置的字体;
        
        //设置样式;
        contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);//设置底边框;
        contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);  //设置左边框;
        contentWriteCellStyle.setBorderRight(BorderStyle.THIN);//设置右边框;
        contentWriteCellStyle.setBorderTop(BorderStyle.THIN);//设置顶边框;
        
        // contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);// 水平居中
        // contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中
        contentWriteCellStyle.setWrapped(Boolean.FALSE); //设置自动换行;
        
        return contentWriteCellStyle;
    }
}

使用自定义样式

我们在导出的时候指定使用我们刚刚创建的配置即可

List<ExportEarthquakePolicyListVO> exportPolicyLists = riskEarthquakePolicyService.exportEarthquakePolicyList(searchDTO, companyCode);

    if (exportPolicyLists == null || exportPolicyLists.isEmpty()) {
      return;
    }
    
    // 设置文本内省
    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
    // 设置字符编码
    response.setCharacterEncoding("utf-8");
    String fileTimeStr = DateUtil.format(DateUtil.date(), "yyyyMMddHHmm");
    String fileName = URLEncoder.encode("标的清单_" + fileTimeStr, StandardCharsets.UTF_8);
    // 设置响应头
    response.setHeader("Content-disposition", "filename=" + fileName + ".xlsx");
  
    // 使用try-with-resources确保资源释放
    try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), ExportEarthquakePolicyListVO.class)
            .registerWriteHandler(new HorizontalCellStyleStrategy(CustomExcelStyleUtil.getHeadStyle(),CustomExcelStyleUtil.getContentStyle()))
            .build()
    ) {
      WriteSheet writeSheet = EasyExcel.writerSheet("标的清单").build();
      excelWriter.write(exportPolicyLists, writeSheet);
    }
  }