B端产品设计必看,Excel批量导入的知识点讲解(上篇)
背景
上周五的时候,深夜在搞一个Excel批量导入的需求,然后突然意识到这个导入需求不是那么简单的,甚至可以说任何一个导入需求如果要做到比较完善其实都不简单。
然后突然就有了灵感,我把之前做过的一些导入的需求大概看了一下,然后整理了一些我对Excel批量导入这一块的理解,把一些可能容易被忽视的知识点给大家拆解一下。一方面是对我自己过往知识做一个总结,另一方面也是把这个东西做成一个“组件化方案”,后续在其他场景要用的时候,直接拿来用就好了,最后也可以把这个东西分享给大家,让大家也能做到开箱即用。
本文我打算拆成上下篇来讲,上篇是讲Excel导入的一些校验逻辑和补充知识,下篇再来讲怎么设计Excel的导入模板,怎么做一些好的交互体验。
导入的几个步骤
一般来说,B端产品的Excel的导入处理逻辑,可以拆解出这么几个步骤:
- 上传Excel模板,解析模板文件;
- 校验模板文件中的字段,确认数据合法合规;
- 执行业务逻辑,一系列逻辑处理;
- 插入数据库表中,导入完成;
导入时的几个核心点
既然有4个核心的步骤,那么也意味着这4个步骤都有可能会出错,我们可以对这4步分别梳理,确认一些比较常见的异常场景,然后给出对应的解决方案。
1. 上传并解析模板
- 模板文件格式不对,例如只支持.xlsx,但是上传了.pdf,就会报错;
- 模板文件体积太大,例如仅支持上传5MB以内的文件,但是上传了一个10MB的文件就会报错;
- 模板无法解析,由于一些Excel会加密,空白或者是已损坏无法打开,导致文件解析失败;
- 模板数据量太大,例如只支持一次导入5000行数据,如果超过就会报错或者只取前5000条;
- 模板格式错误,例如修改了模板的一些表头或者是列,导致无法解析匹配也会报错;
2. 校验模板文件中的字段
- 字段校验失败,例如字符长度,字符为空,字符格式,字符校验规则不通过等,就会报错;
- 字段重复,例如第一行和第二行的内容重复了或者大多数重复,就会报错(视业务规则而定);
- 字段之间的逻辑关系不对,例如填了A字段,那么B字段就必须存在等,这些字段之间存在预设的某些逻辑关系,可以在校验模板文件中的字段这个阶段去做对应的判断,也可以放在业务逻辑层的时候去判断:例如结束时间必须要大于开始时间,A列的值必须要小于B列的值等;
3. 执行业务逻辑
- 导入的字段在系统中不存在,例如导入SKU库存,但是系统中不存在该SKU,就会报错;
- 导入的数据和要更新的数据不匹配,例如导入了订单的3条明细,但是订单实际只有2条明细,就会报错;
- 用导入的数据去执行一些业务逻辑失败,例如批量更新单据的状态,但是单据是不可更新的状态,就会报错;
- 还有其他一系列和业务逻辑相关的判断,都会在这一层做处理;
4.插入数据库表中的时候
- 数据写入失败,由于超时或者程序错误,则导致报错;
- 数据重复导致插入失败,也会报错;
- 还有一些其他的程序异常的场景,都会报错;
导入的一些补充知识
1. 导入是部分成功还是全部成功?
在Excel导入的时候,数据量可能会比较多,如果1000条数据只要有1条失败,那么这1000条都不允许导入,那这种就是属于“全部成功”的逻辑,即要求全部成功才可以正常导入。如果1000条数据有1条失败,但是999条可以导入,那么这种就是属于“部分成功”的逻辑,总体来说,导入支持部分成功、部分失败,对用户的体验来说会好很多。
如果是“全部成功”的模式,那么最好也是能将Excel所有的行数据处理完,然后将失败了的信息单独列出来,方便用户定位问题,修改模板。这里还需要注意一下,最好避免“挤牙膏式”的报错。如果某一行有多个错误,那么直接将所有的错误都呈现出来,不要一次只报一个错,然后客户反复修改,造成不好的体验。
如果是“部分成功”的模式,那么导入之后会直接告诉导入的结果,成功了XX条,失败了XX条,还可以单独下载失败的内容。
2. 同步导入还是异步导入?
同步导入,就是在导入Excel的时候页面一直在处理中,需要等待导入完成之后才可以进行其他操作。
异步导入,就是导入Excel的任务提交之后,会在后台运行导入的任务。这个时候用户可以进行其他操作,等到导入任务处理完成之后再通过站内消息来通知处理。
如果Excel数据量很大,业务逻辑比较复杂,耗费时间的导入,那么建议使用异步导入;如果是小数据量,导入逻辑不复杂,速度也很快的,那么就使用同步导入即可。
同样的道理,针对导出(下载),也可以使用一样的逻辑去处理。
3.是导入覆盖,还是更新?
这个是属于业务层的判断了,导入覆盖的意思就是导入的数据直接覆盖已有的数据,直接简单粗暴。
导入更新则是每条导入的数据都要和已有的历史数据进行比较,如果有相同的就更新,没有就插入。
具体自己看业务场景来取舍,一般来说导入更新的场景比较多,直接覆盖的比较少。
4.按表头名称还是表头坐标来匹配
Excel是一个二维表,有X轴和Y轴,也就是行和列。每一列是从A开始一直到Z,然后AA到AZ这样的顺序;每一行则是从1开始一直递增。A1是一个坐标,表示第一行第一列;B3表示第二列第三行……
按表头名称匹配,就是预设的Excel模板,先解析出第一行表头的字段,然后用表头字段和系统的字段进行完全匹配,如果匹配上了,那么这一列就是特指某个字段了。表头的字段往往是第一行,可以理解为一个Key,第二行开始就是Value了。
按表头坐标来匹配,就是不一定把第一行当做表头的Key,而是通过坐标来确定这个表头的Key是什么。例如第一行可以写一堆填表须知,然后第二行才是真正的表头,第三行开始才是Value值。那么A2 B2 C2就是表头字段,A3 B3 C3往下的就是具体的值了。
5.固定模板导入和解析模板导入
固定模板导入,就是我提前预设好对应的Excel模板,然后用户根据我的Excel模板来填写对应的字段,然后导入的时候按字段的名称去匹配或者按字段所在的坐标(A1:B1:C2)去匹配相应的数据,这种方式的大前提就是用户不能修改模板的顺序或者模板的字段名称等。也是最常用的一种导入的设计方案。
解析模板导入,就是我根据你自定义的模板导入,然后我把你的列都解析出来,然后将你Excel的列和系统中存在的字段进行手动的匹配,匹配之后就可以保存为一个解析模板。后续再导入类似结构的Excel的时候就可以直接用这个模板去解析了。比较适合那种数据来源比较多,Excel模板有很多种多样的场景。
一些参考资料
最后分享一些不错的Excel导入设计的竞品,如果你想在这方面找一些优秀案例学习一下,那么可以看看下面的几个竞品:
- https://hc.huoban.com/tables/8a9a/974b
- https://qingflow.com/help/docs/6114c2ced601550046421d83
- https://hc.jiandaoyun.com/doc/9084
总结
今天在收集Excel导入相关的知识的时候,我突然脑海中蹦出来了这么一个词:叫作“组件化竞品”或者“竞品组件化”,可以简称为“组件化产品方案”。
怎么理解这个词呢?
首先,什么是组件化?我们可以简单地把组件理解为完成某些特定功能的模板,例如Axure中的母版或者前端框架中的组件。
它的特点是:聚焦于某个小的场景,解决某个小的需求,而且和复杂的实际业务本身没有太多耦合性。例如前端的一些输入组件,图片上传组件,还有产品的一些Axure组件等。
那么,我们在再来看一下什么是竞品,竞品这个词产品经理们肯定是不陌生的。简单理解就是同行,相同的竞争者,我们都需要做相似的事情。很多时候我们关注的都是直接竞品,即做的业务和方向和我们很相似,系统方案上也大同小异的。但是除了直接竞品之外,我们还有很多时候会需要借鉴间接竞品或者非竞品的一些产品设计,例如一些大厂的交互设计,业务逻辑设计等。
这两者一组合,就得出来了我想要表达的:通过一些组件来启发自己找一些竞品来参考学习,设计能提升自己工作效率的组件化方案。
在日常工作中,我们能或多或少会做很多重复的事情,这些重复可能是重复自己,可能是重复别人,可能是重复之前的公司等,总之就是有很多事情的解决方案其实是可以拿来即用的。
例如,登录注册相关的业务,基本上都大同小异,我在A公司做过一次,那么我在B公司的时候也需要做一遍,那我直接拿A公司的方案是最快的。同样的道理,Excel的导入和导出方案也是属于一次整理输出之后,后续就可以直接复用,只需要做很小范围的改动。
Excel的导入和导出,这种设计方案是从多个竞品系统,甚至都可以不是竞品的系统上拿来借鉴使用,这就是“组件化竞品”的意思。
花时间把日常的工作中可以抽出来作为“组件”的内容整理一下,然后分别找时间去查阅相关的优秀的解决方案(竞品),然后把它整理成一套可复用的“组件化竞品”,后续要用的时候就可以做到开箱即用。
这件事情,我大约是在1年前意识到,然后半年前开始践行的,所以大家会发现我的语雀知识库有很多经验的总结,其实就是“组件化竞品”的缩影。
希望上面的一些思考,会对你有帮助