最近在内部系统开发一个 Excel 导入的功能,用于给公司内部的运营人员导入历史数据,因为这个功能的使用频率不高,历史数据导完就不需要用了,领导决定用存储过程来处理,具体步骤就是先把 Excel 导入到一张临时表中,再在存储过程中将其保存的对应的表里。
产品跟运营人员确定好导入的模板之后,我就开干了,昨天提供了第一批 Excel 数据,这个时候问题来了:
1 、运营提供的 Excel 数据比模板多了一列,比如原本模板中是 ABCDE 五列,结果他们在中间插了一列,变成 ABCFDE
2 、运营提供的 Excel 数据的列的顺序跟模板的不一致,比如原本模板中的顺序是 ABCDE ,他们把顺序变成了 ACBED ;
3 、有些列是下拉选择的,运营提供的 Excel 数据中部分下拉的值跟模板不一致,比如模板中有个下拉值是“身份证”,运营给改成了“个人身份证”;
想想连公司内部人员都这样,普通用户估计更“白痴”了。
1
miaotaizi 2022-11-11 16:48:10 +08:00
那是你的使命
|
2
proxychains 2022-11-11 16:52:20 +08:00 37
IBM 的笔记本 CD 支架刚开始被很多用户当作咖啡杯支架用.
|
3
killmojo 2022-11-11 16:52:50 +08:00 3
你永远想不到用户有多神奇,为了不让用户修改格式,光填那几个单元格就可以,保护了工作表,设置了密码。
结果用户提交一个全新的文件,还嫌弃你保护文件,说“他还百度了怎么破解密码,最后没办法重新做了一个”。 最后实在没辙,弄在线 Excel ,在线填了直接保存。 |
4
edis0n0 2022-11-11 16:54:05 +08:00 1
@proxychains #2 这个也不是不可以,至少利用上了 lmao
|
5
aweffr28 2022-11-11 16:55:05 +08:00
我也有过类似的额需求,我选择用 python 做,python 处理字符串,写这种接近一次性代码比较方便= =
运营,HR ,行政之类的导入都接过,我只能说能按模板填直接导入不出错的真不多 |
6
preach 2022-11-11 16:55:09 +08:00
不管是产品(广义上的产品)还是开发都需要看看 “防呆” 这个关键词
|
7
seers 2022-11-11 16:56:56 +08:00 via Android
不要相信你的用户,处理 Excel 只取列头判断,所以多了少了无所谓,顺序更无所谓
|
8
aw2350 2022-11-11 16:57:02 +08:00 14
你不能用你自己的定视思维去理解用户,你自己做开发,你是知道这里面的逻辑,人家怎么知道列对应列?
万一人家以前用过列名匹配表列名的,哪怕调换 excel 的列顺序,人家一样可以成功导入 当你有问题打电话去咨询一些市政问题,或者淘宝客服,你信不信对面的人内心也会骂你 s13? |
9
leavic 2022-11-11 16:57:17 +08:00 8
如果你的程序只能处理固定格式的数据,多一列、换个顺序、差几个字都能崩掉,那这样的程序到底有什么用?
|
10
aw2350 2022-11-11 16:59:46 +08:00 1
人最愚蠢的行为,莫不是以为自己最通透的,别人都是白痴
|
13
aw2350 2022-11-11 17:04:23 +08:00
我理解的,这是一个很简单的程序,且用完就废弃,但是这种“简单”是建立在一种共识,一种约定之上的
起码你先和别人约定好种种规则,字段顺序 ,内容格式 等等等 往往,这种“简单”需要时间去达成上述的共识 |
14
buyan3303 2022-11-11 17:07:39 +08:00
原先我想要从自己公司里的数据库里导出数据,到自己本地搭建的 mysql ,
但是其 ERP 中的产品型号有: Z540Y-150LB DN50|A216 WCB Z540Y-150LB 2" WCB ZA540Y-150(lb) 2"|A216 WCB ZA540Y/13Cr-150(lb) 2"|A216 WCB 闸阀 ZA540Y/13Cr-150(lb) 2"|A216 WCB 等多种非同一型号 这个是因为当时 ERP 设计初期,就没考虑过数据统一,且公司后续又更迭了几次型号编制导致的。 技术渣,用 python 写了一个非函数式的程序,后面直接不想写了。 |
15
itechnology OP @leavic 看我描述的内容,我是通过在数据库处理的,用 MySQL 的“LOAD DATA LOCAL INFILE”来导入临时表,这就意味着提供的 Excel 的列顺序必须与模板保持一致,否则数据就会错乱。因为这个是一次性的功能,领导觉得没必要在代码中专门写一个功能去处理。
|
16
itechnology OP @aw2350 各种规则、字段顺序和内容格式都已经由产品跟运营约定好了,但问题是运营不严格按照这个来。
|
17
tool2d 2022-11-11 17:11:07 +08:00 1
你发个贴的时间,表头兼容的代码都写完了。
|
18
krixaar 2022-11-11 17:14:26 +08:00 1
责任转嫁啊,提供一个模板,随便简单写个导入页面,不按模板填导不进去,多加几个判断就行。数据填错了最终报表数据不对?怪我咯你自己导的。
|
19
aw2350 2022-11-11 17:14:32 +08:00
@itechnology 加一个下载链接,下载模板用的,进入页面之前提示,只能用本页面提供的模板,其他的导入无效!
|
20
dudubaba 2022-11-11 17:15:22 +08:00
有界面吗?有界面的话可以给前端做,处理好数据再导入后端,什么格式错误啊数据错误啊通通报错,然后再给个链接放下载模版,然后他们失败了肯定老老实实改了(异常是前端兄弟们可能会被骂。。。)
|
21
iold 2022-11-11 17:15:35 +08:00 6
我遇见最离谱的是,客户下载的模板是 Excel ,上传的时候她传个 Word 。
|
22
edinina 2022-11-11 17:15:39 +08:00 via iPhone
有没有一种可能是你开发的时候要让产品尽量易用到任何人上手就可以使用的程度,而不是因为用户白痴
|
23
itechnology OP @dudubaba 没有界面,纯数据库处理
|
24
lovepplforever 2022-11-11 17:19:32 +08:00 via iPhone
强类型和编译器报警不也是为了防止程序员犯傻吗?谁没有傻过
|
25
singerll 2022-11-11 17:20:12 +08:00
这个问题太正常了,因为你提供的模版虽然是合理的,但业务人员在收集数据时,需要从提供数据中筛选出来你需要的数据,但筛选又太麻烦,格式错的,内容错的,还需要再整理,这些工作占用了绝大多数的时间,到最后一步导入了,肯定是收集成啥就是直接提交啥。
|
26
fournoas 2022-11-11 17:27:02 +08:00
@itechnology #16 约定归约定,容错还是要写的,至少要返回明确的错误信息
|
27
tianyou666shen 2022-11-11 17:29:43 +08:00
严格点判断呗 遇到格式不对的直接打回
不要期望对方一定会严格遵守格式上传 |
28
sardina 2022-11-11 17:32:46 +08:00 via iPhone
按照列名进行解析
|
29
dcsuibian 2022-11-11 17:35:47 +08:00
遇到过这种问题。一会儿是多了一张表,一会儿是自己少了一行,一会儿又哪里没填。
而且同一个 Excel ,表与表之间的格式不统一(内容相同),这一次和上一次的又不统一,而且这个格式还是他们定的。 |
30
1423 2022-11-11 17:50:52 +08:00
定位问题
你没把自己定位成给制作给“人”用的软件。而是给其他专家做软件。 你没把自己的作品定位成人类易用的软件,而是专家需要学习使用的软件。 至于应当如何定位,如果你说了算,你来定,否则让领导去定位 |
31
cpstar 2022-11-11 18:01:15 +08:00
你永远无法知道用户是拿哪根脚趾头想问题,并且干活的。
做了一个表,姓名那一列,填的五花八门,什么张空格三就不说了,还有叫“1 、张三”之类的,甚至还有“1 、张三、11010119491001001X”的。 |
32
stevenbipt 2022-11-11 18:21:50 +08:00
做多了以后最大的感受是要做好严格的数据校验以及处理好那些经常搞的骚操作
|
33
acctv2 2022-11-11 19:02:22 +08:00
我觉得就算要别人适配你的要求来导入,也肯定要写好校验代码,然后返回错误提示,这是最基本的。
|
34
thtznet 2022-11-11 19:08:07 +08:00 1
不写文档不做培训没有 SOP ,就不要觉得用户是白痴,是实施团队工作没做好。
|
35
kwh 2022-11-11 19:22:09 +08:00
。。。
我真的发现,现实生活中有的人真的是 智力偏低,百思不得其解。 大学打荒野行动,当时寝室有四个人,其中一个人 A 说正东方向有一个人, 然后 B ,就直接去看正东方向(问题很大,平行线不相交),试图去找到那个人, 由于这个 B ,我平时就感觉他智力偏低(平时也很自信),但是我不认为真有人智力偏低,所以我指出了问题 想要确认他是不是真的智力偏低。 然而寝室四个人,对于平行线不相交,有两个反应不过来,还跟我辩论的好一阵,不过其中一个后面反应过来了,大方承认了,另一个在这辩论中渐渐不说话了,估计认识到了错误,又好面子。 ,但是还有一个人也就是 B 到最后理解不了,我把高中 那些什么极值思维,都说了,草图也画了,但是最后 B 的结论就是,不知道,不明白,不觉得。 这件事给了我很大的震撼,是划水上大学为数不多的收获之一,让我明白了有的人真的是智力缺陷。 |
36
Kiriya 2022-11-11 19:24:52 +08:00
你以为的用法和用户以为的用法区别
https://www.bilibili.com/video/BV19S4y1b7JG |
37
adoal 2022-11-11 20:14:26 +08:00
需要符合规范的数据来源时,只要允许用户自由输入,就一定有(大量)用户自然而然地不按规范操作。
要么事后做数据清洗,要么开发有限制的输入界面。 |
38
adoal 2022-11-11 20:14:45 +08:00 1
不怕用户智商低,只怕用户自作聪明。
|
40
kwh 2022-11-11 20:38:19 +08:00
@teenight A 点正东方有一个人,B 点看正东方,视线是平行的也就看不到同一点了,所以看之前需要确认下队友的位置,进行一定程度的偏移。
|
41
eason1874 2022-11-11 20:44:58 +08:00
想到那个笑话。程序员开了一个酒吧,考虑了各种异常情况,比如一次买 0.5 杯酒,买 9999 杯酒,买 eval(code)酒,买红酒给啤酒钱,买啤酒不给钱,开着坦克来买酒,进门一把火把酒吧给烧了。各种恶意 test 都完美通过,程序员满意地开张了,结果当天酒吧还是崩溃了,因为客人点了一份炒饭
|
42
nebkad 2022-11-11 20:56:51 +08:00
难道这不是因为 excel 对于这个应用场合过于庞大沉重,才导致的问题么?
换个角度来想,这不是用户的问题,而是微软的问题或者说是微软过于垄断的问题。 |
43
jousca 2022-11-11 20:56:53 +08:00
@teenight A 和 B 不在相同位置…… A 发现目标的正东方向,并不在 B 的正东……
就好比我在四川.你在北京,我往东是重庆市,你往东能到重庆么? |
44
kongkongye 2022-11-11 21:39:47 +08:00 via iPhone
让运营自己学习 python 提高生产力
|
45
keith1126 2022-11-11 21:47:19 +08:00
|
46
kwh 2022-11-11 21:57:15 +08:00
@keith1126 当时寝室 4 个人,一个提问题的我,两个反应不过来的,一个最后都讲不明白的。有什么算数问题吗 。。。。。。。。。
|
49
Hurriance 2022-11-11 22:30:23 +08:00
为什么后续运营提供的模版跟一开始产品提供的是不一致的,好像需求都没有明确,应该需要产品提供更多的细节吧。
|
50
sevenyangcc 2022-11-11 22:49:44 +08:00
如果不是历史表格导入,还不如前端写个页面让他们一条条填
|
51
PeacePeach 2022-11-11 23:02:58 +08:00
根据列名来,但架不住用户给你把列名都改了。
|
52
wenzhoou 2022-11-11 23:06:33 +08:00 via Android
所以我们打游戏的时候说 5 点方向的敌人,那都是地图坐标系的。你首先得要有个坐标系。
|
53
wangxiaoaer 2022-11-11 23:48:16 +08:00
楼上有些认为是程序不健壮导致的也是醉了。
多次提交、格式不对还能理解,但是你把行列调换、文件调换这种操作不是明显破坏规则的吗?说白了还是素质问题(非贬义),不要一味的责怪程序,否则为了兼容这些所谓的破坏性要产生多少原本无意义的代码,浪费多少时间?边界再宽的兼容都是有限的,今天 v 站不是有个帖子,统计姓司的人数吗,假设这个人员表格有两列,姓、名各站一列,让用户填报,有些大聪明嫌麻烦把两列合起来,你说程序要怎么兼容? |
54
levelworm 2022-11-12 05:33:16 +08:00 via Android
这个是需求不清楚,最好是先写需求文档然后请用户过会。之后改变需求就不是你的责任了。
|
55
levelworm 2022-11-12 05:34:42 +08:00 via Android
@itechnology 那就没办法了,反正不是你们的责任就行了。
|
56
iam174cm 2022-11-12 07:08:31 +08:00
建议搜索“知识的诅咒”,人总是会假定对方拥有和自己一样的知识,然后开始采取行动,教育在这方面就是一直在避免这个行为来传播知识,例如总有鸡娃鸡得自己急哭的父母就是很好的例子,当然不排除有些情况对方就是智商低下。最好的办法只能是直接写好规则,规则外的提交全部拒绝并返回提醒对方填错并认真看规则,只要你不急,急得就是对方
|
57
jydeng 2022-11-12 08:00:36 +08:00
我猜这个功能没有测试就上线了。
|
58
crazyweeds 2022-11-12 08:32:16 +08:00
所以说,没有表头验证以及数据规则验证吧。。。作为开发,我觉得你也有责任。开发的第一任务就是把用户当作一个系统破坏者,理论包括所有数据入口都应该考虑。
|
59
darrenfang 2022-11-12 09:20:45 +08:00
系统提示密码已过期,需要重新修改密码,用户还会问怎么不能使用。
|
60
QKgf555H87Fp0cth 2022-11-12 09:36:47 +08:00
表头而已啊,想想数据吧,搞死你,数据内容也要判断吧
|
61
Jessun 2022-11-12 09:51:13 +08:00
1. 程序逻辑上对表格有检查,告诉用户哪里格式不对
2. 文档写好,告诉别人说,就按照文档的格式来,其余格式一律不管。 |
62
abuabu 2022-11-12 09:56:01 +08:00
难道你这么自信,自己不是别人的用户?
|
64
hahaayaoyaoyao 2022-11-12 09:58:43 +08:00
@kwh 可能你们不在同一个宇宙或说的不是一个几何学 [表情]
|
65
morgan1freeman 2022-11-12 10:43:38 +08:00
很正常,所以 excel 导入这种 一般都是坑,你把模板 丢给 运营或者用的人来填,都会有各种意外的填写,程序再怎么健壮,都没办法预测到所有的情况,因为编写程序的都是人,执行程序的也不是一台高智能机器,所以不可能覆盖到所有情况,,而且说白了 60%以上的代码分支 本身就没什么用,都是为了防止使用者犯傻,
|
66
iAIR 2022-11-12 10:48:22 +08:00 via Android
根据列头来导入表列,而不是根据列顺序导入,这应该是最基本的设计。
你所用的导入方法只适合导入原本导出且未更改的文件,或固定程序自动生成的文件,不适合人工填制的文件。 另外你缺少一个足够配合的用户,我以前遇到 SAP 上传各种限制(而且不报错、或报错但不给原因),最后我作为用户自己撸了 VBA 确保生成的文件能直接上传。限制或问题比如: * 必须是分号(;)分隔的 csv 格式 * 数字不能带千分号(或者可以千分号用点、小数点用逗号) * 必须是 UTF-8 without BOM 编码 * 不能少列多列 * 数据里特定字符会被默默替换掉 * 末尾不能多空行 * 一开始 IT 随手给了个旧模板,上传出错才发现有新模板 * 模板 Excel 有些单元格被设置成错误格式 * 模板里部分示例是错误的 * 币种列为特定值时,金额列的对应值会被乘以 100 (文档没提,IT 查看代码才确认有这设计) |
67
Torpedo 2022-11-12 10:51:40 +08:00
导入要提供模板,然后导入的时候一定要强校验表头的
这种需求很常见,做多了就有经验了 |
68
hahaFck 2022-11-12 11:06:01 +08:00
楼主本是想吐槽一下,结果被喷傻了吧,哈哈。
|
69
tuutoo 2022-11-12 11:31:57 +08:00 via Android
很正常的 见多了 Excel 里给你多个空格 少个空格 中英文逗号 各种格式 日期处理 一会文本 一会日月年 年月日的
|
70
kwh 2022-11-12 11:33:48 +08:00
@hahaayaoyaoyao 也不是说他们不知道平行线不相交,他们知道,初中知识谁不会知道,但是他们无法将这个初中知识应用于荒野行动这个游戏,放到游戏里面他们就理解不了了。
那两个反应不过来的,说好听点是打游戏真 TM 不带脑子,至于那个 B 则完全无法理解 平行线不相交这个规则 在游戏中是如何存在的,可以说真的是智力偏低。 说真的,以前我真不认为有人会智商低,充其量就是 脑子里面的知识不如别人 而导致的不知道,但是现实告诉我真的有人智力偏低。 |
71
sarices 2022-11-12 11:56:20 +08:00
不常用的我都是建议用户把文件发给我,我来自己导入,经常用的,当然要写程序再导入前验证所有格式,然后让用户预览后再确认导入
|
72
jaggle 2022-11-12 12:35:50 +08:00 via iPhone 3
优秀的程序应该是:程序不需要帮用户做任何事情,你们用数据库导表,就不满足这一点。
你帮用户做事,意味着你们需要处理异常-沟通-处理异常-继续沟通 你们至少需要弄一个简单的页面,在上面让用户上传表格,如果出错了,及时显示错误信息在界面上,例如“第三列应当为 身份证号码” 只要你 catch 到了足够的异常,用户就可以自己去解决异常。 |
73
uvwlab 2022-11-12 12:44:35 +08:00 via Android
产品开发,不要太自我
|
74
mmdsun 2022-11-12 13:58:38 +08:00
我是先查询表格头做成 map, 再去匹配用户的 excel 的 即使列顺序不一样也可以。
|
76
Chisel 2022-11-12 14:19:05 +08:00
我一般会在第一行弄一个大的单元格,把注意事项写到里面。
|
77
shaojz2005 2022-11-12 15:28:07 +08:00
要看投入时间和成本,内部使用,我倾向于给运营培训,而不是把这个程序写得很复杂。
如果外部使用,给 C 端用户用,可以慢慢研究完善。 |
78
690135443 2022-11-12 17:03:09 +08:00
所以我在和业务部门的大佬们沟通需求的时候把用户可能会出的问题都提前说明了,业务部门的大佬就会去和用户说必须这样必须那样,严禁这样严禁那样,我自己做的时候就方便多了。
|
79
imycc 2022-11-12 17:26:38 +08:00
这种事情,只是约定了格式还不够,参数校验能解决很多麻烦。列数不对的、顺序错误的、表头名称错误的、取值范围错误的,通通在用户提交数据的时候报错,能极大减少沟通、排错的成本。
让程序兼容、自动纠错、培训用户,都是费时费力的事情,而且也不能阻断后续的错误。 |
80
fox0001 2022-11-12 17:39:29 +08:00 via Android
还不如让运营提供数据,你们自己导进系统。可能代码都不用写。
|
81
Admstor 2022-11-12 17:43:48 +08:00
希望楼主在用一些政务系统的时候,发现你的输入不能有一点点错误,必须一个标点符号都不错
要记住 其背后的程序员就和你一样 |