PHP通过输出流导出Excel

简介: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优化内存不足的问题

 

有什么不对的可以在我的公众号留言

编程经验共享公众号二维码

编程经验共享公众号二维码
更多内容关注公众号
Copyright © 2021 编程经验共享 赣ICP备2021010401号-1