悠悠楠杉
Excel导出全攻略:用PhpSpreadsheet实现高效数据导出(深度教程)
一、为什么选择PhpSpreadsheet?
在开发后台管理系统时,数据导出Excel是刚需。早年我们常用PHPExcel,但它的性能瓶颈明显(单个文件超过5MB就卡顿)。PhpSpreadsheet作为其现代替代品,不仅支持PHP7+,还优化了内存管理,实测导出50万行数据内存占用仅增加30%。
安装只需一行命令:
bash
composer require phpoffice/phpspreadsheet
二、基础导出七步法
创建空白工作簿
php use PhpOffice\PhpSpreadsheet\Spreadsheet; $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet();设置表头技巧
建议使用关联数组动态生成表头:
php $headers = ['ID', '用户名', '注册时间']; foreach($headers as $col => $title) { $sheet->setCellValueByColumnAndRow($col+1, 1, $title); }填充数据实战
数据库查询结果直接写入:
php $data = UserModel::all(); // 假设是Eloquent集合 $row = 2; // 从第二行开始 foreach($data as $item) { $sheet->setCellValue('A'.$row, $item->id) ->setCellValue('B'.$row, $item->username) ->setCellValue('C'.$row, $item->created_at); $row++; }样式美化方案
添加边框和背景色:
php $styleArray = [ 'borders' => [ 'allBorders' => ['borderStyle' => 'thin'], ], 'fill' => [ 'fillType' => 'solid', 'color' => ['argb' => 'FFCCCCCC'] ] ]; $sheet->getStyle('A1:C1')->applyFromArray($styleArray);列宽自适应
php foreach(range('A','C') as $column) { $sheet->getColumnDimension($column)->setAutoSize(true); }导出格式选择
支持xlsx、csv、pdf等多种格式:
php $writer = new Xlsx($spreadsheet); // $writer = new Csv($spreadsheet);浏览器下载实现
php header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="users.xlsx"'); $writer->save('php://output'); exit;
三、高级功能实战
1. 动态多Sheet处理
php
$spreadsheet->createSheet();
$spreadsheet->setActiveSheetIndex(1);
$sheet2 = $spreadsheet->getActiveSheet();
$sheet2->setTitle('订单数据');
// 写入第二张表数据...
2. 复杂单元格合并
php
$sheet->mergeCells('A1:D1');
$sheet->setCellValue('A1', '2023年度销售汇总');
3. 公式计算支持
php
$sheet->setCellValue('D2', '=SUM(A2:C2)');
四、性能优化方案
内存控制
启用单元格缓存:
php $cacheSettings = new Memory(); \PhpOffice\PhpSpreadsheet\Settings::setCache($cacheSettings);分块写入
大数据量建议每5000行保存一次:
php if($row % 5000 == 0) { $writer->save('temp_'.$row.'.xlsx'); }定时清理
php $spreadsheet->disconnectWorksheets(); unset($spreadsheet);
五、常见问题排查
中文乱码
确保文件头部声明:
php header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=utf-8');超时处理
settimelimit(0) 取消执行时间限制样式不生效
检查是否在最后才应用样式,避免被后续操作覆盖
