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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!