安装phpoffice/phpspreadsheet
composer require phpoffice/phpspreadsheet
HTTP控制中实现10W条数据导出
/**
* 测试导出10条数据到csv
*/
public function exportCsv(){
//生成10万条数据
for($i=0;$i<=100000;$i++){
$arrData[] = [
'id' => $i+1,
'name' => '用户'.($i+1)
];
}
$title = [['编号', '用户'],];
$arrData = array_merge($title, $arrData);
$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
// 设置单元格格式 可以省略
$styleArray = ['font' => ['bold' => true, 'size' => 14,],];
$spreadsheet->getActiveSheet()->getStyle('A1:B1')->applyFromArray($styleArray);
$spreadsheet->getActiveSheet()->getColumnDimension('A')->setWidth(25);
$spreadsheet->getActiveSheet()->getColumnDimension('B')->setWidth(25);
$spreadsheet->getActiveSheet()->fromArray($arrData);
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Csv($spreadsheet);
$writer->setPreCalculateFormulas(false);
//这里可以写绝对路径,其他框架到这步就结束了
$writer->save(EASYSWOOLE_ROOT.'/public/excel/test.xlsx');
//关闭连接,销毁变量
$spreadsheet->disconnectWorksheets();
unset($spreadsheet);
//生成文件后,使用response输出
$this->response()->write(file_get_contents(EASYSWOOLE_ROOT.'/public/excel/test.xlsx'));
$this->response()->withHeader('Content-type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
$this->response()->withHeader('Content-Disposition', 'attachment;filename="test.csv"');
$this->response()->withHeader('Cache-Control','max-age=0');
$this->response()->end();
return false;
}
查看导出结果
编号 | 用户 |
1 | 用户1 |
2 | 用户2 |
3 | 用户3 |
4 | 用户4 |
中间省略多行数据... | |
99997 | 用户99997 |
99998 | 用户99998 |
99999 | 用户99999 |
100000 | 用户100000 |
100001 | 用户100001 |
注:
1.数据量大的时候不建议使用xlsx或xls导出表格(超过万条建议使用csv导出)
2.导出数据量过大时,容易导致内存溢出。(正常业务需求也不会导出如此多的数据,导得出来打开也是个问题)
[DEBUG][ERROR] : [Allowed memory size of 268435456 bytes exhausted (tried to allocate 262144 bytes) at file:/www/wwwroot/www.host.com/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Cells.php line:391]
可调整php.ini中参数 memory_limit的值,默认128M
本文为够意思原创文章,转载无需和我联系,但请注明来自够意思博客blog.go1s.cn:够意思博客 » EasySwoole 使用phpoffice/phpspreadsheet导出Csv 10万数据