美文网首页
php 导出大量csv,分批生成多个csv文件,打包压缩成zip

php 导出大量csv,分批生成多个csv文件,打包压缩成zip

作者: 阿然学编程 | 来源:发表于2023-07-13 16:42 被阅读0次
    • php 导出大量csv,分批生成多个csv文件,打包压缩成zip
    /**
     * @param $filename
     * @param array $headerFields
     * @param array $data
     * @param int $chunkSize
     * @param string $filenamePrefix
     * @param string $filepath
     * @return bool|string
     */
    function exp_csv_zip($filename, array $headerFields, array $data, $chunkSize = 100000, $filepath = './file/zip/csv', $filenamePrefix = 'sheet_')
    {
        // 设置最大执行时间和内存限制
        set_time_limit(0); // 设置最大执行时间为无限制
        ini_set('memory_limit', -1); // 设置最大内存限制为无限制
    
        /**
         * 生成CSV数据的生成器函数
         * @param array $arrs 数据数组
         * @return Generator 生成器对象
         */
        function csvGenerator($arrs)
        {
            foreach ($arrs as $v) {
                yield (array)$v;
            }
        }
    
        // 创建目录(如果不存在)
        if (!is_dir($filepath)) {
            mkdir($filepath, 0777, true);
        }
    
        // 将数据分割成多个块
        $dataChunks = array_chunk($data, $chunkSize);
    
        // 逐个生成CSV文件并命名
        $fileCount = 1;
        foreach ($dataChunks as $dataChunk) {
    
            $file = fopen($filepath . '/' . $filenamePrefix . $fileCount . '.csv', 'w');
    
            // 添加 UTF-8 BOM
            fwrite($file, chr(239) . chr(187) . chr(191));
    
            // 写入CSV文件头部
            fputcsv($file, $headerFields);
    
            $generator = csvGenerator($dataChunk);
    
            // 写入CSV文件内容
            foreach ($generator as $row) {
    
                fputcsv($file, $row);
            }
    
            fclose($file);
    
            $fileCount++;
        }
    
        // 创建一个压缩文件,并将所有CSV文件添加到压缩文件中
        $zip = new \ZipArchive();
        $zipname = $filepath . '/' . $filename . '.zip';
        if ($zip->open($zipname, ZipArchive::CREATE) === TRUE) {
            for ($i = 1; $i < $fileCount; $i++) {
                $csvFile = $filepath . '/' . $filenamePrefix . $i . '.csv';
                $zip->addFile($csvFile, $filenamePrefix . $i . '.csv');
            }
            $zip->close();
    
            // 删除所有单独的CSV文件
            for ($i = 1; $i < $fileCount; $i++) {
                $filename = $filepath . '/' . $filenamePrefix . $i . '.csv';
                unlink($filename);
            }
        } else {
            // 压缩文件创建失败,不删除CSV文件
            return false;
        }
    
        return $zipname;
    }
    
    • 调用示例(thinkphp)
        public function test()
        {
            // 使用示例
            $filename = 'data1'; // zip文件名(不包含扩展名)
            $headerFields = ['拨打id', '质检时间', '提交结果', '工号', '任务队列', '坐席名', '录音地址', '拨打时间', '结束时间', '技能组', '主叫', '被叫', '拨打类型']; // CSV文件的首行标题字段
            $data = Db::name('audios')->select();
    
            $zipFilePath = exp_csv_zip($filename, $headerFields, $data, 10000);
    
            $filename = basename($zipFilePath);
            // 提供压缩文件下载
            header('Content-Type: application/zip;charset=utf-8');
            header('Content-Disposition: attachment; filename="' . $filename . '"');
            header('Content-Encoding: binary');
            // 禁止缓存
            header('Cache-Control: no-cache, max-age=0');
            header('Pragma: no-cache');
            readfile($zipFilePath);
        }
    
    image.png

    相关文章

      网友评论

          本文标题:php 导出大量csv,分批生成多个csv文件,打包压缩成zip

          本文链接:https://www.haomeiwen.com/subject/vwbmudtx.html