作为程序员一定要保持良好的睡眠,才能好编程

php导出csv的两种方法及对比

发布时间:2018-12-20

在项目中有很多时,是需要导出csv的,我这里介绍两种方式:


第一种:字符拼接,然后导出



$result = $this->Recharge_model->getList($where, $field, '', [], $order);

$csv = "客户流水号,支付流水号,银行流水号,用户名,充值渠道(0-B2B;1-B2C;2-协议支付;3-微信收单;4-支付宝收单),充值金额,充值手续费,实际支付金额,充值时间,支付公司状态(0-成功;1-失败),银行返回状态(0-成功;1-失败)\n";

foreach ($result as $val) {
  $csv .= sprintf("%s\t,%s\t,%s\t,%s,%s\t,%s\t,%s\t,%s\t,%s,%s\t,%s\t\n",
    $val['customer_flow_num'],
    $val['pay_flow_num'],
    $val['bank_flow_num'],
    $val['username'],
    $val['channel'],
    $val['recharge_amount'],
    $val['recharge_charge'],
    $val['actual_payment_amount'],
    date('Y-m-d H:i', $val['payment_time']),
    $val['pay_status'],
    $val['bank_status']
  );
}
export_csv($csv,'file.csv');



/**
 * 导出csv格式文件
 * @param $file_content 文件内容
 * @param $filename 文件名称 不要带扩展名
 */
function export_csv($file_content, $filename) {
  $file_content = mb_convert_encoding($file_content, 'GBK', 'utf-8');
  header('Content-Description: File Transfer');
  //header('Content-Type: application/octet-stream');
  header('Content-Type: application/x-xls');
  //header('Content-Type: application/vnd.ms-excel');
  header('Content-Disposition: attachment; filename=' . $filename . '.csv');
  header('Content-Transfer-Encoding: binary');
  header('Expires: 0');
  header('Cache-Control: must-revalidate');
  header('Pragma: public');
  //header('Content-Length: ' . mb_strlen($file_content, 'gbk'));
  //ob_clean();
  //flush();
  echo $file_content;

  file_put_contents('aa.csv',$file_content);
  die();
}



这是第一种方式,这种方式简单、直白,

但是有一个弊端,任何字符中不能包含逗号 这个标记,因为csv就是以逗号进行分割的,如果包含会自动分割。

包含单引号和双引号这是没有问题的。


第二种:fputcsv函数导出


这种方式,不用担心数据中是否有双引号,单引号,以及逗号的问题,fputcsv 函数都已经帮我们处理了。


下面看看fputcsv处理代码:

/**
 * 导出csv
 * @param $where
 */
public function export($where, $order = NULL) {
  $field = $this->_field;

  $order = $this->filterOrder($order);

  $result = $this->Recharge_model->getList($where, $field, '', [], $order);
  $chanelArr = $this->Dictionaries_service->getList('recharge_chanel');
  $chanelArr = array_column($chanelArr['result'], 'title', 'id');

  $csv = "客户流水号,支付流水号,银行流水号,用户名,充值渠道(0-B2B;1-B2C;2-协议支付;3-微信收单;4-支付宝收单),充值金额,充值手续费,实际支付金额,充值时间,支付公司状态(0-成功;1-失败),银行返回状态(0-成功;1-失败)";
  $title = explode(',', $csv);
  $csvDatas = [];
  foreach ($result as $val) {
    $csvDatas[] = [
      $val['customer_flow_num'],
      $val['pay_flow_num'],
      $val['bank_flow_num'],
      $val['username'],
      array_key_exists($val['channel'], $chanelArr) ? $chanelArr[$val['channel']] : '',
      $val['recharge_amount'],
      $val['recharge_charge'],
      $val['actual_payment_amount'],
      date('Y-m-d H:i', $val['payment_time']),
      $val['pay_status'],
      $val['bank_status']
    ];
  }
  export_csv(['title' => $title, 'data' => $csvDatas],'export.csv');
}


/**
 * 导出csv格式文件
 * @param $file_content 文件内容
 * @param $filename 文件名称 不要带扩展名
 */
function export_csv($file_content, $filename) {
  $file_content = convert_encodeing($file_content);
  header('Content-Description: File Transfer');
  header('Content-Type: application/x-xls');
  header('Content-Disposition: attachment; filename=' . $filename . '.csv');
  header('Content-Transfer-Encoding: binary');
  header('Expires: 0');
  header('Cache-Control: must-revalidate');
  header('Pragma: public');
  
  if ($out = fopen('php://output', 'w')) {
    fputcsv($out, $file_content['title']);
    foreach ($file_content['data'] as $key => $val) {
      fputcsv($out, $val);
    }
    fclose($out);
  }
  die();
}