一、确认pom.xml中存在poi依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.5</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.5</version>
</dependency>
二、在FileController中增加导出方法
@GetMapping("/export-results")
public ResponseEntity<byte[]> exportResultsToExcel(HttpSession session) {
try {
// ✅ 改为 UserInfo
@SuppressWarnings("unchecked")
List<UserInfo> results = (List<UserInfo>) session.getAttribute("matchResults");
if (results == null || results.isEmpty()) {
return ResponseEntity.notFound().build();
}
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("身份证比对结果");
Row header = sheet.createRow(0);
header.createCell(0).setCellValue("ID");
header.createCell(1).setCellValue("姓名");
header.createCell(2).setCellValue("身份证号码");
for (int i = 0; i < results.size(); i++) {
UserInfo user = results.get(i); // ← 这里是 UserInfo
Row row = sheet.createRow(i + 1);
row.createCell(0).setCellValue(user.getId() != null ? user.getId() : 0L);
row.createCell(1).setCellValue(user.getName() != null ? user.getName() : "");
row.createCell(2).setCellValue(user.getIdCard() != null ? user.getIdCard() : "");
}
sheet.autoSizeColumn(0);
sheet.autoSizeColumn(1);
sheet.autoSizeColumn(2);
ByteArrayOutputStream out = new ByteArrayOutputStream();
workbook.write(out);
workbook.close();
String timestamp = java.time.LocalDateTime.now()
.format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss"));
String filename = "身份证比对结果_" + timestamp + ".xlsx";
String encodedFilename = java.net.URLEncoder.encode(filename, "UTF-8")
.replaceAll("\\+", "%20");
return ResponseEntity.ok()
.header(org.springframework.http.HttpHeaders.CONTENT_DISPOSITION,
"attachment; filename=\"" + encodedFilename + "\"; filename*=UTF-8''" + encodedFilename)
.header(org.springframework.http.HttpHeaders.CONTENT_TYPE,
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
.body(out.toByteArray());
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
}
三、在你原来的 /upload POST 处理方法中,将 results 存入 session
@PostMapping("/upload")
public String handleUpload(@RequestParam("file") MultipartFile file,
Model model,
HttpSession session) { // <-- 添加 HttpSession 参数
// 清除之前的结果(可选,但推荐)
session.removeAttribute("matchResults");
if (file.isEmpty()) {
model.addAttribute("error", "请选择一个 Excel 文件");
return "upload";
}
try {
List<UserInfo> matchedUsers = excelService.processExcel(file);
// ✅ 将结果保存到 session,供导出使用
session.setAttribute("matchResults", matchedUsers);
model.addAttribute("results", matchedUsers);
model.addAttribute("count", matchedUsers.size());
} catch (IOException e) {
model.addAttribute("error", "文件读取失败:" + e.getMessage());
} catch (IllegalArgumentException e) {
model.addAttribute("error", "Excel 格式错误:" + e.getMessage());
}
return "upload";
}
四、清除 session
@GetMapping("/clear")
public String clearSession(HttpSession session) {
session.removeAttribute("matchResults");
return "redirect:/upload";
}
五、在 HTML 页面添加"导出 Excel"按钮,清空按钮方法修改为/clear
<!-- 清空按钮 -->
<div class="actions">
<button type="button" onclick="window.location.href='/clear'">清空记录</button>
</div>
<!-- 导出按钮 -->
<button type="button" onclick="window.location.href='/export-results'"
style="margin-left: 10px; background-color: #4CAF50; color: white;">
📥 导出 Excel
</button>