直接说问题
在使用easypoi2.3.0.1 导出个多sheet页的excel 时候 会调用ExcelExportOfTemplateUtil 这个类中的createExcleByTemplate(TemplateExportParams params, Map<Integer, Map<String, Object>> map)方法,在掉用此方法的时候会报空指针异常,
追踪代码 发现空指针 是因为
private CellStyle getStyles(boolean isSingle, ExcelForEachParams excelForEachParams) {
return excelExportStyler.getTemplateStyles(isSingle, excelForEachParams);
}
这个里面的excelExportStyler 为空导致的
再查看代码 发现
createExcleByTemplate(TemplateExportParams params, Map<Integer, Map<String, Object>> map) { }里面没有对excelExportStyler(表格样式)进行创建,所以导致了这个问题
解决办法:
修改createExcleByTemplate 方法。ok 解决(这个是easypoi 源码里面的bug,需要重新编译jar包)
public Workbook createExcleByTemplate(TemplateExportParams params,
Map<Integer, Map<String, Object>> map) {
// step 1. 判断模板的地址
if (params == null || map == null || StringUtils.isEmpty(params.getTemplateUrl())) {
throw new ExcelExportException(ExcelExportEnum.PARAMETER_ERROR);
}
Workbook wb = null;
// step 2. 判断模板的Excel类型,解析模板
try {
this.teplateParams = params;
wb = getCloneWorkBook();
// 创建表格样式(加上这个就ok)
setExcelExportStyler((IExcelExportStyler) teplateParams.getStyle()
.getConstructor(Workbook.class).newInstance(wb));
// step 3. 解析模板
for (int i = 0, le = params.isScanAllsheet() ? wb.getNumberOfSheets()
: params.getSheetNum().length; i < le; i++) {
if (params.getSheetName() != null && params.getSheetName().length > i
&& StringUtils.isNotEmpty(params.getSheetName()[i])) {
wb.setSheetName(i, params.getSheetName()[i]);
}
tempCreateCellSet.clear();
parseTemplate(wb.getSheetAt(i), map.get(i));
}
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
return null;
}
return wb;
}
已经编译好的包:https://download.csdn.net/download/u011056339/11218296