Apache POI 实现 Excel 上传解析、导出

1、业务需求接口文档

  1. GET /sys/person/exportExcel:导出居民列表,返回生成文件名;
  2. POST /sys/person/excelUpload:上传 excel 文件 MultipartFile,保存临时文件返回文件名;
  3. POST /sys/person/parsefile:传入上传后的文件名,读取临时 excel,解析每一行居民数据,校验小区是否存在;返回成功或者失败,提示第几行错误。

返回示例:

复制代码
//导入成功
{"msg":"操作成功","code":200,"data":"数据导入成功!","status":"success"}
//导入失败
{"msg":"操作成功","code":200,"data":"第3行小区名称不存在!","status":"fail"}

2、pom 依赖

复制代码
<!-- poi excel -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>

3、接口流程

  1. 前端选择 Excel 文件,调用excelUpload上传,后端保存到服务器临时目录,返回文件名字符串;
  2. 前端拿到文件名,调用parsefile接口传入文件名;
  3. 后端读取临时 Excel 文件,逐行解析居民;
  4. 每行做业务校验(小区名称是否存在、手机号格式);
  5. 校验全部通过批量 insert 数据库;如果某一行校验失败,直接返回提示:第X行小区名称不存在!。

4、文件上传接口 excelUpload

复制代码
@PostMapping("/excelUpload")
public Result excelUpload(@RequestParam("file") MultipartFile file){
    //生成唯一uuid文件名,保留后缀
    String suffix = FilenameUtils.getExtension(file.getOriginalFilename());
    String fileName = UUID.randomUUID().toString().replace("-","")+"."+suffix;
    //临时目录
    File tempDir = new File("./tempExcel/");
    if(!tempDir.exists()) tempDir.mkdirs();
    File saveFile = new File(tempDir,fileName);
    file.transferTo(saveFile);
    return Result.success(fileName);
}

5、解析 Excel 工具方法

复制代码
/**
 * 读取excel,返回居民list,返回错误行号信息
 */
public ResultDTO<List<PersonImportDTO>> readExcel(String fileName){
    File file = new File("./tempExcel/"+fileName);
    Workbook workbook = WorkbookFactory.create(file);
    Sheet sheet = workbook.getSheetAt(0);
    List<PersonImportDTO> list = new ArrayList<>();
    //第0行为表头,从第1行开始读数据
    for(int i=1;i<=sheet.getLastRowNum();i++){
        Row row = sheet.getRow(i);
        if(row == null) continue;
        PersonImportDTO dto = new PersonImportDTO();
        dto.setCommunityName(row.getCell(0).getStringCellValue());
        dto.setUserName(row.getCell(1).getStringCellValue());
        dto.setMobile(row.getCell(2).getStringCellValue());
        //业务校验小区是否存在
        Community community = communityMapper.selectByName(dto.getCommunityName());
        if(community == null){
            return ResultDTO.fail("第"+(i+1)+"行小区名称不存在!");
        }
        dto.setCommunityId(community.getCommunityId());
        list.add(dto);
    }
    workbook.close();
    return ResultDTO.success(list);
}

6、parsefile 解析文件接口

复制代码
@PostMapping("/parsefile")
public Result parseFile(@RequestBody String fileName){
    ResultDTO<List<PersonImportDTO>> readResult = excelUtil.readExcel(fileName);
    if(!readResult.isSuccess()){
        return Result.fail(readResult.getMsg(),"fail");
    }
    List<PersonImportDTO> dataList = readResult.getData();
    //批量插入数据库
    personService.batchSave(dataList);
    //可选:解析完成删除临时excel文件
    return Result.success("数据导入成功!","success");
}

7、导出接口 /exportExcel

查询居民分页列表,写入 Excel,保存文件返回文件名。

8、踩坑总结

  1. HSSFWorkbook(xls)、XSSFWorkbook(xlsx),推荐使用WorkbookFactory.create(file)自动适配;
  2. 大文件(上万行)使用 SXSSFWorkbook,避免 OOM 内存溢出;
  3. MultipartFile 大小限制,修改 yml spring.servlet.multipart 配置;
  4. 临时文件需要定时清理,防止磁盘占满;
  5. cell 获取数据,数字单元格 getStringCellValue () 会抛异常,需要统一工具转换单元格值;
  6. 导入事务:只要任意一行校验失败,整体不插入数据库;全部校验通过再批量保存。
相关推荐
nvd1118 小时前
深入剖析:GCP Pub/Sub 与 Apache Kafka 对消息处理延迟与消费者卡死的处理机制异同
分布式·kafka·apache
白帽攻防录1 天前
SRC 挖洞:Apache APISIX 非规范路径授权绕过深度复盘,CVE-2026-94269 怎么绕过网关访问后端
网络安全·apache·src漏洞挖掘
Knight_AL2 天前
从 EasyExcel 到 Apache Fesod:Java Excel 处理生态的一次重构
java·apache·excel
心易行者3 天前
Agent应用+API端点商业化进阶实战:从单体智能体到可付费调用的API全流程
运维·服务器·人工智能·python·apache
文慧的科技江湖8 天前
2026年10月4日充电桩行业晚报:当“只充80%“成为通行规则,行业开始管单车占桩时长 | 慧知开源充电桩平台
开源·apache·新能源·虚拟电厂·充电桩·ocpp·v2g
nvd1110 天前
# 从 192 秒到 13 秒:Apache Flink 批处理极速调优实战记录
大数据·flink·apache
众链网络11 天前
景区票务系统选型的技术尽调清单:从并发、数据到二次开发的 12 个必查项
apache·景区票务系统
AllData公司负责人12 天前
AllData数据中台物联网实时平台|集成 Apache StreamPipes,MQTT工业物联网数据实时预警实践案例
大数据·数据库·人工智能·物联网·apache·工业物联网·streampipes
小鲨鱼-LFSJXY13 天前
【数据分享】2026年全国1km分辨率39类体育休闲服务设施空间分布栅格数据
poi·数据分享·立方数据学社·体育休闲服务设施