【问题标题】:Sending xls via API with Java apache poi and React使用 Java apache poi 和 React 通过 API 发送 xls
【发布时间】:2020-11-17 17:00:58
【问题描述】:

我正在尝试从我的 java spring 服务器发送一个 xls 文件来响应客户端。

使用默认的 Apache POI 构造函数创建 xlsx 文件,这不好。为了覆盖它,我必须使用 FileOutputStream 创建文件。

FileOutputStream outputStream = new FileOutputStream("file.xls");

但我无法通过网络发送文件。我尝试使用以下答案:https://stackoverflow.com/a/54765335/10319765 我引用:“下载文件时,您的代码需要逐块流式传输文件 - 这就是 Java 流的用途。”

return ResponseEntity.ok().contentLength(inputStreamWrapper.getByteCount())
        .contentType(MediaType.parseMediaType("application/vnd.ms-excel"))
        .cacheControl(CacheControl.noCache())
        .header("Content-Disposition", "attachment; filename=" + "file.xls")
        .body(new InputStreamResource(inputStreamWrapper.getByteArrayInputStream()));

所以我的控制器正在发送InputStreamResource

如何使用我的FileOutputStream 构造InputStreamResource

P.S 这是我的 React 客户端:

 axios.get('/issues/export', { responseType: 'arraybuffer' }).then(response => {
        if (response && !response.error) {
            const blob = new Blob([response.payload.data], {type: 'application/vnd.ms-excel'});
            saveAs(blob);
        }
    });

来源:https://stackoverflow.com/a/46331201/10319765

编辑:

我已经设法做到了这一点,在我写入 FileOutputStream 之后,我打开了一个 FileInputStream 并返回了值。

    FileOutputStream outputStream = new FileOutputStream("file.xls");
    workbook.write(outputStream);
    workbook.close();
    final InputStream fileInputStream = new FileInputStream("file.xls");
    return fileInputStream;

但是现在,作为对客户端的响应返回的 xls 文件已损坏,并且其中包含奇怪的字符:

excel 文件应如下所示(发送后取自我的 java 服务器):

【问题讨论】:

    标签: java reactjs apache-poi


    【解决方案1】:

    问题已解决。最终,为了解决损坏的 xls 文件,我所做的是使用字节数组。控制器看起来完全一样,但现在返回类型是ResponseEntity<byte[]>。要将InputStream 转换为字节数组,我使用了IOUtils.toByteArray() 方法。

    客户端代码也发生了一些变化,因为现在类型不再是responseType: 'arraybuffer',而是'blob'

     axios.get('/issues/export', { responseType: 'blob' }).then(response => {
        if (response && !response.error) {
            const blob = new Blob([response.payload.data]);
            saveAs(blob);
        }
    });
    

    就是这样。

    【讨论】:

      猜你喜欢
      • 2013-01-10
      • 2021-04-25
      • 2014-09-26
      • 2011-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 2013-07-10
      相关资源
      最近更新 更多