如何批量读取文件夹中多个 Excel (.xlsx) 文件并合并为单个数组

发布时间 - 2026-02-02 00:00:00    点击率:

使用 phpspreadsheet 库遍历指定目录下的所有 .xlsx 文件,逐行提取 a 列(name)和 b 列(price)数据,统一存入一个扁平化的一维关联数组,避免嵌套导致的重复计数或索引错乱。

在 PHP 中批量处理 Excel 文件时,一个常见误区是将每个文件的数据存为子数组(如 $myarr[] = $array),这会导致最终结果为二维结构(如 [[row1, row2], [row3, row4], ...]),不仅增加后续处理复杂度,还可能因 $array 变量未重置而引发数据叠加——正如你遇到的“500–600 条实际数据却得到 1200 条”的问题:内层循环反复向同一个 $array 写入,且每次外层循环都将其整体追加进 $myarr,造成重复累积。

正确做法是跳过中间临时数组,直接将每行解析结果推入顶层 $myarr。以下是优化后的完整实现:

setReadDataOnly(true); // 仅读取值,忽略样式/公式

    try {
        $spreadsheet = $reader->load($file);
        $worksheet = $spreadsheet->getSheet(0); // 默认读取第一个工作表
        $highestRow = $worksheet->getHighestRow();

        // 从第2行开始读取(假设第1行为标题)
        for ($row = 2; $row <= $highestRow; $row++) {
            $name  = $worksheet->getCell('A'

. $row)->getValue() ?: ''; $price = $worksheet->getCell('B' . $row)->getValue() ?: ''; // 直接追加关联数组元素(非嵌套!) $myarr[] = [ 'name' => trim((string)$name), 'price' => is_numeric($price) ? (float)$price : 0.0 ]; } } catch (Exception $e) { error_log("Failed to read {$file}: " . $e->getMessage()); continue; } } // 输出验证(生产环境建议用 json_encode 或分页处理) echo '
';
print_r($myarr);
echo '
'; ?>

关键改进点说明:

  • 取消 $array 中间变量:避免因作用域不清或未重置导致的数据污染;
  • 直接操作 $myarr[]:确保所有行数据线性追加,最终得到纯净的一维数组(共 N 条记录);
  • 使用 getCell() 替代 getCellCollection():更直观、性能更好,且避免 getCellCollection() 在空单元格时返回 null 引发的潜在警告;
  • 增加异常捕获:单个文件损坏不影响整体流程;
  • 类型安全处理:对 name 强制转字符串并去空格,对 price 做数值校验与默认值兜底。

⚠️ 注意事项:

  • 确保 prices/ 目录存在且 PHP 进程有读取权限;
  • 若 Excel 表头不在第1行或数据列非 A/B,请同步调整 $row 起始值及单元格坐标;
  • 大量文件(如 >100 个)或超大表格(>10k 行)时,建议启用 readFilter 或改用流式读取(Xlsx::readFilter)以降低内存占用;
  • 生产环境请勿直接 print_r 敏感数据,应结合日志、API 响应或数据库持久化处理。

至此,你将获得一个结构统一、无冗余、可直接用于导出、统计或 API 返回的标准 PHP 关联数组。


# php  # excel  # js  # json  # office  # ai  # 作用域  # 敏感数据  # 内存占用  # Array  # NULL  # 关联数组  # 字符串  # 循环  # 数据库  # 单元格  # 第一个  # 遍历  # 将其  # 自动识别  # 分页  # 不清  # 你将  # 可直接  # 这会 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 香港服务器网站卡顿?如何解决网络延迟与负载问题?  JS碰撞运动实现方法详解  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  网站制作免费,什么网站能看正片电影?  详解jQuery中基本的动画方法  微信公众帐号开发教程之图文消息全攻略  jQuery中的100个技巧汇总  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  html如何与html链接_实现多个HTML页面互相链接【互相】  网站制作软件有哪些,制图软件有哪些?  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  EditPlus中的正则表达式 实战(1)  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  android nfc常用标签读取总结  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  青岛网站建设如何选择本地服务器?  使用豆包 AI 辅助进行简单网页 HTML 结构设计  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  Android使用GridView实现日历的简单功能  如何在云主机快速搭建网站站点?  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  公司网站制作需要多少钱,找人做公司网站需要多少钱?  Python图片处理进阶教程_Pillow滤镜与图像增强  千库网官网入口推荐 千库网设计创意平台入口  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  Python面向对象测试方法_mock解析【教程】  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  深圳网站制作培训,深圳哪些招聘网站比较好?  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  JavaScript如何实现类型判断_typeof和instanceof有什么区别  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  黑客如何通过漏洞一步步攻陷网站服务器?  简历在线制作网站免费版,如何创建个人简历?  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  大同网页,大同瑞慈医院官网?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  Swift开发中switch语句值绑定模式  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  网页设计与网站制作内容,怎样注册网站?  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  中国移动官方网站首页入口 中国移动官网网页登录  如何安全更换建站之星模板并保留数据?