PHP 导出 CSV 格式文件
PHP导出CSV文件
优点
- 导出文件数据大
- csv文件体积比excel小
- 相比于PHPExcel 插件占用内存少
缺点
- 直接使用excel软件打开,可能导致数字前面的0丢失,长数字被转成科学计数法
数字0丢失和长数字被转换问科学计数法的解决办法
- 打开一个空白的excel模板
- 点击导航栏的数据
- 选择导入文本文件
- 导入csv
- 选择csv
- 文件类型选择逗号分隔符,分隔符号(选择逗号或分号)
- 列数据格式选择(点击每列,将一些数字列选择为文本)
- 完成导入
- 另存为excel
//示例代码,参数格式['title' => ['标题'],'content' => [['我是标题']]]
function exportSpreadsheetCsv($arrData, $fileName)
{
$delimiter = ',';//经过测试
header('Content-Description: File Transfer');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename=' . $fileName . '.csv');
header('Cache-Control: max-age=0');
$fp = fopen('php://output', 'a'); //打开output流
$csvTitle = chr(0xEF). chr(0xBB). chr(0xBF);
foreach ($arrData['title'] as $title) {
$csvTitle .= '"'.$title.'"'.$delimiter;
}
$csvTitle = substr($csvTitle, 0, -1);
$csvTitle .= PHP_EOL;
fputs($fp, $csvTitle,strlen($csvTitle));
$dataNum = count($arrData['content']);
$perSize = 1000; //每次导出的条数
$pages = ceil($dataNum / $perSize);
for ($i = 1; $i <= $pages; $i++) {
$step = ($i * $perSize) - 1;
$csvData = '';
foreach ($arrData['content'] as $key => $item) {
if ($key > $step || $key <= $step - $perSize) {
continue;
}
array_map(function($val)use(&$csvData,$delimiter){
//替换逗号,防止导致csv格式错乱
$val = (string)$val;
if(!empty($val) && (strpos($val,',') !== false || strpos($val,',') !== false)){
$val = str_replace([',',','],[' ',' '],$val);
}
$csvData .= '"'.$val.'"'.$delimiter;
return $val;
},$item);
$csvData = substr($csvData, 0, -1);
$csvData .= PHP_EOL;
}
fputs($fp, $csvData,strlen($csvData));
//刷新输出缓冲到浏览器
flush(); //必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。
}
fclose($fp);
unset($arrData);
exit;
}
本作品采用《CC 协议》,转载必须注明作者和本文链接