动态文件下载而不保存服务器中的文件

时间:2014-12-22 11:00:45

标签: excel java-ee struts2 struts apache-poi

我正在使用Apache POI库对多个excel文件执行某些操作。

我正在尝试下载excel报告而不将其存储在服务器中的某个位置。

我正在使用Struts 2,它需要将文件输入InputStream,而POI工作簿需要OutputStream来将数据写入。

任何帮助都会很棒

2 个答案:

答案 0 :(得分:2)

由于您已经知道需要Stream结果:

  

我正在使用Struts 2,它需要将文件输入InputStream

// With Getter
private InputStream inputStream;

您已经知道如何使用POI创建Excel:

  

POI工作簿需要OutputStream将数据写入。

public String execute(){

    // stuff 

    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    // fill the OutputStream with the Excel content
    workbook.write(baos);

然后唯一缺失的部分是如何将POI的OutputStream转换为Struts2 Stream结果的InputStream。这比其他人容易..:

    // Create an Input Stream from the bytes extracted by the OutputStream
    inputStream = new ByteArrayInputStream(baos.toByteArray());

    return SUCCESS;
}

答案 1 :(得分:-1)

这是怎么做的。

@RequestMapping(value = "/report/generate", method = RequestMethod.GET)
public ResponseEntity download(HttpServletResponse response) throws IOException {

        //..code to create your excel here using poi
        
        //Write data to outputstream
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        workbook.write(outputStream);

        if(workbook != null && outputStream != null) {
            workbook.close();
            outputStream.close();
        }

        //get bytes
        byte[] documentContent = outputStream.toByteArray();
        //prepare header
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.parseMediaType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"));
        headers.set(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=\"report.xlsx\"");
        headers.setContentLength(documentContent.length);
        return new ResponseEntity(documentContent, headers, HttpStatus.OK);
}