我正在使用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"
}
}
是否可以从我的电子表格格式生成这样的内容?
答案 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循环时进行干净的比较。