zoukankan      html  css  js  c++  java
  • 浅谈导出Execl的报表数据解决方案

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

    0x01:同步导出

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

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

    0x02:异步导出

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

    第一个接口:开启一个线程对进行数据查询,并对查询到的数据进行Execl电子表格读写操作,同步返回导出状态标识;
    第二个接口:查询第一个接口的完成状态,如果完成Execl电子表格操作,则返回true;否则返回false;
    第三个接口:根据第二个接口返回的状态,如果返回true,就调用下载Execl电子表格;否则返回false的话继续轮询调用第二个接口,直到返回true;
    在这里插入图片描述

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

    0x03:导出服务

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

    表的作用是用来存储谁进行了数据导出,导出的电子表格Execl存放的硬盘目录
    第一个接口:开启一个线程对进行数据查询,并对查询到的数据进行Execl电子表格读写操作,最后把电子表格的目录存储到数据库;同步返回成功;
    第二个接口:在导出列表中找出导出的记录,然后调用该接口进行Execl电子表格下载;
    在这里插入图片描述
    该方案需要额外做一个管理下载记录的界面,进行下载管理;这个方案的最大好处就是对下载操作进行了记录。如果需要对相同的数据导出,只需导出一遍即可。不过增加了存储的空间,无论数据库还是硬盘,都增加了。

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

  • 相关阅读:
    MVP模式与MVVM模式
    webpack的配置处理
    leetcode 287 Find the Duplicate Number
    leetcode 152 Maximum Product Subarray
    leetcode 76 Minimum Window Substring
    感知器算法初探
    leetcode 179 Largest Number
    leetcode 33 Search in Rotated Sorted Array
    leetcode 334 Increasing Triplet Subsequence
    朴素贝叶斯分类器初探
  • 原文地址:https://www.cnblogs.com/happyhuangjinjin/p/14420246.html
Copyright © 2011-2022 走看看