在项目中有很多时,是需要导出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(); }