上传 Excel 文件进行数据库比对--增加导出功能

一、确认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>
相关推荐
amao99881 天前
数据库原理与技术 - 3-7 视图和索引 View& Index
数据库·sql·oracle
酸菜牛肉汤面1 天前
30、大表数据查询,怎么优化
数据库
KG_LLM图谱增强大模型1 天前
企业级实用本体论的实践指南(2/4):Palantir Foundry如何将组织数据映射到本体概念及关键设计考量
数据库·人工智能
陌路201 天前
redis智能缓存策略--思想
数据库·redis·缓存
计算机毕设VX:Fegn08951 天前
计算机毕业设计|基于springboot + vue出行旅游安排系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·课程设计
一只大黄猫1 天前
【数据库-入门3】基本概念
数据库
@海~涛1 天前
AOSP源码下载与编译
android·数据库·缓存·安卓·安全架构
五阿哥永琪1 天前
MySQL 如何定位&分析慢查询?
android·数据库·mysql
柒.梧.1 天前
从原理到实战:Spring AOP全解析
数据库·sql