【问题标题】:Streaming excel file using Jersey output stream使用 Jersey 输出流流式传输 excel 文件
【发布时间】:2018-08-01 04:34:19
【问题描述】:

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

代码如下所示:

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();

它适用于最多约 5000 条记录的较小数据集,但是,当我尝试生成包含 20k + 条记录(约 5mb)的文件时,我在 workbook.write(output) 处收到以下错误:

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

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

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

try {
         FileOutputStream fos = new FileOutputStream(File);
            workbook.write(fos);
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

这里有人遇到过类似的 Jersey / apache-poi 问题吗?非常欢迎任何有关修复或合适解决方法的建议。

【问题讨论】:

    标签: java jersey apache-poi


    【解决方案1】:

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

    Broken Pipe when writing bytes in ServletOutputStream

    【讨论】:

    • 感谢您的回复,但我没有看到任何表明管道损坏或客户端连接超时的错误。它在尝试 workbook.write(output) 时特别发生。这很烦人!
    • 好的,所以尝试暂停 30 秒或其他时间,然后编写较短的工作簿
    【解决方案2】:

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

    【讨论】:

    • “将我的 apache-poi jar 升级到 3.8”:不要称其为升级。Version 3.8-FINAL (2012-03-26) 现在已经快 6 年了。为什么人们使用如此古老的版本?
    • 你说得对,我降级了! 3.17 是最新版本。只是我还是 3.8 在数字上看起来比 3.17 更新的版本?
    猜你喜欢
    • 2022-09-27
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    相关资源
    最近更新 更多