推荐使用PhpSpreadsheet库读取和写入Excel文件,它支持.xlsx、.xls、.csv格式,具备完整读写能力;还可选用SimpleXLSX轻量解析.xlsx,或用fgetcsv/fputcsv高效处理CSV,Windows环境可借助COM组件调用本地Excel。

如果您需要在PHP中处理Excel表格数据,但缺乏对文件格式解析与生成机制的理解,则可能面临读取失败、中文乱码、内存溢出或导出文件无法打开等问题。以下是解决PHP操作Excel文件的多种实用方法:
一、使用PhpSpreadsheet库读取Excel文件
PhpSpreadsheet是PHPExcel的官方继任者,采用面向对象方式将Excel文件抽象为可遍历的工作表与单元格集合,支持.xlsx、.xls及.csv格式,具备完整读写能力且持续维护。
1、通过Composer安装库:composer require phpoffice/phpspreadsheet
2、在脚本开头引入自动加载器:require 'vendor/autoload.php';
立即学习“PHP免费学习笔记(深入)”;
3、使用IOFactory加载文件并获取活动工作表:$spreadsheet = PhpOffice\PhpSpreadsheet\IOFactory::load('data.xlsx'); $sheet = $spreadsheet->getActiveSheet();
4、逐行读取单元格值并存入数组:foreach ($sheet->getRowIterator() as $row) { $cellIterator = $row->getCellIterator(); $cellIterator->setIterateOnlyExistingCells(false); foreach ($cellIterator as $cell) { $rowData[] = $cell->getValue(); } $data[] = $rowData; }
二、使用PhpSpreadsheet库导出Excel文件
该方法适用于从数组、数据库查询结果等来源生成标准.xlsx文件,支持单元格样式、多工作表及公式写入,输出过程需设置正确HTTP头以触发浏览器下载行为。
1、创建新的Spreadsheet实例:$spreadsheet = new PhpOffice\PhpSpreadsheet\Spreadsheet();
2、获取默认工作表并写入表头:$sheet = $spreadsheet->getActiveSheet(); $sheet->setCellValue('A1', '姓名'); $sheet->setCellValue('B1', '城市');
3、批量写入二维数据数组:$dataArray = [['张三', '北京'], ['李四', '上海']]; $sheet->fromArray($dataArray, NULL, 'A2');
4、配置响应头并输出至浏览器:header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="export.xlsx"'); $writer = PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx'); $writer->save('php://output');
三、使用SimpleXLSX库轻量读取.xlsx文件
SimpleXLSX是一个单文件、无依赖的解析器,专为快速只读场景设计,不加载样式与公式,内存占用极低,适合处理中小型.xlsx文件且无需Composer环境。
1、下载simplexlsx.class.php并放入项目目录:wget https://github.com/shuchkin/simplexlsx/raw/master/src/SimpleXLSX.php -O simplexlsx.class.php
2、引入类文件并实例化:require 'simplexlsx.class.php'; $xlsx = new SimpleXLSX('data.xlsx');
3、验证文件有效性后获取全部行数据:if ($xlsx->success()) { $rows = $xlsx->rows(); foreach ($rows as $row) { echo $row[0] ?? ''; } }
4、读取指定工作表(如第二个)的数据:$rows = $xlsx->rows(1); // 索引从0开始
四、使用原生fgetcsv函数处理CSV格式Excel导出文件
当Excel文件实际为CSV编码(例如用户通过Excel另存为“CSV UTF-8”格式),可跳过第三方库,直接用PHP内置函数高效解析,特别适合大数据量导入场景,避免XML解析开销。
1、以只读方式打开CSV文件句柄:$handle = fopen('data.csv', 'r'); if (!$handle) { die('无法打开文件'); }
2、逐行读取并按逗号分隔字段:while (($row = fgetcsv($handle, 0, ',')) !== FALSE) { print_r($row); }
3、关闭文件句柄释放资源:fclose($handle);
4、导出CSV时使用fputcsv写入带BOM头的UTF-8文件(防止Excel乱码):$fp = fopen('output.csv', 'w'); fwrite($fp, "\xEF\xBB\xBF"); fputcsv($fp, ['姓名', '年龄']); fputcsv($fp, ['王五', 30]); fclose($fp);
五、使用COM组件在Windows服务器上调用本地Excel应用
该方式绕过PHP库限制,直接调用系统已安装的Microsoft Excel进程进行数据提取,适用于无法部署扩展或需精确还原公式的特殊遗留环境,但仅限Windows平台且要求Excel软件已安装。
1、确认php.ini中启用com_dotnet扩展:extension=php_com_dotnet.dll
2、重启Web服务器使扩展生效
3、创建COM对象并打开Excel文件:$excel = new COM("Excel.Application") or die("启动Excel失败"); $excel->Visible = false; $workbook = $excel->Workbooks->Open(realpath('data.xlsx'));
4、读取第一张工作表第一行第一列内容:$worksheet = $workbook->Worksheets(1); $value = $worksheet->Cells(1, 1)->Value; echo $value;
5、关闭工作簿与Excel进程:$workbook->Close(); $excel->Quit(); $excel = null;



















