简介:PHP通过输出流导出Excel,php输出流导出excel,php导出csv,php边导出数据边输出到浏览器
由于用户量较大,经常会有导出50万加数据的情况。而常用的PHPexcel包需要把所有数据拿到后才能生成excel, 在面对生成超大数据量的excel文件时这显然是会造成内存溢出的,所以考虑使用让PHP边写入输出流边让浏览器下载的形式来完成需求。
我们通过如下的方式写入PHP输出流:
//打开输出流
$fp = fopen('php://output', 'w');
//向输出流插入数据
fputcsv($fp,['订单号','用户']);
//关闭输出流
fclose($fp)
php://output
是一个可写的输出流,允许程序像操作文件一样将输出写入到输出流中,PHP会把输出流中的内容发送给web服务器并返回给发起请求的浏览器
来看看CVS的导出简单封装:
<?php
namespace app\components;
class CsvExport
{
/**
* 打开的文件句柄
*/
protected $fp;
/**
* 构造函数
* CsvExport constructor.
* @param null $fileName 输出的文件名
*/
public function __construct($fileName=null)
{
if(!$fileName) $fileName = date('Y-m-d_H-i-s') . '.csv';
//告诉浏览器要下载csv文件
header('Content-Type: text/csv');
header("Content-Disposition: attachment;filename={$fileName}");
$this->fp = fopen( 'php://output' , 'w' );
fwrite($this->fp, chr(0xEF) . chr(0xBB) . chr(0xBF));
}
/**
* 插入数据
*/
public function insertText($row)
{
fputcsv($this->fp,$row);
return $this;
}
/**
* 对象销毁时关闭句柄
*/
public function __destruct()
{
fclose($this->fp);
}
}
最终调用:
<?php
$excel = new \app\components\CsvExport('测试导出.csv');
//设置头部
$excel->insertText(['订单编号','设备编号','交易单号','支付金额','支付时间']);
//插入内容,注意内容顺序必须和头部内容一致
//模拟数据库导出,实际工作中应该使用游标逐条获取并写入文件流中
$data = [
['a','b','c']
];
foreach($data as $item) {
$excel->insertText$item);
}
这种方式有一个很大的弊端,无法自定义单元格样式及图片插入问题等等。我个人还是建议大家使用xlswriter这个扩展来导出,内存也能控制在1M以内。有兴趣的可以看看我之前的文章【php导出excel结合xlswriter优化内存不足的问题】
有什么不对的可以在我的公众号留言