当使用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文件格式。