php 导出大量数据到数据表示例

$field = 'aunt_id,pay_time,out_trade_no,self_name,store_city,phone,bond_money,id_card_num';
$data = Db::table('aunt')->field($field)->select();
$head = [ 'id','支付时间','支付订单号','自己填写的姓名','城市','手机号码','支付费用','身份证号'];
$fileName = '信息数据' . date("Ymd",time()) . time() . rand(1000,9999) . ".csv";
//设置运行时间,单位秒
set_time_limit(120);
//输出文件头
header("Content-type: text/csv");
header('Content-Type: application/vnd.ms-excel;charset=utf-8');
header("Content-Disposition: attachment;filename=$fileName");
header('Cache-Control: no-cache');
header('Expires: 0');
// 每隔$limit行,刷新一下输出buffer,不要太大,也不要太小
$limit = 10000;
// buffer计数器
$cnt = 0;
$fp = fopen('php://output', 'w');
$key = [];
foreach ($head as $i => $v) {
  // CSV的Excel支持GBK编码,一定要转换,否则乱码
  $head[$i] =iconv("utf-8","gb2312//IGNORE",$v);
  array_push($key, $i);
}
fputcsv($fp, $head);
foreach ($data as $k => $v){
  //字符集转换
  foreach ($v as $key => $val) {
    $val=is_numeric($val) ? $val . "\t" : $val;
    $row[$key] = iconv('utf-8', 'gb2312//IGNORE', $val);
  }
  $cnt++;
  if ($limit == $cnt){
    //刷新一下输出buffer,防止由于数据过多造成问题
    ob_flush();
    flush();
    $cnt = 0;
  }
  fputcsv($fp, $row);//写入第一行数据
}
fclose($fp);
exit();

 

posted @ 2021-03-26 15:11  邈宇  阅读(91)  评论(0)    收藏  举报