PHP处理Excel文件有五种常用方法:一、PhpSpreadsheet读取;二、PhpSpreadsheet写入;三、fgetcsv/str_getcsv解析CSV;四、ODBC/PDO连接(Windows限定);五、Spout流式处理超大文件。

如果您需要在PHP中处理Excel文件,例如读取现有数据或向Excel文件写入新内容,则可能面临格式兼容性、内存占用和功能限制等问题。以下是几种常用的操作方法:
一、使用PhpSpreadsheet库读取Excel文件
PhpSpreadsheet是PHPExcel的官方继任者,支持.xlsx、.xls、.csv等多种格式,具备完整的读取能力,且维护活跃、文档完善。
1、通过Composer安装库:composer require phpoffice/phpspreadsheet
2、创建PHP脚本并引入自动加载器:require 'vendor/autoload.php';
立即学习“PHP免费学习笔记(深入)”;
3、实例化读取器并加载文件:$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx'); $spreadsheet = $reader->load('data.xlsx');
4、获取活动工作表并读取单元格值:$sheet = $spreadsheet->getActiveSheet(); $value = $sheet->getCell('A1')->getValue();
二、使用PhpSpreadsheet库写入Excel文件
该方法适用于生成新的Excel文件或将数据追加至已有文件,支持样式设置、公式写入与多工作表操作。
1、创建新的Spreadsheet对象:$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
2、获取默认工作表并写入数据:$sheet = $spreadsheet->getActiveSheet(); $sheet->setCellValue('A1', '姓名'); $sheet->setCellValue('B1', '年龄');
3、批量写入二维数组数据:$dataArray = [['张三', 25], ['李四', 30]]; $sheet->fromArray($dataArray, NULL, 'A2');
4、设置输出头并保存为.xlsx文件:$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx'); header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="output.xlsx"'); $writer->save('php://output');
三、使用fgetcsv配合str_getcsv解析CSV格式Excel导出文件
当Excel文件实际为CSV编码(如Excel另存为CSV UTF-8格式)时,可绕过复杂库依赖,用原生函数高效读取,适合大数据量场景。
1、打开CSV文件句柄:$handle = fopen('data.csv', 'r');
2、逐行读取并解析字段:while (($row = fgetcsv($handle, 0, ',')) !== FALSE) { print_r($row); }
3、关闭文件句柄:fclose($handle);
4、写入CSV时使用fputcsv函数:$fp = fopen('output.csv', 'w'); fputcsv($fp, ['姓名', '城市']); fputcsv($fp, ['王五', '上海']); fclose($fp);
四、使用ODBC或PDO连接Excel文件(Windows限定)
在Windows服务器环境中,可通过Microsoft Access Database Engine驱动将Excel文件视为数据库表,使用SQL语句进行查询与插入。
1、确认已安装Access Database Engine驱动,并启用对应ODBC数据源。
2、建立PDO连接字符串:$dsn = 'odbc:Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=C:\\path\\to\\file.xlsx;';
3、执行SELECT查询读取数据:$pdo = new PDO($dsn); $stmt = $pdo->query("SELECT * FROM [Sheet1$]"); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
4、插入数据需确保目标工作表结构存在,且使用INSERT INTO语法:$pdo->exec("INSERT INTO [Sheet1$] (F1,F2) VALUES ('新记录','值')");
五、使用Spout库进行超大Excel文件流式读写
Spout专为处理超大Excel文件设计,采用流式I/O机制,内存占用极低,不支持公式与样式,但读写速度显著优于PhpSpreadsheet。
1、通过Composer安装:composer require box/spout
2、读取.xlsx文件并遍历行:use Box\Spout\Reader\ReaderFactory; use Box\Spout\Common\Type; $reader = ReaderFactory::create(Type::XLSX); $reader->open('large.xlsx'); foreach ($reader->getSheetIterator() as $sheet) { foreach ($sheet->getRowIterator() as $row) { echo implode(',', $row); } } $reader->close();
3、写入.xlsx文件:use Box\Spout\Writer\WriterFactory; $writer = WriterFactory::create(Type::XLSX); $writer->openToFile('output.xlsx'); $writer->addRow(['ID', 'Name']); $writer->addRows([[1, 'Alice'], [2, 'Bob']]); $writer->close();











