循环遍历PHPExcel中的列和行以创建对象

时间:2018-01-09 11:30:25

标签: php excel

我正在使用PHPExcel库来遍历我的Excel电子表格。这是我目前的剧本:

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 );
}

//  Get worksheet dimensions
$sheet = $objPHPExcel->getSheet(0); 
$highestRow = $sheet->getHighestRow(); 
$highestColumn = $sheet->getHighestColumn();

//  Loop through each row of the worksheet in turn
for ($row = 1; $row <= $highestRow; $row++)
{ 
    //  Read a row of data into an array
    $rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);
    echo $rowData[0][0] . '</br>';

}

这是我的电子表格:

https://regex101.com/r/uMfr4G/1/

我想要做的是遍历每一行,忽略空值并生成一个带有collumn名称的对象。上面图像第5行中的Fow示例将产生:

{HVHV001OXLG:{
           A5AR:"152",
           A5AM:"988",
           A5AL:"100"
}
}

是否可以从我的电子表格格式生成这样的内容?

1 个答案:

答案 0 :(得分:2)

阅读第1行以获取列标题列表;这提供了标题图。使用rangeToArray()的第5个参数可能是个好主意,这样您就可以获得按行/列编号索引的数组,这样您就可以使用列地址轻松查找地图。

然后遍历第2行的数据行,再次返回行/列索引数组,以便您可以轻松检查标头映射,测试包含值的单元格,并根据列标题查找其列地址。

类似的东西:

$highestRow = $sheet->getHighestRow(); 
$highestColumn = $sheet->getHighestColumn();

$columnLoopLimiter = $highestColumn;
++$columnLoopLimiter;
// get the column headings as a simple array indexed by column name
$headings = $sheet->rangeToArray('A1:' . $highestColumn . 1, NULL, TRUE, FALSE, TRUE)[1];

//  Loop through each data row of the worksheet in turn
for ($row = 2; $row <= $highestRow; $row++)
{ 
    //  Read a row of data into an array
    $rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE, TRUE);
    echo $rowData[$row]['A'], '</br>';
    for ($column = 'B'; $column !== $columnLoopLimiter; ++$column) {
        if (!empty($rowData[$row][$column])) {
            echo $headings[$column], ':', $rowData[$row][$column], '</br>';
        }
    }
}

请注意$column !== $columnLoopLimiter;,我之前已将$columnLoopLimiter增加到最后一列之后的列,以便我们可以进行!==比较,而不是<=。这利用了PHP的perl风格的字符增量器,但确保我们在增量器通过Z到AA循环时进行干净的比较。