上传 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>
相关推荐
卓怡学长11 小时前
w255基于springboot仓库管理系统
java·数据库·spring boot·spring·intellij-idea
J-Tony1114 小时前
【Redis】 Redis 是单线程还是多线程
服务器·数据库·mysql
这个DBA有点耶14 小时前
SQL调优进阶:从“优化一条SQL”到“优化一个系统”的思维升级
java·大数据·数据库·sql·程序人生·dba·改行学it
IvorySQL14 小时前
PG 日报|SQL/PGQ 图查询基于联接重写机制实现
数据库·人工智能·sql·postgresql·区块链·ivorysql
幸福清风17 小时前
Python 完美处理Excel合并单元格:拆分填充+自动合并
python·excel·合并单元格·拆分单元格
数聚天成DeepSData17 小时前
遥感农业数据集下载全攻略
数据库·人工智能·深度学习·机器学习·自然语言处理·数据挖掘
一勺菠萝丶18 小时前
生产环境平滑升级实战-Nginx维护页数据库迁移与安全回滚
数据库·nginx·安全
心静自然凉80018 小时前
MySQL主从同步配置(一主一从)
数据库
haidy ahmed18 小时前
企微复杂审批流反序列化:动态表单解析引擎与EAV存储模型
数据库·人工智能·自动化·企业微信
Lihua奏18 小时前
MVCC:为什么多人同时读写数据,数据库还能不乱
数据库