V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
overthemoon
V2EX  ›  程序员

奇葩的需求

  •  
  •   overthemoon · 2021-07-31 16:17:28 +08:00 · 6093 次点击
    这是一个创建于 1210 天前的主题,其中的信息可能已经有所发展或是发生改变。

    组长要求实现 Excel 导入时,不管 Excel 的标题位置顺序和数量怎么变化,都能插入到对应的数据库字段里面,这种需求怎么实现? 后端用 java

    第 1 条附言  ·  2021-07-31 19:15:03 +08:00
    兄弟萌,现在不是讨论奇不葩奇葩的问题,有没有熊迪知道怎么实现的
    第 2 条附言  ·  2021-07-31 23:06:11 +08:00
    是根据 Excel 的中文标题找到数据库对应的字段,并插入数据,你们确定知道我想说的是啥吗
    第 3 条附言  ·  2021-08-01 16:42:01 +08:00
    好的,谢谢兄弟萌
    41 条回复    2021-08-03 09:04:34 +08:00
    imn1
        1
    imn1  
       2021-07-31 16:19:41 +08:00
    先排序再导入啰
    potatowish
        2
    potatowish  
       2021-07-31 16:29:00 +08:00 via iPhone
    就算这个需求再怎么奇葩,你还不是要开发,除非你走?
    一个可行的做法是,标题做成可配置的,配置了什么标题,就可以导入这个标题。后台做一个标题名称和字段名的映射就可以了
    Suigintou
        3
    Suigintou  
       2021-07-31 16:38:55 +08:00 via iPhone
    这个类型需求我遇到跟奇特的,就是 Excel 内好几个类别的数值,没有特点和规律,要它们自己分类到相应名称排序下,我想了一宿没有想明白。
    Kiriya
        4
    Kiriya  
       2021-07-31 16:45:24 +08:00
    很明显是用来导报表给领导看用的🐶
    yitingbai
        5
    yitingbai  
       2021-07-31 16:52:37 +08:00
    这样不算奇葩需求, 这个需求很有必要, 能够提升易用性, 否则导入的时候还得担心字段顺序问题, 处理也很简单啊,读到内存中, 自己排一下序呗
    eric96
        6
    eric96  
       2021-07-31 17:02:00 +08:00
    excel 标题映射到实体或 map 的 key 这个,你是需要实现这个吧
    easyexcel,阿里的类库可以用
    512357301
        7
    512357301  
       2021-07-31 18:03:22 +08:00 via Android
    这不是组长要求的,这是需求方要求的,我是需求方我也这么要求,这种导入方式才是最符合认知的,但也是最增加开发工作量的。。。,一般这种需求在产品调研阶段就被产品经理怼回去了,压根不会到研发,现在只能说明需求方比较强势😂
    导入的字段数量介于必选字段数量和总字段数量之间,且对字段顺序不做要求
    你想象一下前端小弟有没有在调用 web 接口传参的也跟你商量这样来传参呢,每次只传需要的参数,参数顺序不按照你规定的来,而是随机排列😉
    zoharSoul
        8
    zoharSoul  
       2021-07-31 18:13:14 +08:00
    @512357301 #7
    easyexcel 直接映射不就可以吗
    这很简单啊,

    再说前端 web 接口传参顺序随机排列咋了, 他排出花也没关系啊
    zzzzzzc
        9
    zzzzzzc  
       2021-07-31 18:15:58 +08:00 via iPhone
    这不是个很正常的需求吗
    overthemoon
        10
    overthemoon  
    OP
       2021-07-31 19:16:06 +08:00
    @zoharSoul 有相关 api 吗,我研究研究
    overthemoon
        11
    overthemoon  
    OP
       2021-07-31 19:16:20 +08:00
    @512357301 你是如何实现的~
    overthemoon
        12
    overthemoon  
    OP
       2021-07-31 19:16:43 +08:00
    @eric96 好的谢谢,我回头看下~
    pengtdyd
        13
    pengtdyd  
       2021-07-31 19:20:22 +08:00
    说实话这个需求我觉的简单,但是侧面反映了你们公司的产品是个垃圾,没有话语权。
    harde
        14
    harde  
       2021-07-31 19:24:59 +08:00
    很正常的需求吧,做映射表就可以。
    wangkun025
        15
    wangkun025  
       2021-07-31 19:28:13 +08:00
    header = array1
    rows = rows array
    row
    record = [header, row].transpose
    insert(record)

    大概这么个思路,别闲麻烦。
    wangkun025
        16
    wangkun025  
       2021-07-31 19:29:50 +08:00
    http://railscasts.com/episodes/396-importing-csv-and-excel
    上面链接是 Ruby on Rails 的实现。估计你用不上。
    gBurnX
        17
    gBurnX  
       2021-07-31 20:59:08 +08:00   ❤️ 1
    这种活,在业界称为 ETL,有专用的工具。

    如果你要自己处理,大致流程如下:

    1.访问数据表,获取该表所有业务字段,以及每个业务字段的类型。

    2.访问 Excel 表,获取该表所有业务字段,以及每个字段的类型。

    3.遍历 1 的数据集,在 2 里找对应的,建立 1 与 2 的对应关系。此时注意异常的处理,比如找到 1 对多的情况,比如 1 有但 2 没有的缺失情况。

    4.根据 3 的对应关系,开始从 2,分批往数据库导入数据。此时注意异常的处理,比如类型转换失败,比如长度超过限制,比如 2 的某个 row 是 empty 或 null 。

    5.输出处理情况以及错误信息。

    ps.这种活,自己写,一点都不难,只是非常麻烦,非常容易写错。第一次写,一定要用小批量数据,做好调试与测试。
    jack778
        18
    jack778  
       2021-07-31 21:06:17 +08:00
    easypoi 能满足这个需求,前提是必填项不能没有
    xuanbg
        19
    xuanbg  
       2021-07-31 22:37:51 +08:00
    这个需求最正常不过了,人家就算不提,咱也得替人家想到不是?具体实现我的 GitHub 里面有,自己找一下吧。
    overthemoon
        20
    overthemoon  
    OP
       2021-07-31 23:07:27 +08:00
    @xuanbg
    @jack778
    @gBurnX
    @wangkun025
    @wangkun025
    @harde
    @pengtdyd
    @zhengxu5511
    @zoharSoul
    @512357301
    @eric96
    是根据 Excel 的中文标题找到数据库对应的字段,并插入数据,兄弟萌你们确定知道我想说的是啥吗,我想知道有啥现成的 java 框架可以实现
    hobbitlhy
        21
    hobbitlhy  
       2021-07-31 23:27:17 +08:00
    @overthemoon 中文标题和数据库注释对应吗?
    liuzhaowei55
        22
    liuzhaowei55  
       2021-07-31 23:35:55 +08:00 via Android
    正常应该就是前端或者后端读出来一点数据响应到前段让用户选择首行是否是标题行,每一列对应模型的数据,数据量不大还可以再检验一下行列数据格式。
    liuzhaowei55
        23
    liuzhaowei55  
       2021-07-31 23:38:07 +08:00 via Android
    @liuzhaowei55 不要让提需求的人,讲数据方案,就讲需求好了,可能要的并不是一匹跑得更快的🐴
    gBurnX
        24
    gBurnX  
       2021-07-31 23:50:40 +08:00
    @overthemoon

    Excel 里能写中文标题里,有 3 个地方:

    1.excel 文件名
    2.Sheet 名称
    3.Cell 里面的 value

    我们都觉得是 3,你想说是哪个?
    overthemoon
        25
    overthemoon  
    OP
       2021-08-01 00:12:40 +08:00
    @hobbitlhy 和数据库英文字段一一映射
    overthemoon
        26
    overthemoon  
    OP
       2021-08-01 00:13:11 +08:00
    @gBurnX 算是第三个把
    koast
        27
    koast  
       2021-08-01 00:52:43 +08:00 via Android
    感觉楼上各位没有答非所问呀...需求就是写起来有点麻烦,但是也算正常需求吧,处理好各种意外情况就好,那种表经过一堆人以后结构一定会变得乱乱的...
    harde
        28
    harde  
       2021-08-01 01:19:31 +08:00
    映射表
    name , column
    1 、编号, id
    2 、名称, name


    读取 excel 、获取列名,通过映射表转换出字段。

    不是这个需求么????
    jiayong2793
        29
    jiayong2793  
       2021-08-01 02:11:12 +08:00
    实现这个需求这么麻烦吗?我见公司的.net 几行代码就可以实现导入导出了
    gBurnX
        30
    gBurnX  
       2021-08-01 04:57:47 +08:00
    @overthemoon

    所以,既然你也承认是第三个需求,那么你应该把我在上面提的方案,仔细认真看看。
    BraveChi
        31
    BraveChi  
       2021-08-01 07:51:36 +08:00
    非常正常的需求,甚至我觉着大部分的导入都是这样的,另外我遇到的系统都是这样的,难道你是按照顺序指定数据库字段导入的? 不太可能吧? 设置按照顺序指定数据库字段反而麻烦吧?
    rekulas
        32
    rekulas  
       2021-08-01 09:04:56 +08:00
    如果想吐槽就安心吐槽
    如果想咨询大家就详细描述下具体场景,这样起了个标题就想大家给出思路的,谁做得到呢
    就你这个标题,瞬间能想出几十种可能
    niub
        33
    niub  
       2021-08-01 10:17:47 +08:00
    我之前处理过类似的需求,答案在这里:

    https://www.cnblogs.com/cone/p/12002913.html
    loopinfor
        34
    loopinfor  
       2021-08-01 10:28:31 +08:00
    应该还要实现标题对不上的时候可以让用户从标题列表里面手动指定 Excel 列和数据库字段的对应关系
    gamexg
        35
    gamexg  
       2021-08-01 11:37:33 +08:00
    根据标题行决定当前列属于哪个字段
    这个应该是常规需求吧?

    当然如果标题可能有错别字、别名等,还要求自动识别出来,那么会是大麻烦。
    否则仅仅的大小写错误、空格等并不麻烦。

    读取标题行,根据标题行生成一个字典,key 为字段名,value 为列索引值。
    然后需要什么字段时,那字段名去查询下字典,得到列索引值,读取对应列即可。

    或者是我理解错需求了?
    LowBi
        36
    LowBi  
       2021-08-01 12:48:47 +08:00 via Android
    其实还是按照后台生成一个模板,再把内容录入进行导入,这也算是一种标准化吧,不然你那样后面随便乱来,找的还是你,吃力不讨好
    no1xsyzy
        37
    no1xsyzy  
       2021-08-01 12:57:52 +08:00
    告诉你个消息,我自己做的 hack 都是 csv.DictReader 然后 func(**dct) 传参的。

    根据 key 来确定对应关系不合理?你难道要求 json 序列化出来有序吗?
    大不了 if else if else if 啊?
    建议从编程第二堂课开始回炉
    Mountain
        38
    Mountain  
       2021-08-01 14:52:55 +08:00
    这么多人都解释不明白的,能让你如此强烈的感到奇葩的需求,是不是各个目标字段不在同一张表甚至不在同一个库里啊?
    DinnyXu
        39
    DinnyXu  
       2021-08-01 16:17:25 +08:00
    正常的操作不是会提供一个 excel 导入的模板吗,填写的时候对应着模板里面约定好的字段顺序就好了
    hytex
        40
    hytex  
       2021-08-02 09:47:15 +08:00
    easypoi 呀,有对应的文档
    LouisGuo
        41
    LouisGuo  
       2021-08-03 09:04:34 +08:00
    这个需求挺好的啊,产品还帮你考虑了实现的细节了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2882 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:56 · PVG 10:56 · LAX 18:56 · JFK 21:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.