使用Jersey输出流流式传输excel文件

时间:2018-02-21 14:36:04

标签: java jersey apache-poi

我使用apache-poi构建一个excel文件并通过Jersey输出流将其返回给客户端。

代码如下所示:

-A IN_public_allow -p tcp -m tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT`

对于最小约5000条记录的较小数据集,它可以正常工作,但是,当我尝试生成具有20k +记录(大约5mb)的文件时,我在workbook.write(输出)处得到以下错误:

  

org.glassfish.jersey.server.ServerRuntime $ Responder.writeResponse An   写入响应消息实体时发生I / O错误   容器输出流。 javax.ws.rs.WebApplicationException:HTTP   500内部服务器错误

     

引起:org.apache.catalina.connector.ClientAbortException:   java.io.IOException:已建立的连接被中止   主机上的软件   org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:393)

值得注意的是,无论工作簿大小如何,我都可以使用FileOutputStream将文件写入磁盘;

final SXSSFWorkbook workbook = ExcelFormatter.buildWorkbook();

        StreamingOutput stream = new StreamingOutput() {
            @Override
            public void write(OutputStream output) throws IOException, WebApplicationException {
                try {
                    workbook.write(output);
                    workbook.close();
                    workbook.dispose();
                } catch (Exception e) {
                    throw new WebApplicationException(e);
                }
            }
        };

        return Response.ok(stream).header("content-disposition","attachment; filename = export.xlsx").type("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet").build();

有没有人在这里遇到类似泽西/阿帕奇的问题?对修复或合适的解决方法的任何建议都非常欢迎。

2 个答案:

答案 0 :(得分:1)

您的服务器代码可能没有任何问题,当我看到它时,由于网络进程中某处的超时而导致客户端挂断。

Broken Pipe when writing bytes in ServletOutputStream

答案 1 :(得分:0)

我将我的apache-poi jar升级到3.8,这似乎解决了问题