PHP 中处理 Excel:PhpSpreadsheet 和 OpenSpout 库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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 导出大量数据。选择适合您任务的工具!

推荐