You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:11:02