需安装phpspreadsheet并确保php≥7.4,通过move()保存文件后拼绝对路径,用iofactory按后缀创建reader、启用setreaddataonly(true),再逐行读取过滤空行,映射表头字段后批量插入数据库。

想让后台管理员上传一个Excel文件,点击“导入”按钮后自动把数据存进数据库,不报错、不卡死、不丢字段——这需要避开ThinkPHP默认不带Excel解析能力的坑,用对库、写对路径、读对格式。
安装phpspreadsheet并确认环境兼容
打开终端,进入项目根目录,执行:composer require phpoffice/phpspreadsheet。
检查PHP版本:TP6要求PHP ≥ 7.2,而phpspreadsheet 1.20+ 要求 PHP ≥ 7.4;如果当前PHP是7.3或更低,【必须升级PHP否则类加载会静默失败】。
别手动下载ZIP扔进vendor目录——TP6已弃用vendor()函数,且不会自动注册命名空间。
上传Excel并提取真实路径
在控制器中接收文件:$file = $this->request->file('excel_file');。
调用$info = $file->move(ROOT_PATH . 'public' . DS . 'uploads/excel');完成保存,得到$info对象。
【关键一步】不要直接用$_FILES['excel_file']['tmp_name']传给IOFactory——临时文件可能已被PHP清理,路径失效会导致“file not found”错误。
拼出绝对路径:$filePath = ROOT_PATH . 'public' . DS . 'uploads/excel' . DS . $info->getSaveName();。
显式创建Reader并安全读取数据
第一步:用pathinfo($filePath, PATHINFO_EXTENSION)获取真实后缀,转大写后映射为reader类型——'xlsx' → 'Xlsx','xls' → 'Xls'。
第二步:根据后缀创建reader:$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($readerType);。
第三步:启用纯数据模式:$reader->setReadDataOnly(true);跳过公式、样式等非数值内容,内存占用直降60%以上。
第四步:加载文件:$spreadsheet = $reader->load($filePath);。
第五步:获取首张工作表:$worksheet = $spreadsheet->getActiveSheet();。
逐行遍历并过滤空行
方法一:用getRowIterator()配合getCellIterator()精准控制:
$data = [];
foreach ($worksheet->getRowIterator() as $row) {
$cellIterator = $row->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(false); // 必须设为false,否则跳过空单元格
$rowData = [];
foreach ($cellIterator as $cell) {
$rowData[] = $cell->getValue();
}
if (array_filter($rowData)) { // 全空数组返回false,跳过整行
$data[] = $rowData;
}
}
字段映射与批量插入
取第一行为表头:$headers = array_shift($data);。
硬编码映射规则,例如:$map = ['用户姓名' => 'username', '手机号' => 'mobile', '注册时间' => 'created_at'];。
遍历每行数据,按映射生成键值对:$insertData[] = array_combine(array_values($map), $row);。
最后执行:\think\facade\Db::table('users')->insertAll($insertData);。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











