“无论你是在搭人事系统、库存平台,还是做财务报表,迟早有一天,用户会把Excel文件扔进来,然后说:帮我把这些数据处理一下。”这个需求几乎贯穿所有企业级应用的开发周期。表面上看,读个表格不就上传、打开工作簿、逐行读出内容吗?真上手了才发现,校验规则、缺失值处理、字段映射,每一个环节都能让代码量翻倍,还得防着用户传了个合并单元格的文件。
今天我们以员工信息导入为例,把ASP.NET Core里从零搭建Excel导入功能的完整链路走一遍,顺便看看怎么避免那些让人头疼的坑。
核心流程其实就六步,哪个Excel库都逃不开:
1. 接收上传文件
2. 打开工作簿
3. 定位到目标工作表
4. 按行读取
5. 抽取单元格值
6. 映射成业务对象
这套动作就像工厂流水线,文件进去,对象出来,中间每一步都可以插入清洗和校验逻辑。
这次我们选Spire.XLS for .NET来操作Excel,主要原因是对C#的API封装得很直接,读数据、建工作簿、调格式、转换文档这些常见操作都有现成方法,省掉大量造轮子的时间。当然,如果放在生产环境里选型,还得结合授权方式、功能完整度、运行时性能以及部署目标来看。不过无论以后换成EPPlus、ClosedXML还是Open XML SDK,文件导入的底层思维是完全相通的,学会一个,其他都能快速上手。
第一步,让用户把Excel文件传上来。ASP.NET Core用IFormFile接口来承接HTTP请求里带着的文件流,几行代码就能搭出接收端点。判断文件是否为空、长度是否为零,先做最基础的防御,避免后续解析直接崩掉。伪逻辑如下:如果文件不存在或长度为0,立刻返回400并提示上传有效文件;否则,进入后续处理。这里特别提醒,别在生产代码里只判断长度,最好加上Content-Type校验,防止用户把一份改了后缀名的文本文件当Excel传上来。
文件到手后,用Spire.XLS打开工作簿,选取第一个工作表,然后通过行列索引循环读取单元格值。每一行对应一个员工对象,把姓名、部门、入职日期等字段一一赋值。读取时,单元格可能是空字符串、数字或日期格式,统一做ToString()转换容易损失精度,建议针对每列预先约定数据类型并尝试解析,解析失败的行丢到错误队列里,最后统一返回导入结果报告。这样既不会因为一行脏数据中断整个导入,也方便用户定位问题。
走完这一趟,你拿到的就不只是一堆单元格坐标,而是一批可以直接被业务层使用的C#对象。之后无论是落库、送进消息队列还是触发下游计算,都随你。整个流程没有复杂的设计模式,全是工程中实打实要解决的问题:文件校验、异常处理、数据映射。这大概就是为什么Excel导入功能看似基础,却总能成为新人接手项目时第一个要重构的模块吧。
热门跟贴