admin管理员组

文章数量:1618728

场景是使用一个模板,生成多个sheet页面的导出文件

步骤1 复制模板按纪录数量生成多sheet的模板
private String generateNewTemplateFile(List<Map<String, String>> sheetMapList, String templateDir) throws IOException {
        File templateFile = new File(templateDir);
        Workbook workbook = WorkbookFactory.create(new FileInputStream(templateFile));
        for (int i = 0; i < sheetMapList.size(); i++) {
            workbook.cloneSheet(0);
        }
        String newTemplateFile = "test.xls";
        workbook.write(new FileOutputStream(newTemplateFile));
        return newTemplateFile;
    }
步骤2 使用easyexcel填充模板,代码如下
private String generateResultReport(List<Map<String, String>> sheetMapList, String newTemplateFilePath, String resultFileName) throws Exception {
        ExcelWriter excelWriter = EasyExcel
                .write(resultFileName)
                .withTemplate(newTemplateFilePath)
                .build();
        for (int i = 0; i < sheetMapList.size(); i++) {
            Map<String, String> map = sheetMapList.get(i);
            excelWriter.fill(map, EasyExcel.writerSheet(i).build());
        }
        excelWriter.finish();
        return resultFileName;
    }

这里会出现异常如下

com.alibaba.excel.exception.ExcelGenerateException: Create workbook failure
	at com.alibaba.excel.context.WriteContextImpl.<init>(WriteContextImpl.java:87)
	at com.alibaba.excel.write.ExcelBuilderImpl.<init>(ExcelBuilderImpl.java:35)
	at com.alibaba.excel.ExcelWriter.<init>(ExcelWriter.java:47)
	at com.alibaba.excel.write.builder.ExcelWriterBuilder.build(ExcelWriterBuilder.java:130)

...

Caused by: org.apache.poi.poifs.filesystem.NotOLE2FileException: Invalid header signature; read 0x0000000000000000, expected 0xE11AB1A1E011CFD0 - Your file appears not to be a valid OLE2 document
	at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:151)
	at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:117)
	at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:294)
	at com.alibaba.excel.util.WorkBookUtil.createWorkBook(WorkBookUtil.java:53)
	at com.alibaba.excel.context.WriteContextImpl.<init>(WriteContextImpl.java:85)
问题分析及解决

        问题原因写的比较清楚,easyexcel读取的模版文件不是OLE2格式,意思是excel格式有误。开始排查:

1.查看原模版文件是否正常,打开查看及测试直接导出可以。

2.这里判断生成的新模板文件是否有问题,因为生成后占用不能直接打开,可以查看副本,确认文件正常

3.使用代码判断新模版文件是否是OLE2格式,判断返回true,至此有点卡住了,明明是正常的文件,但是easyexcel就是报错。

4.判断POI版本与easyexcel版本中的依赖是否冲突之类的。。。排除一系列问题,不是。

解决方法

        偶尔想到生成模板的代码,这个新模板的文件名是固定的,如果多次导出文件占用,会不会是同一文件不能同时读写操作导致的,修改此处

String newTemplateFile =  "test.xls";

改为

String newTemplateFile = "test"+ System.currentTimeMillis() +".xls";

神奇的事情发生了,问题解决了,导出正常了。

本文标签: 异常模板EasyExcelExcelGenerateExceptionfailure