如何批量读取文件夹中多个 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控制动态【绘制】
中国移动官方网站首页入口 中国移动官网网页登录
如何安全更换建站之星模板并保留数据?


