easyexcel使用模板导出时出现异常ExcelGenerateException: Create workbook failure

场景是使用一个模板,生成多个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";

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Qrind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值