如何为具有Excel工作表文件的InputStream构造响应主体?

时间:2019-07-09 06:53:40

标签: java excel spring rest spring-boot

我正在编写用于获取存储在src / main / resources中的excel工作表文件的get API。

InputStream具有excel文件(xlsm格式)的内容。但是响应是有损坏的数据。

@GetMapping("/downloadTemplate")
public ResponseEntity<?> downloadTemplate() throws IOException {
    String fn = "filename";

    try {
        File file = new File(getClass().getClassLoader().getResource(fn).getFile());
        InputStreamSource iss = new FileSystemResource(file);

        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE)
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename= SimpleStandardTemplate.xlsm")
                .body(IOUtils.toByteArray(iss.getInputStream()));
    } catch (Exception e) {
        log.error("An error occurred while trying to downloadTemplate: {}", e);
        throw new ApiException(ApiErrorCode.DEFAULT_410, "Error while downloading");
    }
}

似乎此行有问题“ body(IOUtils.toByteArray(iss.getInputStream()));” 。是否还有其他替代方法?否则可能是什么问题?

编辑:我认为问题在于内容长度。

4 个答案:

答案 0 :(得分:2)

尝试一下,并通过spring-boot 1.5.6进行了测试

@GetMapping("/export")
  public ResponseEntity<Resource> download() throws IOException {
    String fileName ="<file-path>";
    Resource resource = new FileSystemResource(fileName);
    return ResponseEntity.ok()
        .contentType(MediaType.parseMediaType(MediaType.APPLICATION_OCTET_STREAM_VALUE))
        .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"")
        .body(resource);
  }

答案 1 :(得分:0)

我认为您的MIME类型错误,Refer this for excel Mime types,我更改了使用Spring's FileSystemResource发送文件的方式

@GetMapping(value = "/downloadTemplate", produces = "application/vnd.ms-excel.sheet.macroEnabled.12")
public FileSystemResource downloadTemplate(HttpServletResponse response) throws IOException {
    String fn = "filename";
    File file = new File(getClass().getClassLoader().getResource(fn).getFile()); 
    response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename= SimpleStandardTemplate.xlsm");
    return new FileSystemResource(file); // You could directly pass the absolute path of the file
}

答案 2 :(得分:0)

一个潜在的问题是您的原始文件不是xlsm文件。例如,Excel不允许您在启用宏的模式下打开普通的xlsx文件。请仔细检查。

答案 3 :(得分:0)

This answer fixed the problem

将此插件添加到了pom。

    <plugin>
      <artifactId>maven-resources-plugin</artifactId>
      <version>2.5</version>
      <configuration>
        <encoding>UTF-8</encoding>
        <nonFilteredFileExtensions>
           <nonFilteredFileExtension>xls</nonFilteredFileExtension>
        </nonFilteredFileExtensions>
      </configuration>
    </plugin>