在PHP中处理Excel:最佳库概述
电子表格处理是Web开发中的常见任务之一。PHP中有几个经过验证的工具可用于创建、读取和编辑Excel文件。在本文中,我们将介绍两个关键库:PhpSpreadsheet(流行PHPExcel的继承者)和轻量级的OpenSpout,专为快速读写大文件而设计。
1. 通过Composer安装
这两个库都可以通过标准包管理器Composer安装。在项目根目录的终端中执行:
# 对于PhpSpreadsheet(全功能Excel处理)composer require phpoffice/phpspreadsheet
# 对于OpenSpout(大数据集上的高性能)composer require openspout/openspout安装后,在脚本开头引入自动加载:
require_once __DIR__ . '/vendor/autoload.php';2. PhpSpreadsheet:创建和样式化Excel文件
该库支持XLSX、XLS、ODS、CSV等格式。允许管理样式、合并单元格、插入图片和公式。
示例:创建简单报表
use PhpOffice\\PhpSpreadsheet\\Spreadsheet;use PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx;use PhpOffice\\PhpSpreadsheet\\Style\\Alignment;
$spreadsheet = new Spreadsheet();$sheet = $spreadsheet->getActiveSheet();
// 标题$sheet->setCellValue('A1', '商品');$sheet->setCellValue('B1', '数量');$sheet->setCellValue('C1', '价格,卢布');
// 数据$data = [ ['笔记本电脑', 5, 45000], ['显示器', 10, 15000], ['键盘', 20, 2500],];$row = 2;foreach ($data as $item) { $sheet->setCellValue("A{$row}", $item[0]); $sheet->setCellValue("B{$row}", $item[1]); $sheet->setCellValue("C{$row}", $item[2]); $row++;}
// 总计公式$sheet->setCellValue("A{$row}", '总计');$sheet->setCellValue("C{$row}", "=SUM(C2:C" . ($row-1) . ")");
// 标题样式$styleHeader = [ 'font' => ['bold' => true, 'size' => 12], 'alignment' => ['horizontal' => Alignment::HORIZONTAL_CENTER], 'fill' => ['fillType' => \\PhpOffice\\PhpSpreadsheet\\Style\\Fill::FILL_SOLID, 'color' => ['rgb' => 'E0E0E0']]];$sheet->getStyle('A1:C1')->applyFromArray($styleHeader);
// 自动列宽foreach (range('A', 'C') as $col) { $sheet->getColumnDimension($col)->setAutoSize(true);}
// 保存$writer = new Xlsx($spreadsheet);$writer->save('report.xlsx');echo "文件 report.xlsx 已创建!";读取现有XLSX文件
use PhpOffice\\PhpSpreadsheet\\IOFactory;
$inputFileName = 'example.xlsx';$spreadsheet = IOFactory::load($inputFileName);$sheet = $spreadsheet->getActiveSheet();
$highestRow = $sheet->getHighestRow();$highestColumn = $sheet->getHighestColumn();
for ($row = 1; $row <= $highestRow; $row++) { $rowData = $sheet->rangeToArray("A{$row}:{$highestColumn}{$row}", NULL, TRUE, FALSE); echo implode(', ', $rowData[0]) . "<br>";}3. OpenSpout:快速处理大表格
OpenSpout针对流式读写进行了优化。它不支持样式和公式,但非常适合导出数千行数据(例如,从数据库导出)。
示例:写入10,000行到CSV/XLSX
use OpenSpout\\Writer\\XLSX\\Writer;use OpenSpout\\Common\\Entity\\Row;
$writer = new Writer();$writer->openToFile('big_export.xlsx');
// 标题$headerRow = Row::fromValues(['ID', '姓名', 'Email']);$writer->addRow($headerRow);
for ($i = 1; $i <= 10000; $i++) { $row = Row::fromValues([$i, "用户{$i}", "user{$i}@example.com"]); $writer->addRow($row);}
$writer->close();echo "导出完成!";逐行读取大XLSX文件
use OpenSpout\\Read