easyexcel icon indicating copy to clipboard operation
easyexcel copied to clipboard

com.alibaba.excel.exception.ExcelGenerateException: Can not close IO.

Open ywt66 opened this issue 1 year ago • 5 comments

导出一百万条数据遇到的问题,下面是代码: // 导出01 ` public void one(HttpServletResponse response) { try { setExportHeader(response); // 设置导出文件的响应头

        List<Products> productsList = productsMapper.selectList(null);
        if (productsList == null) {
            productsList = Collections.emptyList();
        }

        // 使用BufferedOutputStream包装响应的输出流
        try (BufferedOutputStream outputStream = new BufferedOutputStream(response.getOutputStream())) {
            // 使用EasyExcel框架导出用户信息到Excel文件
            EasyExcel.write(outputStream, Products.class)
                    .sheet("商品信息")  // 工作表名称
                    .doWrite(productsList);  // 将数据写入到工作表
        } catch (IOException e) {
            System.out.println("Error writing to response output stream: " + e);
            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);  // 设置响应状态码
        }

    } catch (Exception e) {
        System.out.println("Error during export process: " + e);
        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); // 设置响应状态码
    }
}`

这是报的错误:有大佬可以解决吗🤭 com.alibaba.excel.exception.ExcelGenerateException: Can not close IO. at com.alibaba.excel.context.WriteContextImpl.finish(WriteContextImpl.java:420) at com.alibaba.excel.write.ExcelBuilderImpl.finish(ExcelBuilderImpl.java:99) at com.alibaba.excel.ExcelWriter.finish(ExcelWriter.java:143) at com.alibaba.excel.write.builder.ExcelWriterSheetBuilder.doWrite(ExcelWriterSheetBuilder.java:63) at com.gsj.service.ExportService.one(ExportService.java:56) at com.gsj.controller.ProductController.exportExcel1(ProductController.java:31) 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.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:257) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:190) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:986) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:891) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1088) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:978) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) at java.base/java.lang.Thread.run(Thread.java:842) Caused by: org.springframework.web.context.request.async.AsyncRequestNotUsableException: Response not usable after response errors. at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleHttpServletResponse.obtainLockOrRaiseException(StandardServletAsyncWebRequest.java:338) at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleServletOutputStream.close(StandardServletAsyncWebRequest.java:427) at java.base/java.io.FilterOutputStream.close(FilterOutputStream.java:191) at com.alibaba.excel.context.WriteContextImpl.finish(WriteContextImpl.java:398) ... 55 more Suppressed: org.springframework.web.context.request.async.AsyncRequestNotUsableException: Response not usable after response errors. at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleHttpServletResponse.obtainLockOrRaiseException(StandardServletAsyncWebRequest.java:338) at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleServletOutputStream.write(StandardServletAsyncWebRequest.java:399) at java.base/java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:81) at java.base/java.io.BufferedOutputStream.flush(BufferedOutputStream.java:142) at java.base/java.io.FilterOutputStream.close(FilterOutputStream.java:182) ... 56 more

ywt66 avatar Jan 17 '25 13:01 ywt66

你好,这个问题解决了吗 @ywt66

WangXingFenga avatar Jan 21 '25 06:01 WangXingFenga

试试EasyExcel.write(response.getOutputStream()).autoCloseStream(false)

LSL1618 avatar Jan 21 '25 09:01 LSL1618

没有

果仔 @.***

---Original--- From: @.> Date: Tue, Jan 21, 2025 14:40 PM To: @.>; Cc: @.@.>; Subject: Re: [alibaba/easyexcel]com.alibaba.excel.exception.ExcelGenerateException: Can not close IO. (Issue#4080)

你好,这个问题解决了吗 @ywt66

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

ywt66 avatar Jan 21 '25 22:01 ywt66

改成这样了,还是同样的错误

Andy @.***

 

------------------ 原始邮件 ------------------ 发件人: "alibaba/easyexcel" @.>; 发送时间: 2025年1月21日(星期二) 下午5:07 @.>; @.@.>; 主题: Re: [alibaba/easyexcel] com.alibaba.excel.exception.ExcelGenerateException: Can not close IO. (Issue #4080)

试试EasyExcel.write(response.getOutputStream()).autoCloseStream(false)。

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

ywt66 avatar Jan 25 '25 02:01 ywt66

@ywt66 去掉try-catch-resource语法,保留try-catch即可,不要去接管输出流的关闭,让Servlet自己处理。再看看是否有效。

LSL1618 avatar Feb 06 '25 02:02 LSL1618