alibaba / easyexcel

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

Can not close IO. #3890

Closed jiangbin31 closed 2 months ago

jiangbin31 commented 2 months ago

异常堆栈信息

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.galaxy.introduce.service.impl.ExcelServiceImpl.exportExcelDiyHead(ExcelServiceImpl.java:103)   | at com.galaxy.introduce.controller.EasyExcelController.exportPoint(EasyExcelController.java:996)   | at com.galaxy.introduce.controller.EasyExcelController$$FastClassBySpringCGLIB$$d0123d3f.invoke()   | at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)   | at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793)   | at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)   | at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)   | at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:58)   | at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)   | at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)   | at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)   | at com.galaxy.introduce.intercept.LogAspect.around(LogAspect.java:57)   | at sun.reflect.GeneratedMethodAccessor136.invoke(Unknown Source)   | at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)   | at java.lang.reflect.Method.invoke(Method.java:498)   | at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)   | at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)   | at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)   | at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)   | at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)   | at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)   | at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)   | at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)   | at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708)   | at com.galaxy.introduce.controller.EasyExcelController$$EnhancerBySpringCGLIB$$714141d0.exportPoint()   | at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)   | at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)   | at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)   | at java.lang.reflect.Method.invoke(Method.java:498)   | at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)   | at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)   | at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)   | at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)   | at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)   | at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)   | at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)   | at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)   | at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)   | at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)   | at javax.servlet.http.HttpServlet.service(HttpServlet.java:502)   | at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)   | at javax.servlet.http.HttpServlet.service(HttpServlet.java:596)   | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209)   | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)   | at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)   | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)   | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)   | at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)   | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)   | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)   | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)   | at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)   | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)   | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)   | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)   | at datadog.trace.instrumentation.springweb.HandlerMappingResourceNameFilter.doFilterInternal(HandlerMappingResourceNameFilter.java:50)   | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)   | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)   | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)   | at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)   | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)   | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)   | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)   | at org.springframework.web.filter.ServletRequestPathFilter.doFilter(ServletRequestPathFilter.java:56)   | at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354)   | at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267)   | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)   | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)   | 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:492)   | at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130)   | at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)   | at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)   | at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:768)   | at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)   | at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)   | at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)   | at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926)   | at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791)   | at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)   | at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)   | at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)   | at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)   | at java.lang.Thread.run(Thread.java:750)   | Caused by: org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe   | at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:351)   | at org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:784)   | at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:298)   | at org.apache.catalina.connector.OutputBuffer.close(OutputBuffer.java:250)   | at org.apache.catalina.connector.CoyoteOutputStream.close(CoyoteOutputStream.java:153)   | at com.alibaba.excel.context.WriteContextImpl.finish(WriteContextImpl.java:398)   | ... 87 common frames omitted   | Caused by: java.io.IOException: Broken pipe   | at sun.nio.ch.FileDispatcherImpl.write0(Native Method)   | at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47)   | at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)   | at sun.nio.ch.IOUtil.write(IOUtil.java:65)   | at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:470)   | at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:136)   | at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1431)   | at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:768)   | at org.apache.tomcat.util.net.SocketWrapperBase.writeBlocking(SocketWrapperBase.java:593)   | at org.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:537)   | at org.apache.coyote.http11.Http11OutputBuffer$SocketOutputBuffer.doWrite(Http11OutputBuffer.java:540)   | at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:110)   | at org.apache.coyote.http11.Http11OutputBuffer.doWrite(Http11OutputBuffer.java:193)   | at org.apache.coyote.Response.doWrite(Response.java:603)   | at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:338)   | ... 92 common frames omitted

java 代码

ExcelWriter excelWriter = null; try { // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); excelWriter = EasyExcel.write(response.getOutputStream()) .head(list) .build(); WriteSheet writeSheet = EasyExcel.writerSheet(fileName).build(); excelWriter.write(dataList, writeSheet);

    } catch (Exception e) {
        log.error("下载文件失败", e);
        throw new ApiException("下载文件失败");
    } finally {
        // 千万别忘记finish 会帮忙关闭流
        if (excelWriter != null) {
            excelWriter.finish();
        }
    }

使用jar包 3.3.3

psxjoy commented 2 months ago

报错提示Broken pipe,和服务器之间的通信断了

psxjoy commented 2 months ago

不知道您是否已经解决该问题?我们先暂时关闭这个问题,如果还存在问题请重新Reopen这个issue。