- 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;
}
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);
}