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