继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

浅谈导出Execl的报表数据解决方案

BUG弄潮儿
关注TA
已关注
手记 3
粉丝 0
获赞 0

项目中免不了要做一些数据导出功能,比如导出前一天的订单记录。涉及导出功能可大可小,根据系统具体的用户量、一天的订单量等情况。今天就讨论一下怎么设计一个合理的导出功能。


0x01:同步导出

这个方案最简单,就只需一个导出接口。这个接口只需实现根据用户条件到数据库查询相关数据,然后在应用程序中生成Execl电子表格,最后通过Response把生成的Execl电子表格回写到客户端即可

http://img4.sycdn.imooc.com/603093440001edbc10800607.jpg

该方案简单,因为是同步导出,所以不适用大量数据导出。如果使用该方案进行大量数据导出的话,存在客户端(浏览器)超时的情况,导致导出失败;因为浏览器与Nginx之间有超时设置。


0x02:异步导出

异步导出一般需要设计三个接口。

  • 第一个接口:开启一个线程对进行数据查询,并对查询到的数据进行Execl电子表格读写操作,同步返回导出状态标识;

  • 第二个接口:查询第一个接口的完成状态,如果完成Execl电子表格操作,则返回true;否则返回false;

  • 第三个接口:根据第二个接口返回的状态,如果返回true,就调用下载Execl电子表格;否则返回false的话继续轮询调用第二个接口,直到返回true;

http://img3.sycdn.imooc.com/6030934500011fed09640712.jpg

这种方案比较耗服务器性能,因为需要第二个接口轮询应用服务器的导出状态,设置一个比较合理的轮询周期显得非常必要。另外,第一种方案和第二种方案都没有对导出的结果进行存库记录,如果要下载同样的数据,要整个流程重新走一遍。这样的话就引出第三种方案。


0x03:导出服务

该方案需要一张表和两个接口。

  • 表的作用是用来存储谁进行了数据导出,导出的电子表格Execl存放的硬盘目录

  • 第一个接口:开启一个线程对进行数据查询,并对查询到的数据进行Execl电子表格读写操作,最后把电子表格的目录存储到数据库;同步返回成功;

  • 第二个接口:在导出列表中找出导出的记录,然后调用该接口进行Execl电子表格下载;

http://img1.sycdn.imooc.com/603093450001651710800736.jpg

该方案需要额外做一个管理下载记录的界面,进行下载管理;这个方案的最大好处就是对下载操作进行了记录。如果需要对相同的数据导出,只需导出一遍即可。不过增加了存储的空间,无论数据库还是硬盘,都增加了。


在实际项目中使用哪种方案,根据具体业务场景,具体选择即可。其他文件类型的导出方案也可以参考该文章的方案进行操作。




打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP