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

2023-06-10 19:23:58 +08:00
 SJH0402
公司要对一个后台管理系统的功能作拓展,现要求:
1 、每个页面的数据都能导出为 excel 文件
2 、所有的页面都使用一个后端接口
3 、数据的查询在后端处理

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

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

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

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

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

如果你是 mysql+myabtis , 可以返回 map , 然后根据字段中文名去匹配,填充表格
可以反射 获取他的注解和属性名,然后用${}传进去,具体实现起来还是挺复杂的,看你们业务把
siweipancc
2023-06-11 16:56:18 +08:00
自定义注解结合 entityMeta 即可
重要的是分页查询的数据传递,这个必须调用 entitymanager 动态传递 class 跟分页参数
然后丢给 easyexcel 该干嘛干嘛

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/947591

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX