PHP 中处理 Excel:PhpSpreadsheet 和 OpenSpout 库概述
处理 Excel 电子表格是 PHP Web 开发中最常见的任务之一。无论是生成报告、从会计系统导入数据,还是为客户导出统计数据,都离不开处理 .xlsx 和 .xls 格式的工具。在本文中,我们将介绍两个最流行的 PHP 库:PhpSpreadsheet(著名 PHPExcel 的继任者)和 OpenSpout(适用于大文件的轻量级替代方案)。
PhpSpreadsheet — 强大且功能丰富的工具
PhpSpreadsheet 是 PHPOffice 项目的一个库,允许读取、创建和修改 Excel 文件(XLSX、XLS、ODS、CSV 等)。它支持单元格样式化、公式、图表、条件格式,甚至宏操作。
安装 PhpSpreadsheet
通过 Composer 安装:
composer require phpoffice/phpspreadsheet示例:创建一个简单的 Excel 文件
<?phprequire 'vendor/autoload.php';
use PhpOffice\\PhpSpreadsheet\\Spreadsheet;use PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx;
$spreadsheet = new Spreadsheet();$sheet = $spreadsheet->getActiveSheet();
// 填充数据$sheet->setCellValue('A1', 'ID');$sheet->setCellValue('B1', '姓名');$sheet->setCellValue('C1', '邮箱');$sheet->setCellValue('A2', 1);$sheet->setCellValue('B2', '伊万·彼得罗夫');$sheet->setCellValue('C2', 'ivan@example.com');
// 样式化标题$styleArray = [ 'font' => ['bold' => true, 'size' => 14], 'fill' => ['fillType' => 'solid', 'startColor' => ['rgb' => 'E0E0E0']]];$sheet->getStyle('A1:C1')->applyFromArray($styleArray);
// 保存文件$writer = new Xlsx($spreadsheet);$writer->save('users.xlsx');echo "文件 users.xlsx 已创建!";?>读取现有的 Excel 文件
<?phprequire 'vendor/autoload.php';
use PhpOffice\\PhpSpreadsheet\\IOFactory;
$inputFileName = 'users.xlsx';$spreadsheet = IOFactory::load($inputFileName);$sheet = $spreadsheet->getActiveSheet();
foreach ($sheet->getRowIterator() as $row) { $cellIterator = $row->getCellIterator(); $cellIterator->setIterateOnlyExistingCells(false); $rowData = []; foreach ($cellIterator as $cell) { $rowData[] = $cell->getValue(); } echo implode(' | ', $rowData) . "<br>";}?>OpenSpout — 大数据场景下的轻量与高速
OpenSpout 是一个专为处理大量数据(数十万行)而设计的库。与 PhpSpreadsheet 不同,它不会将整个文件加载到内存中,而是以流式方式处理。这使其成为导出/导入大型报告的理想选择。OpenSpout 支持 XLSX、CSV 和 ODS 格式。
安装 OpenSpout
composer require openspout/openspout示例:导出 100,000 行到 XLSX
<?phprequire 'vendor/autoload.php';
use OpenSpout\\Writer\\XLSX\\Writer;
$writer = new Writer();$writer->openToFile('big_export.xlsx');
// 标题$writer->addRow(['ID', '姓名', '邮箱']);
for ($i = 1; $i <= 100000; $i++) { $writer->addRow([$i, "用户 $i", "user$i@example.com"]);}
$writer->close();echo "包含 100,000 行的文件 big_export.xlsx 已创建!";?>使用 OpenSpout 读取大文件
<?phprequire 'vendor/autoload.php';
use OpenSpout\\Reader\\XLSX\\Reader;
$reader = new Reader();$reader->open('big_export.xlsx');
foreach ($reader->getSheetIterator() as $sheet) { foreach ($sheet->getRowIterator() as $row) { $cells = $row->getCells(); echo implode(' | ', array_map(function($cell) { return $cell->getValue(); }, $cells)) . "<br>"; }}
$reader->close();?>何时选择哪个库?
选择 PhpSpreadsheet 当您需要:
- 复杂的样式化(字体、颜色、边框、合并单元格)
- 处理公式和图表
- 处理旧格式
.xls - 修改现有文件并保留其结构
选择 OpenSpout 当您需要:
- 处理包含数十万行的大文件
- 最小化内存消耗
- 快速导出/导入数据,无需复杂样式化
- 仅使用现代格式 XLSX、CSV、ODS
结论
两个库都出色地完成了任务,但适用于不同的场景。PhpSpreadsheet 是用于处理 Excel 的“瑞士军刀”,而 OpenSpout 是用于处理大数据的高速“赛车”。在许多项目中,这两个库可以共存:使用 PhpSpreadsheet 创建带有样式和公式的模板,使用 OpenSpout 导出大量数据。选择适合您任务的工具!