如何在PHPExcel中遍历行列并生成指定格式的对象?
PHPExcel遍历Excel生成指定格式对象:解决方案
当然可以实现你想要的效果!咱们来调整你的现有代码,让它能忽略空值,并生成带有列名的目标对象结构。
先明确需求对应逻辑
从你给出的示例{HVHV001OXLG:{ A5AR:"152", A5AM:"988", A5AL:"100" } }来看:
- 外层键(比如
HVHV001OXLG)是每行的第一个单元格值 - 内层的键(
A5AR/A5AM/A5AL)是表格的列名(表头) - 只保留非空的列值
修改后的完整代码
try { $inputfiletype = PHPExcel_IOFactory::identify($inputfilename); $objReader = PHPExcel_IOFactory::createReader($inputfiletype); $objPHPExcel = $objReader->load($inputfilename); $r = array('d' => true); } catch(Exception $e) { die('Error loading file "'.pathinfo($inputfilename,PATHINFO_BASENAME).'": '.$e->getMessage()); $r = array('d' => false); } // 获取第一个工作表 $sheet = $objPHPExcel->getSheet(0); $highestRow = $sheet->getHighestRow(); $highestColumn = $sheet->getHighestColumn(); // 👇 这里需要根据你的实际表格调整!假设表头在第4行,数据从第5行开始 $headerRow = 4; // 读取表头列名数组 $headerData = $sheet->rangeToArray('A' . $headerRow . ':' . $highestColumn . $headerRow, NULL, TRUE, FALSE)[0]; // 存储最终结果的数组 $result = []; // 遍历所有数据行(从表头的下一行开始) for ($row = $headerRow + 1; $row <= $highestRow; $row++) { // 读取当前行的所有数据 $rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE)[0]; // 获取当前行的外层标识键(示例中的HVHV001OXLG) $outerKey = $rowData[0]; if (empty($outerKey)) { continue; // 跳过外层键为空的行 } // 构建当前行的键值对,过滤空值 $rowObject = []; foreach ($headerData as $index => $columnName) { $cellValue = $rowData[$index]; // 跳过外层键对应的列,并且只保留非空值 if (!empty($cellValue) && $index !== 0) { $rowObject[$columnName] = $cellValue; } } // 如果当前行有有效数据,就加入结果数组 if (!empty($rowObject)) { $result[$outerKey] = $rowObject; } } // 可以输出JSON格式查看结果,和你想要的结构一致 echo json_encode($result, JSON_PRETTY_PRINT);
关键说明
- 表头行调整:你需要根据自己的实际表格修改
$headerRow的值——如果你的列名(A5AR这些)在第1行,就把$headerRow改成1,数据行从第2行开始遍历。 - 空值过滤:代码里通过
!empty($cellValue)判断,会自动跳过空的单元格,不会出现在最终的对象里。 - 外层键处理:如果某行的第一个单元格是空的,会直接跳过整行,避免无效数据。
另外提一句:PHPExcel已经停止维护很多年了,后续如果有机会,建议迁移到它的继任者PhpSpreadsheet,API用法基本一致,但兼容性和功能更新更有保障。
内容的提问来源于stack exchange,提问作者Gaz Smith
相关产品推荐
相关产品推荐

