PHP分块导出excel数据表格(csv格式)

示例1: 简单导出几条数据

 public function exportData()
    {
        $once = 5;
        $file_name = date('Ymd').'.csv';
        $url = storage_path('/app/'. $file_name);  //保存路径
        $header  = [                        //表头
            'ID',
            'NAME'
        ];
        $data = [                            //导出的数据
            ['id'=> 1, 'name'=> '小王'],
            ['id'=> 2, 'name'=> '小李'],
            ['id'=> 3, 'name'=> '小王'],
            ['id'=> 4, 'name'=> '小李'],
            ['id'=> 5, 'name'=> '小王'],
            ['id'=> 6, 'name'=> '小李'],
            ['id'=> 7, 'name'=> '小王'],
            ['id'=> 8, 'name'=> '小李'],
            ['id'=> 9, 'name'=> '小王'],
            ['id'=> 10, 'name'=> '小李'],
            ['id'=> 11, 'name'=> '小王'],
            ['id'=> 12, 'name'=> '小李'],
        ];

        $fp = fopen($url, "a");  //注意:需要填绝对路径
        fputcsv($fp, $header);
        fwrite($fp, chr(0xEF).chr(0xBB).chr(0xBF)); // 添加 BOM
        $lists = array_chunk($data, $once);         // 数据分块
        foreach ($lists as $key=>$list){ 
            foreach ($list as $item) {
                fputcsv($fp, $item);
            }
            unset($lists[$key]);
        }
        fclose($fp);
    }

示例2:查表导出20W条数据 (本地实验单表查询3个字段,导出20W条大概花费十几秒)

    public function exportData()
    {
        set_time_limit(0);
        $page_size = 10000;   //单次查询数量
        $file_name = date('Ymd').'.csv';  //文件名称
        $url = storage_path('/app/'. $file_name);  //保存路径
        $header  = [                        //表头
            'ID', '订单号', '创建时间'
        ];
        $field  = [                       //对应字段
            'id', 'order_id', 'create_time'
        ];
        $fp = fopen($url, "a");   //注意:需要填绝对路径

        fputcsv($fp, $header);
        fwrite($fp, chr(0xEF).chr(0xBB).chr(0xBF)); // 添加 BOM
        $where = [                      //查询条件
            ['id', '<', 200000],
        ];
        $index = 1;
        $list = $this->getData($where,$page_size,$index,$field);

        while(!empty($list)){
            $list = $this->getData($where,$page_size,$index,$field);
            foreach ($list as $item) {
                fputcsv($fp, (array)$item);
            }
            $index ++;
            if($index%10 === 0){   //防止卡死
                sleep(1);
            }
        }

        fclose($fp);
    }

    function getData($where, $page_size, $index, $field)
    {
        $data =  DB::table('order')->where($where)
            ->select($field)
            ->forPage($index, $page_size)
            ->get()->toArray();
		
		//todo 处理数据
		
	   return $data;	
    }

如果只是导出表数据,不需要对数据进行处理,在laravel中可以使用chunk(), 像这样:

$fp = fopen('xxx.csv', 'a');
Model::->orderBy('id')->chunk(1000, function($items) use ($fp) {
    foreach ($items as $item) {
        fputcsv($fp, $item);
    }
});
fclose($fp);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值