alibaba / easyexcel

快速、简洁、解决大文件内存溢出的java处理Excel工具
https://easyexcel.opensource.alibaba.com
Apache License 2.0
32.09k stars 7.5k forks source link

异步读Excel文件,一直提示Convert excel format exception.You can try specifying the 'excelType' yourself #3950

Closed LiArun closed 1 month ago

LiArun commented 1 month ago

建议先去看文档

快速开始常见问题

异常代码

这是controller层代码
    @PostMapping("/test2")
    public void test2(@RequestParam("file") MultipartFile file) {
        testService.testService(file);
    }

这是service层代码
@Slf4j
@Service
public class TESTService {

    @Resource
    private JdbcTemplate jdbcTemplate;
    @Resource
    private RedisTemplate<String, Object> redisTemplate;
    @Resource
    private ImportExcelTaskService importExcelTaskService;

    @Async(AsyncConfiguration.ASYNC_EXECUTOR_THREAD_NAME)
    public void testService(MultipartFile file) {

        try (InputStream inputStream = file.getInputStream()) {
            List<Object> commentList = ExcelUtil.getReader(inputStream).read(0, 0).get(0);
            String originalFilename = file.getOriginalFilename();

            // 导入数据
            EasyExcel.read(inputStream, new ExcelDataListener(redisTemplate, jdbcTemplate, importExcelTaskService)).sheet().doRead();
        } catch (Exception e) {
            e.printStackTrace();
            log.info("导入Excel发生异常:{}", e.getMessage());
        }
    }
}

异常提示

Convert excel format exception.You can try specifying the 'excelType' yourself

问题描述

在controller层调用service层的异步方法去导入Excel文件,一直提示上述异常,不知是否本人使用错误,望指教。

psxjoy commented 1 month ago

It looks like there might be a problem with the file. I recommend specifying the excelType and trying again.

看上去似乎是文件有问题。建议指定excelType后再试一下。

LiArun commented 1 month ago

该文件似乎有问题。我建议指定excelType并重试。

看来是文件有问题。建议指定excelType后再试一下。

    ExcelTypeEnum excelType = ExcelTypeEnum.XLSX;
    if (originalFilename.endsWith(".xls")) {
        excelType = ExcelTypeEnum.XLS;
    }
    // 导入数据
    EasyExcel.read(inputStream, new ExcelDataListener(redisTemplate, jdbcTemplate, importExcelTaskService)).excelType(excelType).sheet().doRead();

已经指定excelType,报错如下: com.alibaba.excel.exception.ExcelAnalysisException: java.nio.channels.ClosedChannelException at com.alibaba.excel.analysis.ExcelAnalyserImpl.(ExcelAnalyserImpl.java:61) at com.alibaba.excel.ExcelReader.(ExcelReader.java:30) at com.alibaba.excel.read.builder.ExcelReaderBuilder.build(ExcelReaderBuilder.java:214) at com.alibaba.excel.read.builder.ExcelReaderBuilder.sheet(ExcelReaderBuilder.java:251) at com.alibaba.excel.read.builder.ExcelReaderBuilder.sheet(ExcelReaderBuilder.java:239) at com.dzsk.report.system.controller.TESTService.testService(TESTService.java:59) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:751) at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115) at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:842) Caused by: java.nio.channels.ClosedChannelException at java.base/sun.nio.ch.FileChannelImpl.ensureOpen(FileChannelImpl.java:159) at java.base/sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:218) at java.base/sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:65) at java.base/sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:107) at java.base/sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:101) at java.base/java.nio.channels.Channels$ReadableByteChannelImpl.read(Channels.java:387) at org.apache.poi.util.IOUtils.readFully(IOUtils.java:370) at org.apache.poi.poifs.filesystem.POIFSFileSystem.(POIFSFileSystem.java:323) at com.alibaba.excel.analysis.ExcelAnalyserImpl.choiceExcelExecutor(ExcelAnalyserImpl.java:73) at com.alibaba.excel.analysis.ExcelAnalyserImpl.(ExcelAnalyserImpl.java:55) ... 19 more

psxjoy commented 1 month ago

Having too much business logic can make troubleshooting difficult. I recommend starting with the simplest demo to verify if it reads correctly, and then gradually adding other code.

太多的业务代码会影响排查。我建议使用最简单的demo来检查是否能够正常读取。然后再一步步加上其他的代码。