V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
SJH0402
V2EX  ›  问与答

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

  •  
  •   SJH0402 · 322 天前 · 1043 次点击
    这是一个创建于 322 天前的主题,其中的信息可能已经有所发展或是发生改变。
    公司要对一个后台管理系统的功能作拓展,现要求:
    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  
       322 天前 via Android
    顶级的单文件编程
    xiangyuecn
        2
    xiangyuecn  
       322 天前
    @Bingchunmoli 一个入口不代表只是一个文件,/endpoint/method1 换成 /endpoint?method=method1 而已
    sleepybear1113
        3
    sleepybear1113  
       322 天前
    每个页面的数据难道不都是后端给的么,怎么查的,就怎么取?比如查的时候转为 list<List<Object>>存内存或者 Redis ,通过 key 获取,然后写 Excel 。接口传参就是穿 key 就行了。数据表头的话,动态拼 SQL ,总得有映射吧,或者数据库就是中文字段?
    shalk
        4
    shalk  
       322 天前
    问题 3 ,也很简单,是哪个页面也让前端传
    wangkun025
        5
    wangkun025  
       322 天前
    看到这种需求,脑子就嗡嗡的。
    javak
        6
    javak  
       322 天前 via iPhone
    付费的话,我可以教你
    hhjswf
        7
    hhjswf  
       322 天前 via Android
    让前端去调分页接口,page=-1 代表不分页,前端生成 csv 填充数据😄
    SJH0402
        8
    SJH0402  
    OP
       322 天前 via iPhone
    @sleepybear1113 存 redis 是个解决方案,感觉有可行性。数据库不是中文字段,老哥说的映射具体指哪里呢
    SJH0402
        9
    SJH0402  
    OP
       322 天前 via iPhone
    @shalk 哈哈我也是这样想,最省事
    SJH0402
        10
    SJH0402  
    OP
       322 天前 via iPhone
    @wangkun025 脑子嗡了一下午也没想出来怎么解决
    @javak 感谢老哥,不过暂时还不太需要
    @hhjswf 在前端生成 csv 吗,也跟同事沟通过这个问题,因为本身表头数据和页面数据就在前端,直接拿来用就好,不过好像在前端无法导出图片数据?听同事这么提了一句,也没细问
    wangkun025
        11
    wangkun025  
       322 天前
    我不是前端,但之前这事是前端自己做的,后端没参与。
    所以按照我的理解,让前端自己想办法。

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

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

    如果你是 mysql+myabtis , 可以返回 map , 然后根据字段中文名去匹配,填充表格
    可以反射 获取他的注解和属性名,然后用${}传进去,具体实现起来还是挺复杂的,看你们业务把
    siweipancc
        18
    siweipancc  
       321 天前 via iPhone
    自定义注解结合 entityMeta 即可
    重要的是分页查询的数据传递,这个必须调用 entitymanager 动态传递 class 跟分页参数
    然后丢给 easyexcel 该干嘛干嘛
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5419 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 07:38 · PVG 15:38 · LAX 00:38 · JFK 03:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.