一个关于 Java 中动态生成 excel 文件的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
SJH0402
V2EX    问与答

一个关于 Java 中动态生成 excel 文件的问题

  •  
  •   SJH0402 2023-06-10 19:23:58 +08:00 1764 次点击
    这是一个创建于 860 天前的主题,其中的信息可能已经有所发展或是发生改变。
    公司要对一个后台管理系统的功能作拓展,现要求:
    1 、每个页面的数据都能导出为 excel 文件
    2 、所有的页面都使用一个后端接口
    3 、数据的查询在后端处理

    问题:
    1 、我应该如何动态获取 excel 的中文表头数据
    2 、我应该如何获取中文表头数据对应的数据库字段
    3 、针对问题 3 ,我应该如何判断要查询的是哪个页面的数据

    方案:
    针对三个问题,跟前端沟通了一下。1 和 2 可以前端传递数据,3 是真的想不到如何解决。

    各位大佬有何高明见解(针对三个问题,小弟经验不足,和前端同事讨论的 1 和 2 的解决方案恐怕也不够成熟)
    18 条回复    2023-06-11 16:56:18 +08:00
    Bingchunmoli
        1
    Bingchunmoli  
       2023-06-10 20:04:22 +08:00 via Android
    顶级的单文件编程
    xiangyuecn
        2
    xiangyuecn  
       2023-06-10 21:03:24 +08:00
    @Bingchunmoli 一个入口不代表只是一个文件,/endpoint/method1 换成 /endpoint?method=method1 而已
    sleepyfevniv
        3
    sleepyfevniv  
       2023-06-10 21:29:56 +08:00
    每个页面的数据难道不都是后端给的么,怎么查的,就怎么取?比如查的时候转为 list<List<Object>>存内存或者 Redis ,通过 key 获取,然后写 Excel 。接口传参就是穿 key 就行了。数据表头的话,动态拼 SQL ,总得有映射吧,或者数据库就是中文字段?
    shalk
        4
    shalk  
       2023-06-10 21:33:33 +08:00
    问题 3 ,也很简单,是哪个页面也让前端传
    wangkun025
        5
    wangkun025  
       2023-06-10 21:35:23 +08:00
    看到这种需求,脑子就嗡嗡的。
    javak
        6
    javak  
       2023-06-10 22:53:05 +08:00 via iPhone
    付费的话,我可以教你
    hhjswf
        7
    hhjswf  
       2023-06-10 22:56:18 +08:00 via Android
    让前端去调分页接口,page=-1 代表不分页,前端生成 csv 填充数据
    SJH0402
        8
    SJH0402  
    OP
       2023-06-10 22:56:46 +08:00 via iPhone
    @sleepybear1113 存 redis 是个解决方案,感觉有可行性。数据库不是中文字段,老哥说的映射具体指哪里呢
    SJH0402
        9
    SJH0402  
    OP
       2023-06-10 22:57:38 +08:00 via iPhone
    @shalk 哈哈我也是这样想,最省事
    SJH0402
        10
    SJH0402  
    OP
       2023-06-10 23:03:09 +08:00 via iPhone
    @wangkun025 脑子嗡了一下午也没想出来怎么解决
    @javak 感谢老哥,不过暂时还不太需要
    @hhjswf 在前端生成 csv 吗,也跟同事沟通过这个问题,因为本身表头数据和页面数据就在前端,直接拿来用就好,不过好像在前端无法导出图片数据?听同事这么提了一句,也没细问
    wangkun025
        11
    wangkun025  
       2023-06-11 00:21:43 +08:00
    我不是前端,但之前这事是前端自己做的,后端没参与。
    所以按照我的理解,让前端自己想办法。

    如果前端搞不定,需要后端写成一个文件的话,那就生成 excel 文件,给前端链接,让该文件可以下载就可以了。但这事不能即时下载,需要搞个下载中心,后端异步生成 excel 文件。

    总之,我觉得这个需求很扯淡。
    facebook47
        12
    facebook47  
       2023-06-11 07:29:05 +08:00 via Android
    easyexcel
    Bingchunmoli
        13
    Bingchunmoli  
       2023-06-11 09:14:25 +08:00 via Android
    @xiangyuecn 一个原理,一个效果,所以是顶级大文件编程
    MIUIOS
        14
    MIUIOS  
       2023-06-11 10:35:21 +08:00
    为什么要写成一个接口? 不理解。 我们是写了一个 base 的 controller 和 service 方法, 所有模块继承他, 就拥有导出的功能了,如果单个模块需要扩展他的导出就实现继承的方法即可,这样不是更灵活吗?
    MIUIOS
        15
    MIUIOS  
       2023-06-11 10:40:16 +08:00
    单纯你的文字无法推断出你们的系统字段是否可以自定义
    向我们系统的字段全部都可以自定义,所以只需给出模块名然后去数据库查中文和字段即可, 然后在从数据库拉出来转成 map 直接对应取即可
    SJH0402
        16
    SJH0402  
    OP
       2023-06-11 12:37:41 +08:00 via iPhone
    @totoro52 因为后台页面已经比较多了,一个个去继承的话有点麻烦。另外老哥是如何根据不同的模块名去调用不同的服务查询数据库的,if else 判断吗
    MIUIOS
        17
    MIUIOS  
       2023-06-11 15:11:05 +08:00
    @SJH0402 #16
    没有用到 if else
    我们使用的是 ES ,根据定义好的枚举类去检索对应的 mapping 名即可

    如果你是 mysql+myabtis , 可以返回 map , 然后根据字段中文名去匹配,填充表格
    可以反射 获取他的注解和属性名,然后用${}传进去,具体实现起来还是挺复杂的,看你们业务把
    siweipancc
        18
    siweipancc  
       2023-06-11 16:56:18 +08:00 via iPhone
    自定义注解结合 entityMeta 即可
    重要的是分页查询的数据传递,这个必须调用 entitymanager 动态传递 class 跟分页参数
    然后丢给 easyexcel 该干嘛干嘛
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2801 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 07:08 PVG 15:08 LAX 00:08 JFK 03:08
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86