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

云辰酱_4600

云辰酱_4600

2026-02-02

295人浏览

原创

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

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

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

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

<?php require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\IOFactory;

$filelist = glob("prices/*.xlsx");
$myarr = []; // 初始化空的一维数组

foreach ($filelist as $file) {
    // 自动识别格式并创建 Reader
    $reader = IOFactory::createReaderForFile($file);
    $reader->setReadDataOnly(true); // 仅读取值,忽略样式/公式

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

        // 从第2行开始读取(假设第1行为标题)
        for ($row = 2; $row 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 '<pre class="brush:php;toolbar:false;">';
print_r($myarr);
echo '
'; ?>

✅ 关键改进点说明:

Excel 打印区外内容清理
Excel 打印区外内容清理

一键清除Excel打印区域外的残留内容,打印区内所见即所得。方便提交给客户,实现打印区外内容保密的目的。适用场景:给客户提交报价、计算书等。

下载
  • 取消 $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 关联数组。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

549

3

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

2024.03.01

1698

6

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1858

5

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

2964

5

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

2023.10.24

6244

49

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

2023.11.24

6189

6

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

2024.03.22

7754

16

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

2024.04.29

11774

11

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

2025.07.29

6079

17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习