如何在PHP中读取Excel分组行?现有代码无法获取分组
在PhpSpreadsheet中读取Excel分组行的正确方法
嘿,我懂你的困扰了——你当前的代码拿不到Excel里的分组行信息,核心问题就出在$reader->setReadDataOnly(TRUE)这行上!当你开启ReadDataOnly模式时,PhpSpreadsheet只会读取单元格里的纯文本/数值数据,所有和格式、分组结构相关的元数据都会被直接忽略掉。
下面是正确的处理步骤和示例代码:
1. 关闭只读数据模式
首先要去掉setReadDataOnly(TRUE),或者显式设置为FALSE(默认就是FALSE,所以也可以直接不写这行),这样才能让阅读器加载分组信息:
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx'); // 去掉这行:$reader->setReadDataOnly(TRUE); 或者改成 $reader->setReadDataOnly(FALSE); $spreadsheet = $reader->load("bulat_price.xlsx"); $worksheet = $spreadsheet->getActiveSheet();
2. 获取行分组信息
工作表对象提供了getRowGroupInfo()方法,专门用来获取所有行分组的详细信息。这个方法返回的是一个数组,每个元素对应一个分组,包含以下关键字段:
startRow: 分组的起始行号endRow: 分组的结束行号level: 分组的层级(嵌套深度)collapsed: 分组是否处于折叠状态(布尔值)
示例代码:
// 获取所有行分组信息 $rowGroups = $worksheet->getRowGroupInfo(); // 遍历输出分组详情 foreach ($rowGroups as $group) { echo "分组范围:行{$group['startRow']} 到 行{$group['endRow']}\n"; echo "分组层级:{$group['level']}\n"; echo "是否折叠:" . ($group['collapsed'] ? '是' : '否') . "\n\n"; }
3. 结合数据与分组信息
如果你需要把分组信息和单元格数据对应起来,可以先读取所有数据,再根据分组的起始/结束行来关联:
// 读取所有单元格数据 $allData = $worksheet->toArray(); // 遍历分组,匹配对应行的数据 foreach ($rowGroups as $group) { echo "=== 分组:行{$group['startRow']} 到 行{$group['endRow']} ===\n"; // 注意:toArray()返回的数组是从索引0开始,而行号是从1开始,所以要减1 for ($i = $group['startRow'] - 1; $i <= $group['endRow'] - 1; $i++) { if (isset($allData[$i])) { print_r($allData[$i]); } } echo "\n"; }
补充:列分组的读取
如果你的Excel里还有列分组,可以用类似的getColumnGroupInfo()方法来获取,用法和行分组完全一致。
内容的提问来源于stack exchange,提问作者Stanislav
相关产品推荐
相关产品推荐

