PHPExcel读取xlsx文件报Could not open错误如何解决
问题修复方案
核心错误原因
- 你通过
scandir获取到的仅为文件名,没有拼接完整的文件路径,PHPExcel加载时会在当前脚本执行目录搜索文件,无法匹配到rdv/100$i/子目录下的Excel文件 scandir默认返回.、..两个特殊目录项,按文件名降序排序时..会排在首位,直接取$files[0]拿到的是上级目录而非目标Excel文件scandir自带的排序是按文件名排序,并非按文件实际保存时间排序,无法保证拿到的是最新文件- 遍历子目录的逻辑硬编码了
100$i的命名格式,扩展性差,一旦子目录命名规则变动就会失效
修复后代码
include 'database.php'; require 'PHPExcel/Classes/PHPExcel.php'; require_once 'PHPExcel/Classes/PHPExcel/IOFactory.php'; // 接收前端按钮触发的POST请求 if($_SERVER['REQUEST_METHOD'] == "POST" and isset($_POST['someAction'])) { func(); } function func() { // 直接获取rdv下所有子目录,避免硬编码目录名 $folders = glob('rdv/*', GLOB_ONLYDIR); if (empty($folders)) { echo '未找到任何子目录'; return; } foreach ($folders as $folder) { echo "正在处理目录:{$folder}<br>"; // 获取目录下所有xlsx文件 $files = glob($folder . '/*.xlsx'); if (empty($files)) { echo "{$folder} 目录下无xlsx文件,跳过<br>"; continue; } // 按文件修改时间倒序排序,取最新的文件 usort($files, function($a, $b) { return filemtime($b) - filemtime($a); }); $newest_file = $files[0]; echo "最新文件为:{$newest_file}<br>"; // 加载Excel文件,这里传入的是完整路径,不会找不到文件 try { $objExcel = PHPExcel_IOFactory::load($newest_file); $activeSheet = $objExcel->getActiveSheet(); $dossier = $activeSheet->getCell('A3')->getValue(); $facture = $activeSheet->getCell('B21')->getValue(); $date = $activeSheet->getCell('Q1')->getValue(); // 插入数据库 insertInto($dossier, $facture, $date); echo "{$newest_file} 数据处理完成<br>"; // 清理PHPExcel内存占用,避免处理多个文件时内存溢出 $objExcel->disconnectWorksheets(); unset($objExcel); } catch (PHPExcel_Reader_Exception $e) { echo "文件{$newest_file}加载失败:" . $e->getMessage() . "<br>"; continue; } } }
补充优化说明
- 增加了异常捕获逻辑,避免单个文件加载失败导致整个脚本终止
- 增加了内存清理逻辑,PHPExcel内存占用较高,处理多个文件时如果不清理容易触发内存溢出
- 遍历目录改为动态读取所有子目录,不再硬编码
100$i格式,适配后续目录扩展 - 只读取后缀为
.xlsx的文件,避免读取到目录或其他格式文件导致报错
内容的提问来源于stack exchange,提问作者MI7QC
相关产品推荐
相关产品推荐

