生产环境excel导入必须在read阶段实时字段级校验,epplus配合dataannotations可准确定位行号列名错误;c#无原生easyexcel,误用java api将导致编译或运行异常;重复检查需兼顾excel内及数据库已有数据,空值须统一trim和isnullorwhitespace处理。

Excel 导入时不做数据验证,等于把校验责任甩给用户——错填、空值、超范围、类型混乱,后续全得靠数据库约束或业务层兜底,出问题难定位、改起来费时间。真正在生产环境跑通的导入流程,必须在 Read 阶段就拦截无效数据,且要能准确定位到行号和字段。
用 EPPlus 做导入时的实时字段级校验
EPPlus 是目前 C# 中最主流的无 Office 依赖 Excel 库,适合 Web 和跨平台场景。它的校验不是靠“设置单元格规则”,而是在读取每行后立刻检查对象属性是否合法。
- 必须为实体类字段加
[Required]、[Range(1, 120)]、[RegularExpression(@"^\d{6}$")]等 DataAnnotations 特性 - 读取时用
worksheet.Cells[row, col].Value提取原始值,再手动映射并触发Validator.TryValidateObject() - 不要直接用
LoadFromCollection或AsEnumerable()跳过校验——它们不执行模型验证 - 错误信息需拼接行号(
row)和列名(如"B" + row),否则前端无法高亮报错位置
用 EasyExcel.NET(非 Java EasyExcel)做结构化校验
注意:C# 生态没有官方 EasyExcel,所谓 “EasyExcel for .NET” 多是第三方封装或命名混淆。如果你看到 AnalysisEventListener<t></t>、invoke() 这类写法,基本是误用了 Java 的 API 文档——C# 里不存在这个类。强行套用会导致编译失败或运行时 NullReferenceException。
本文档主要介绍如何通过python对office excel进行读写操作,使用了xlrd、xlwt和xlutils模块。另外还演示了如何通过Tcl tcom包对excel操作。感兴趣的朋友可以过来看看
- 真正可用的轻量替代是
NPOI+ 手动校验逻辑,或用EPPlus自建IExcelDataReader包装器 - 若项目已引入 Java EasyExcel 的 REST 接口做中转,C# 端只需发 HTTP 请求,校验由 Java 层完成,此时 C# 侧只负责解析返回的 JSON 错误列表
- 任何声称 “C# 直接使用 EasyExcel 的 AnalysisEventListener” 的代码示例,都应视为不可信来源
重复数据检查必须分两层做
仅查 Excel 内部重复远远不够。真实业务中,90% 的冲突来自“新数据和已有库记录重复”,比如同一订单号重复导入、同一身份证号多次录入。
- Excel 内部去重:用
DataTable.AsEnumerable().GroupBy(...)按关键列聚合,Where(g => g.Count() > 1)找出重复行号 - 与数据库比对:把待导入的关键字段(如
OrderNo、IDCard)批量提取成数组,用WHERE OrderNo IN (@p1, @p2, ...)一次查库,避免循环查库(2000 行 × 每次 2s = 66 分钟) - 务必在事务外先做查重,确认无冲突后再开启事务插入,否则回滚成本高、锁表时间长
最容易被忽略的是空字符串和 null 的语义差异:Excel 单元格显示为空,但 Cells[r,c].Value 可能是 null、""、" " 或 DBNull.Value。校验前必须统一 Trim + IsNullOrWhiteSpace 判断,否则 [Required] 会漏掉带空格的“假空值”。










