前言

导入导出是企业后台的高频场景。面试常问:

  • Excel 导入怎么校验。
  • 大批量导入怎么防止超时。
  • 导出几十万条数据怎么处理。
  • 导入失败如何回显错误行。
  • 为什么不能直接一次性把所有数据读进内存。

这类题目看的是你对“文件解析、批量处理、事务边界、异步化、错误反馈”的理解。

常见导入导出场景

  • 用户批量导入。
  • 商品批量上架。
  • 组织架构同步。
  • 供应商/客户批量维护。
  • 报表导出。
  • 审批单导出。
flowchart TD
    A[上传 Excel] --> B[格式校验]
    B --> C[业务校验]
    C --> D{是否允许直接入库}
    D -->|是| E[批量写库]
    D -->|否| F[生成错误报告]

导入设计

方案一:同步导入

上传文件后直接解析、校验、入库并返回结果。

优点:

  • 实现简单。
  • 用户等待即可看到结果。

缺点:

  • 容易超时。
  • 文件大时占用线程和内存。

适合:

  • 小文件、低频导入。

方案二:异步导入

上传文件后先保存,再由后台任务解析处理。

优点:

  • 不阻塞请求线程。
  • 适合大批量数据。

缺点:

  • 需要任务状态查询。
  • 错误回显更复杂。

适合:

  • 企业后台常见的大批量导入。

方案三:分段导入

把文件拆成多个批次处理。

优点:

  • 控制单批次事务大小。
  • 失败时更容易重试。

缺点:

  • 实现复杂。

适合:

  • 特别大的数据文件。

导入校验怎么做

校验通常分三层:

  1. 文件级校验。
  2. 表头级校验。
  3. 行级校验。

文件级校验:

  • 文件格式是否正确。
  • 大小是否超过限制。
  • sheet 是否存在。

表头级校验:

  • 表头是否完整。
  • 字段是否和模板一致。
  • 必填列是否缺失。

行级校验:

  • 格式是否正确。
  • 业务值是否合法。
  • 是否重复。
  • 是否引用了不存在的主数据。
flowchart TD
    A[读取文件] --> B[校验模板]
    B --> C[逐行校验]
    C --> D{是否存在错误}
    D -->|是| E[生成错误明细]
    D -->|否| F[批量入库]

错误回显怎么做

企业里用户不接受“导入失败”四个字,他们要知道哪一行错了、错在哪、如何修。

常见做法:

  • 记录行号。
  • 记录字段名。
  • 记录错误原因。
  • 导出错误报告。
  • 保留原始文件。

错误报告可以包括:

  • 第几行。
  • 哪一列。
  • 原始值。
  • 校验失败原因。

批量入库怎么做

方案一:逐条插入

优点:

  • 简单。

缺点:

  • 慢。
  • 事务开销大。

方案二:批量插入

优点:

  • 快。
  • 减少数据库往返。

缺点:

  • 失败定位更难。

方案三:分批批量插入

把数据拆成每 500 或 1000 条一批。

优点:

  • 性能和稳定性平衡较好。

缺点:

  • 需要批次控制和失败恢复。

面试时可以说:

企业里导入通常不会用逐条插入,常见做法是先校验,再分批写库。批次大小要结合数据库压力、JDBC 驱动、事务大小和回滚成本一起调。

导出设计

方案一:一次性导出

适合数据量小。

缺点:

  • 数据大时占内存。
  • 响应慢。

方案二:分页导出

边查边写。

优点:

  • 适合中大数据量。
  • 控制内存。

方案三:异步导出

生成任务 -> 后台导出 -> 文件下载。

优点:

  • 适合几十万条甚至更多。
  • 不阻塞用户请求。

缺点:

  • 需要任务中心。

导出格式怎么选

常见选择:

  • Excel:适合业务人员查看和修改。
  • CSV:更轻量,适合纯数据交换。
  • PDF:适合正式归档。

对比:

格式 优点 缺点
Excel 可视化好 大文件较重
CSV 简单轻量 格式能力弱
PDF 适合打印 不适合二次编辑

大文件怎么处理

重点是避免把整个文件一次性塞进内存。

可用方式:

  • 流式读取。
  • 分批写库。
  • 临时文件落盘。
  • 异步任务队列。
  • 任务进度查询。
flowchart LR
    A[上传文件] --> B[临时落盘]
    B --> C[后台任务解析]
    C --> D[分批入库]
    D --> E[记录进度]
    E --> F[用户查询结果]

权限和审计

导入导出在企业里往往和权限、审计、敏感数据有关。

常见要求:

  • 谁上传了文件。
  • 谁下载了文件。
  • 导出了哪些字段。
  • 是否脱敏。
  • 是否限制下载次数。

常见高频题

为什么不能一次性读入全部 Excel?

因为大文件会占用大量内存,容易 OOM,也会增加 GC 压力。应采用流式解析或分段读取。

导入失败为什么要回显行号?

因为业务用户通常需要自己修数据,行号和字段原因是最直接的定位依据。

导出为什么经常要异步?

因为大数据导出会占用请求线程和数据库资源,异步导出更稳定。

批量导入怎么保证幂等?

可以用唯一约束、业务主键去重、导入批次号、状态表来保证重复上传不会重复入库。

导入校验顺序为什么重要?

先做文件和表头校验可以尽早失败,避免浪费资源;再做业务校验可以给出更明确的错误报告。

总结

导入导出场景的回答主线可以是:

  1. 文件处理要分层校验。
  2. 大批量处理要避免一次性入内存。
  3. 入库要分批,出错要有行号回显。
  4. 导出大数据量优先异步化。
  5. 业务场景里要考虑权限、脱敏、审计和幂等。

真正的企业导入导出不是“把 Excel 读出来写进去”,而是把文件、校验、批处理、任务和用户体验串成一条可维护的流程。