上传 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>
相关推荐
while(1){yan}1 天前
Spring事务
java·数据库·spring boot·后端·java-ee·mybatis
盛世宏博北京1 天前
高效环境管控:楼宇机房以太网温湿度精准监测系统方案
开发语言·数据库·php·以太网温湿度变送器
运维行者_1 天前
2026 技术升级,OpManager 新增 AI 网络拓扑与带宽预测功能
运维·网络·数据库·人工智能·安全·web安全·自动化
gfdhy1 天前
【C++实战】多态版商品库存管理系统:从设计到实现,吃透面向对象核心
开发语言·数据库·c++·microsoft·毕业设计·毕设
Elastic 中国社区官方博客1 天前
Elasticsearch:上下文工程 vs. 提示词工程
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
小唐同学爱学习1 天前
如何解决海量数据存储
java·数据库·spring boot·mysql
wWYy.1 天前
详解redis(15):缓存雪崩
数据库·redis·缓存
zzcufo1 天前
多邻国第五阶段第13部分
java·开发语言·数据库
这周也會开心1 天前
Redis相关知识点
数据库·redis·缓存
小白爱运维1 天前
MySQL升级8.0.44后登录报错-系统表不支持'MyISAM'存储引擎
数据库·mysql