SpringBoot下载Excel文件时,报错文件损坏的解决方案

  • Post category:http

当使用SpringBoot下载Excel文件时,常见的问题是下载的文件打开后提示文件损坏。出现这种情况的原因是可能在下载和写出Excel文件时,没有正确地设置响应头信息,或Excel文件的格式不正确。下面是解决这个问题的完整攻略。

1. 设置响应头信息

在返回Excel文件时,需要设置正确的响应头信息。常见的响应头信息包括Content-Type、Content-Disposition和Content-Length。其中Content-Type表示下载的文件类型,Content-Disposition表示浏览器应该如何处理下载的文件,Content-Length表示文件的大小。以下是代码实现:

@GetMapping("/downloadExcel")
public void downloadExcel(HttpServletResponse response) throws IOException {
    // 查询数据并生成Excel文件
    List<User> userList = userService.findAllUsers();
    ExcelUtils.writeExcel(response, userList);

    // 设置响应头
    response.setHeader("Content-Disposition", "attachment; filename=userList.xlsx");
    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
    response.setCharacterEncoding("UTF-8");
}

在ExcelUtils.writeExcel方法中,我们使用了response.getOutputStream()来写出Excel文件。注意,必须先设置响应头,再获取输出流写出Excel文件。这样才能正确地下载并保存Excel文件。

2. 使用正确的Excel文件格式

另一个常见的问题是,下载的Excel文件无法正确地打开。这通常是因为生成的Excel文件格式不正确,例如使用了过时的xls格式。为了生成正确的Excel文件格式,应该使用xlsx格式。以下是代码实现:

public static void writeExcel(HttpServletResponse response, List<User> userList) throws IOException {
    XSSFWorkbook workbook = new XSSFWorkbook();
    XSSFSheet sheet = workbook.createSheet("User List");

    int rowNum = 0;
    XSSFRow header = sheet.createRow(rowNum++);
    header.createCell(0).setCellValue("ID");
    header.createCell(1).setCellValue("Name");
    header.createCell(2).setCellValue("Age");

    for (User user : userList) {
        XSSFRow row = sheet.createRow(rowNum++);
        row.createCell(0).setCellValue(user.getId());
        row.createCell(1).setCellValue(user.getName());
        row.createCell(2).setCellValue(user.getAge());
    }

    // 写出Excel文件
    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
    response.setCharacterEncoding("UTF-8");
    response.setHeader("Content-Disposition", "attachment; filename=UserList.xlsx");

    OutputStream outputStream = response.getOutputStream();
    workbook.write(outputStream);
    outputStream.flush();
}

在这个代码示例中,我们使用了XSSFWorkbook和XSSFSheet来创建Excel文件,并用response.getOutputStream()将其写出到响应流中。另外,为了保证下载的Excel文件正确,我们指定了Content-Type为application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8,并且指定了Content-Disposition并设置文件名为UserList.xlsx。这样就能生成正确的格式的Excel文件,并能成功下载和打开文件。

综上所述,要解决SpringBoot下载Excel文件时出现文件损坏的问题,需要正确设置响应头信息并使用正确的Excel文件格式。