You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PhpSpreadsheet读取Excel报错:无法打开文件求助

解决PhpSpreadsheet无法读取从OneDrive复制的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.xlsx
    
    若文件夹权限也有问题,可递归设置:
    chmod -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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 03:52:42