使用PhpSpreadsheet读取Excel报错:无法打开文件求助
错误信息
Fatal error: Uncaught PhpOffice\PhpSpreadsheet\Reader\Exception: Could not open "GradeTrackingv2.xlsx" for reading. in /Applications/XAMPP/xamppfiles/htdocs/excelTest/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/File.php:151 Stack trace: #0 /Applications/XAMPP/xamppfiles/htdocs/excelTest/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IOFactory.php(133): PhpOffice\PhpSpreadsheet\Shared\File::assertFile('GradeTrackingv2...') #1 /Applications/XAMPP/xamppfiles/htdocs/excelTest/grades.php(33): PhpOffice\PhpSpreadsheet\IOFactory::createReaderForFile('GradeTrackingv2...') #2 {main} thrown in /Applications/XAMPP/xamppfiles/htdocs/excelTest/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/File.php on line 151
问题场景
从OneDrive复制GradeTrackingv2.xlsx到XAMPP的htdocs目录后,PhpSpreadsheet无法读取该文件;但在htdocs目录新建Excel表格并复制原文件内容后,可正常读取。需要实现直接复制文件即可读取的方案。
可能原因及解决方案
1. 文件权限或锁定问题
OneDrive同步的文件可能残留锁定状态,或PHP进程无读取权限:
- 检查并调整文件权限:在终端执行命令,确保PHP进程(XAMPP的Apache用户)能读取文件:
若文件夹权限也有问题,可递归设置:chmod 644 /Applications/XAMPP/xamppfiles/htdocs/excelTest/GradeTrackingv2.xlsxchmod -R 755 /Applications/XAMPP/xamppfiles/htdocs/excelTest/ - 解除OneDrive文件锁定:复制文件前确保OneDrive已完成同步,或暂时关闭OneDrive同步后再复制,避免文件处于被占用状态。
2. 文件元数据或损坏问题
OneDrive复制的文件可能带有额外同步元数据,或复制过程中文件损坏:
- 重新保存文件清除元数据:用Excel打开复制过来的
GradeTrackingv2.xlsx,选择「另存为」→ 选择XLSX格式,覆盖原文件。此操作会清除OneDrive附加的同步信息,修复潜在的文件结构问题。 - 自动同步时验证文件完整性:若需要定期同步,可在复制后用PHP检查文件是否可读,或添加文件校验步骤,比如:
$inputFileName = "GradeTrackingv2.xlsx"; if (!is_readable($inputFileName)) { die("文件不可读,请检查权限或文件完整性"); } // 后续PhpSpreadsheet读取代码
3. 代码优化(非核心问题,但可简化)
原代码中重复创建了Reader实例,可简化为:
require 'vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\IOFactory; $inputFileName = "GradeTrackingv2.xlsx"; $reader = IOFactory::createReaderForFile($inputFileName); $reader->setReadDataOnly(true); $spreadsheet = $reader->load($inputFileName); $activeSheet = $spreadsheet->getActiveSheet(); $data_array = $activeSheet->toArray();
内容的提问来源于stack exchange,提问作者Neil White

