无法在Spring Boot Rest Controller中的响应实体中获取excel文件

时间:2018-11-22 10:01:16

标签: excel rest spring-boot export

我正在使用Spring Boot将数据库数据导出到Excel工作表。我可以在浏览器中创建并下载excel工作表,但无法在响应实体中发送该excel文件。当我通过邮递员发送excel下载网址时,我得到了一些原始响应,该如何进行转换它向客户端显示文件的内容。 这是我的代码。你能建议我哪里做错了吗。

这是我的服务类,它生成excel并将其存储在字节数组中。

    public byte[] exportToExcelFile() throws IOException {
    List<Employee> list = dao.getEmployee();

      XSSFWorkbook workbook = new XSSFWorkbook(); 
      XSSFSheet sheet = workbook.createSheet("Employee");
      XSSFRow row = sheet.createRow(1);

    // create style for header cells
        CellStyle style = workbook.createCellStyle();
        Font font = workbook.createFont();
        font.setFontName("Arial");
        style.setFillForegroundColor(HSSFColor.BLUE.index);
        style.setFillPattern(CellStyle.SOLID_FOREGROUND);
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        font.setColor(HSSFColor.WHITE.index);
        style.setFont(font);

      // create header row
      XSSFRow header = sheet.createRow(0);

        header.createCell(0).setCellValue("sl nO");
        header.getCell(0).setCellStyle(style);

        header.createCell(1).setCellValue("Name");
        header.getCell(1).setCellStyle(style);

        header.createCell(2).setCellValue("Email");
        header.getCell(2).setCellStyle(style);

        header.createCell(3).setCellValue("Salary");
        header.getCell(3).setCellStyle(style);
        int rowCount = 1;

        for (Employee emp : list) {
            XSSFRow  aRow = sheet.createRow(rowCount++);
            aRow.createCell(0).setCellValue(emp.getId());
            aRow.createCell(1).setCellValue(emp.getName());
            aRow.createCell(2).setCellValue(emp.getEmail());
            aRow.createCell(3).setCellValue(emp.getSalary());
        }

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            workbook.write(bos);
        } finally {
            bos.close();
        }
        byte[] bytes = bos.toByteArray();
       // FileOutputStream out = new FileOutputStream(new File("employee.xlsx"));
         //workbook.write(out);
          //out.close();
          System.out.println("exceldatabase.xlsx written successfully");
        return bytes;
}

这是我要下载excel的休息控制器。

@RestController
public class MyController {
@Autowired
EmployeeService service;

@GetMapping(value = "/exportExcel")
public ResponseEntity exportEmployeeExcel(HttpServletResponse response) throws IOException {
    byte[] excelContent = service.exportToExcelFile();
    if (excelContent.length != 0) {

        response.setContentType("application/ms-excel");
        response.setHeader("Content-disposition", "attachment; filename=myfile.xls");

        return new ResponseEntity(excelContent, HttpStatus.OK);

    } else {

        return new ResponseEntity("download fail", HttpStatus.NO_CONTENT);
    }
}

}

1 个答案:

答案 0 :(得分:1)

您能尝试一下吗?

@CrossOrigin
@ResponseBody
@GetMapping(value = "/exportExcel")
public ResponseEntity<InputStreamResource> exportEmployeeExcel(HttpServletResponse response) throws IOException {
        byte[] excelContent = service.exportToExcelFile();
    if (excelContent.length != 0) {
        String fileName = "example.xlsx";
            MediaType mediaType = MediaType.parseMediaType("application/vnd.ms-excel");
            File file = new File(fileName);
            FileUtils.writeByteArrayToFile(file, excelContent);
            InputStreamResource resource = new InputStreamResource(new FileInputStream(file));

            return ResponseEntity.ok()
                    // Content-Disposition
                    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + file.getName())
                    // Content-Type
                    .contentType(mediaType)
                    // Contet-Length
                    .contentLength(file.length()) //
                        .body(resource);
        }else{
            return null; // you can return what you want !
        }

}