php导出excel数据量大,实时生成并下载大数据量的EXCEL文件,用PHP如何实现?

对于任何一个网站肯定是少不了下载功能,常见的下载功能有图片、视频、Excel表格,如果文件比较小的话,那么不会遇到任何的问题,但是当文件信息而超过了PHP的最大内存,那么在这个时候它就会有的内存溢出的问题。

那么它们是因为什么而发生的?对于这个过程的原理才是我们应该真正要去弄明白的事情

php导出excel数据量大,实时生成并下载大数据量的EXCEL文件,用PHP如何实现?

下载大数据量的EXCEL文件为何要报错?

PHP在下载大Excel表格的时候,那么首先它是需要去把MySQL的数据从硬盘上面读取到内存,但读取它是一次性载入到我们的内存,如果说它一次性载入的数据量远远大于最大内存,然后再来执行浏览器的业务下载。那么这个时候它就会发生我们这个内存溢出。

就比如:说我们现在有100M的数据量,但是我们PHP内存最大只有64M,那么这个它肯定是装不了的,我们可以把那个内存比喻为一个水杯,这个水杯的容量比喻为内存,现在杯子最大容量为64L。你要存放100L。肯定放不下

php导出excel数据量大,实时生成并下载大数据量的EXCEL文件,用PHP如何实现?

大事化小,小事化了。拆分成段

从上面可以看到文件下载,它是分为两步,首先是载入内存然后执行浏览器的输出下载,那么既然大型文件一次性载入不了,那可以采用 “大事化小,小事化了”思路,我们可以实现边写边下载,也就是分批次的读取与写入。

因为用户的话,只要最终拿到这个文件就可以,对于浏览器的下载原理不需要关心。只需要给到文件下载提示给用户即可,然后后端在实时的分批次的写入到要下载的文件当中。

php导出excel数据量大,实时生成并下载大数据量的EXCEL文件,用PHP如何实现?

实现思路步骤:

1、一设置浏览器下载Excel需要的Header

2、打开 php://output 流,并设置写入文件句柄。

注:(php://output,是一个可写的输出流,允许程序像操作文件一样将输出写入到输出流中,PHP会把输出流中的内容发送给web服务器并返回给发起请求的浏览器)

3、获取数据库所有数据量,并设置每次查询的条数,通过这两个值计算分批查询的次数

4、基于分批查询的次数循环查询数据库,然后写入到文件中,同时清除本次操作变量内存,刷新缓冲到浏览器,让浏览器的文件始终实时保持到最新的大小

注:刷新用ob_flush、flush()

PHP的I/O流

在这里我们用到了PHP的一个IO的输入输出,也就是我们常用的

php://input php://output。

php导出excel数据量大,实时生成并下载大数据量的EXCEL文件,用PHP如何实现?

php://input

php://input可以读取原始的POST数据。相较于$HTTP_RAW_POST_DATA而言,它给内存带来的压力较小,并且不需要特殊的php.ini设置。php://input不能用于enctype=multipart/form-data”.

注:HTTP_RAW_POST_DATA 在PHP7已经被废弃,它不是$_POST额

php://output

php://output 是一个只写的数据流, 允许你以 print 和 echo 一样的方式 写入到输出缓冲区。

综上:实现思维与原理很重要如有感悟,欢迎关注额。(* ̄︶ ̄)

php导出excel数据量大,实时生成并下载大数据量的EXCEL文件,用PHP如何实现?

怎么把excel导入mysql?

php导出excel数据量大,实时生成并下载大数据量的EXCEL文件,用PHP如何实现?

把excel文件导入mysql,方法有很多种,可以利用脚本语言,比例python,也可以利用工具,BI工具都支持外部数据源导入到数据库的表中。

工具中常常会遇到一些excel表格数据需要导入到数据库,如果一条条手工输入,不但慢而且容易出错。我们可以用Navicat for mysql直接导入方便,准确。

Navicat for mysql

Navicat是一个可多重连接的数据库管理工具,它可以连接到MySQL、Oracle、PostgreSQL、SQLite、SQL Server和/或MariaDB数据库,让数据库管理更加方便。

php导出excel数据量大,实时生成并下载大数据量的EXCEL文件,用PHP如何实现?

打开Navicat for mysql,然后选择需要导入的表,右键弹出一个窗口,选择导入数据,进入到导入向导页面,跟着向导一步一步向前走,就能轻松地将数据导入到数据库中。

php导出excel数据量大,实时生成并下载大数据量的EXCEL文件,用PHP如何实现?

Python

Python是一个胶水语言,通过几行简单的语句就可以将复杂的数据处理过程给处理好。导入数据库中总共需要分两步:

第一步,读取本地的需要导入的文件;

csvfile = file('/home/tom/Downloads/Code/city_data.csv', 'rb')

reader=csv.reader(csvfile)

for line in reader:

data.append(line)

csvfile.close()

第二步,将读取到的数据写入到对应的表中。

conn = MySQLdb.connect(host='192.168.4.240',user='####',passwd='####',db='#####',port=3306,charset='utf8') cur = conn.cursor() cur.executemany("""insert into dm_city_data(DATE_NAME,CITY_NAME,AREA_ID,SALE_VOLUME,NEW_SALE_VOLUME,NEW_MEMBER_NUMBER,ORDER_MEMBER_NUMBER,NEW_BELOW20YUAN_ORDER_NUMBER,NEW_NOSMOKING_NUMBER,NEW_MEMBER_BELOW20YUAN_PERCENT,NEW_MEMBER_NONSMOKER_PERCENT,AVG_MEMBER_ORDER,AVG_NEW_MEMBER_ORDER,SUB_ORDER_CASH,SUB_ORDER_NUMBER)values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s) """,new_data_insert) conn.commit() cur.close() conn.close()

以上举的两个例子,希望对题主有用。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 xxx@163.com 举报,一经查实,本站将立刻删除。

发表评论

登录后才能评论