如何在用php整合的Excel文件中填充空行?

如何在用php整合的Excel文件中填充空行?,php,excel,phpexcel,Php,Excel,Phpexcel,我有这段代码,它允许我读取包含合并单元格和未合并单元格的xlsx文件,以便能够处理它们。 xlsx未合并文件如下所示: 我想把空行填成这样: 每次“样式”值更改时,空单元格都会被上面行的值填充。 我尝试了使用foreach($sheet->getMergeCells()作为$cells){$sheet->setCellValue($cells);}但它不起作用 我如何解决我的问题 <?php //uploaded xlsx file recovery $xlsx="C:/w

我有这段代码,它允许我读取包含合并单元格和未合并单元格的xlsx文件,以便能够处理它们。 xlsx未合并文件如下所示:

我想把空行填成这样:

每次“样式”值更改时,空单元格都会被上面行的值填充。 我尝试了使用
foreach($sheet->getMergeCells()作为$cells){$sheet->setCellValue($cells);}
但它不起作用

我如何解决我的问题

<?php

//uploaded xlsx file recovery
$xlsx="C:/wamp64/www/Extract_pictures_Excel/xlsx_files/".date('Y_m_d H-i-s')."_file.xlsx";
move_uploaded_file($_FILES["mon_fichier"]["tmp_name"],$xlsx);

require_once 'PHPExcel/Classes/PHPExcel/IOFactory.php';
$objPHPExcel = PHPExcel_IOFactory::load($xlsx);

//reading the xlsx file
$sheet = $objPHPExcel->getActiveSheet();
echo 'before unmerge: ', count($sheet->getMergeCells()), PHP_EOL;

    foreach($sheet->getMergeCells() as $cells)
        {
            
            $sheet->unmergeCells($cells);
            foreach($sheet->getMergeCells() as $cells)
            {
                $sheet->setCellValue($cells);
            }
        }

echo 'after unmerge: ', count($sheet->getMergeCells()), PHP_EOL;

$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); 
$objWriter->save('./unmerged_files/unmerged.xlsx');

?>

获取范围的第一个单元格的值。因为它是一个二维数组,所以我们可以通过
[0][0]
获取第一个元素

然后我们通过将last param设置为true来获得所有单元格,最重要的是CellReference。这将使二维数组的第一个键为行键,第二个键为列键

有了这些数据和值,我们可以取消单元格合并,并使用相同的值设置范围内的所有单元格

$row = 0;
$skipRows = [1, 3];
foreach($sheet->getMergeCells() as $range) {
    $value = $sheet->rangeToArray($range)[0][0];
    $cells = $sheet->rangeToArray($range, null, true, true, true);
    $sheet->unmergeCells($range);
    if(in_array(++$row, $skipRows)) continue;
    if(!$value) continue;

    foreach($cells as $row => $columns) {
        foreach(array_keys($columns) as $column) {
            $sheet->setCellValue("$column$row", $value);
        }
    }
}

使用此伪代码(!)
foreach($sheet->getMergeCells()作为$range){$value=getvaluefromrrange($range);$sheet->unmergeCells($range);foreach($range作为$cell)$sheet->setCellValue($cell,$value);}
这不是真正的代码,但是一个算法需要做什么。我用文档的语法更改了代码,但是对于第二个foreach,我有:“警告:为foreach()提供的参数无效”。我使用了
$value=$sheet->rangtoarray($range)它返回一个二维数组!你需要仔细阅读这些文件。要获得它,请使用
$value=$sheet->rangeToArray($range)[0][0]例如。好的,谢谢,我修改了它,在文档中它与硬单元一起使用,例如“C3:E5”,我没有很好地理解。但我的问题仍然存在…您应该使用调试器来了解发生了什么。非常感谢您的精确解释,它工作得非常完美!只是一个小细节,因为标题是在一个合并的单元格中,它会在我的xlsx文件的所有第一个单元格中复制自己,如下所示:日期相同,非常完美,非常感谢,第一行现在保持不变。我刚刚看到文件末尾的日期也是重复的,但是忽略它会更复杂,不是吗?当然,只要比较一下它是否包含“截至的数据”。很好,我添加了这个修改,它工作得很好!