使用Apache POI从Spring Controller返回Excel文档

pet*_*hel 3 spring-mvc apache-poi

我正在尝试将Excel文件发送回用户.在某种程度上,即使它是空的,我的excel文件也会被破坏.当我打开文件时,Excel告诉我该文件已损坏.

如果我删除

response.getOutputStream().write(excelService.exportEventsToCSV());
Run Code Online (Sandbox Code Playgroud)

我得到一个空的excel文件.

@RequestMapping(value = "/events/excel", method = RequestMethod.GET)
    public void getEventsAsExcel(HttpServletResponse response) {

        try {

            response.setHeader("Content-disposition", "attachment; filename=test.xls");
            response.getOutputStream().write(excelService.exportEventsToCSV());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的XML生成非常简单.只是空文件

@Override
public byte[] exportEventsToCSV() {
    try {

        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet worksheet = workbook.createSheet("POI Worksheet");
        HSSFCellStyle cellStyle = workbook.createCellStyle();


        workbook.write(fileOut);

        return workbook.getBytes();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

请任何建议.我正在考虑Springs Excel视图,但我不想要一个视图.只是一个下载的文件.

Gag*_*arr 12

你似乎在做出一些非常奇怪的事情来获得输出,而且我很确定它workbook.getBytes()没有回归你的想法......

我强烈建议你改变exportEventsToCSV以返回工作簿,然后你可以做更简单的事情:

Workbook wb = excelService.exportEventsToCSV();
response.setHeader("Content-disposition", "attachment; filename=test.xls");
wb.write( response.getOutputStream() );
Run Code Online (Sandbox Code Playgroud)

这应该工作正常,并为最终用户提供他们期望的那种东西