SJH0402
V2EX  ›  问与答

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

  •  
  •   SJH0402 · Jun 10, 2023 · 2299 views
    This topic created in 1113 days ago, the information mentioned may be changed or developed.
    公司要对一个后台管理系统的功能作拓展,现要求:
    1 、每个页面的数据都能导出为 excel 文件
    2 、所有的页面都使用一个后端接口
    3 、数据的查询在后端处理

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

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

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

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

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

    如果你是 mysql+myabtis , 可以返回 map , 然后根据字段中文名去匹配,填充表格
    可以反射 获取他的注解和属性名,然后用${}传进去,具体实现起来还是挺复杂的,看你们业务把
    siweipancc
        18
    siweipancc  
       Jun 11, 2023 via iPhone
    自定义注解结合 entityMeta 即可
    重要的是分页查询的数据传递,这个必须调用 entitymanager 动态传递 class 跟分页参数
    然后丢给 easyexcel 该干嘛干嘛
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2798 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 125ms · UTC 04:25 · PVG 12:25 · LAX 21:25 · JFK 00:25
    ♥ Do have faith in what you're doing.