背景:
在工作中使用easyExcel+策略模式进行报表导出策略的编写时,时常碰到该问题,代码复现:
public void doASQMarketingGameReport(HttpServletRequest request, HttpServletResponse response, FormReportRequest reportRequest, FormReportStrategy strategy) throws Exception {
// 设置响应体
response.reset();
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(strategy.getExcelName(reportRequest) + ".xls", "utf-8"));
ServletOutputStream outputStream = response.getOutputStream();
// 创建一个工作簿
EasyExcel.write(outputStream).needHead(true) // excel表头
.head(strategy.dynamicHead(reportRequest)).excelType(ExcelTypeEnum.XLS) // excel类型
.registerConverter(new ArrayListConverter()).registerWriteHandler(new AbstractColumnWidthStyleStrategy() {
@Override
protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
// 设置列宽
Sheet sheet = writeSheetHolder.getSheet();
sheet.setColumnWidth(cell.getColumnIndex(), FormReportingConstant.EXCEL_CONFIG.COLUMN_WIDTH);
}
}).sheet(strategy.getExcelName(reportRequest)).doWrite(strategy.dynamicDataObject(reportRequest));// 写数据
outputStream.close();
}
分析:
一开始以为是流没有关闭的原因,但是做了流关闭以后还是有该异常。随即怀疑这个异常是一个外层的异常,也许是日志的原因真正的异常被覆盖了
解决方式:
对链式调用的代码进行debug,使用idea带的evaluate功能进行链式代码的一段一段的调用,最终定位到了实际异常位置