我想大家都应该应该做过Excel导出吧,我这里把Excel导出暂时分为了三个阶段,每个阶段对应项目的不同成长阶段。 以下会对分别介绍我在项目中使用过的工具以及方法。
项目环境: Mysql8.0 PHP8.0 Laravel 9.0
幼年期
幼年期顾名思义为我们的项目刚刚起步,这个时候我们可能不知道项目后面的走向,以及整个导出结构的数据量,所以这个时候我们通常采用最简单的方式进行导出 ,具体可以参考 Laravel-excel,这里就不做详细的介绍。该方案最大的优势就是开发快速,不需要过多的工作量。当然缺点也很明显当数据超过1万条时,就会特别慢而且占用内存也很高,随着数据越来越多,超过5万的时候基本就是不能正常工作的状态。
成长期
当我们数据业务逐步增长的时候,我们选择了一个由C编写的PHP扩展 php-ext-xlswriter,该方案需要在php环境中安装扩展,支持pecl安装。该方案比上一个方案的优点在于,写入速度更快,而且占用内存更小。在项目中期我们往往采用该方案就可以满足项目需求。放一个作者的做的与PHPExcel的对比图。
成熟期
上面两个方案都有一个问题那就是当一次性导出数据达到一定量(5万),并且数据库整个数据量比较大(300万)的时候,整个导出进程可能瓶颈就会在查询数据库以及处理数据类型等流程中。这个时候我们为了使导出能够正常完成,可以采用使用异步导出的方式,让导出任务在后台完成,待完成之后通过邮件通知到用户,或者在网页端显示对应的提醒。当然仅仅是异步导出也是不够的,我们还需要做分片导出。比如一次性导出20万条数据,我们可以每次导出1万条,然后最后将20个小的导出文件合并为一个作为最终的输出。导出跟合并在php-ext-xlswriter 都有对应的实现,开箱即用。
很多时候一个功能我们可能有很多种解决方案,但是我们需要在不同的阶段的选择最合适的方式。选择的指标常常有。用户习惯、工作量等方面。最终的结果需要我们在工作中与产品经理一起协商确定,千万不要做一个只会埋头苦干的人哦,最后通常吃力不讨好。