如何在PHP中填充取消合并后的Excel文件空行?
解决PHPExcel取消合并单元格后填充空值的问题
我来帮你搞定这个问题。你的代码里有两个关键问题:一是取消合并后还试图读取合并单元格(这时候已经没有合并区域了),二是setCellValue不能直接用合并区域字符串来批量填充单元格。下面是修正后的完整代码,同时实现了取消合并后填充所有拆分单元格,以及当'Style'值变化时用上行对应值填充空单元格的需求:
<?php // 上传文件保存 $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); $sheet = $objPHPExcel->getActiveSheet(); echo 'before unmerge: ', count($sheet->getMergeCells()), PHP_EOL; // 第一步:收集所有合并单元格的信息(区域和对应值) $mergeInfo = []; foreach ($sheet->getMergeCells() as $cells) { // 解析合并区域,获取左上角单元格 $range = PHPExcel_Cell::splitRange($cells); $topLeftCell = $range[0][0]; // 获取该单元格的值 $cellValue = $sheet->getCell($topLeftCell)->getValue(); // 保存区域和对应值 $mergeInfo[] = [ 'range' => $cells, 'value' => $cellValue ]; } // 第二步:取消所有合并单元格 foreach ($mergeInfo as $info) { $sheet->unmergeCells($info['range']); } // 第三步:填充所有拆分后的合并单元格 foreach ($mergeInfo as $info) { // 获取区域内的所有单元格 $cellsRange = PHPExcel_Cell::extractAllCellReferencesInRange($info['range']); foreach ($cellsRange as $cell) { $sheet->setCellValue($cell, $info['value']); } } echo 'after unmerge: ', count($sheet->getMergeCells()), PHP_EOL; // 第四步:处理Style列变化时的空单元格填充(假设Style列是B列,可根据实际修改) $styleColumn = 'B'; // 替换为你的Style列实际坐标,比如'C' $highestRow = $sheet->getHighestRow(); // 记录上一行的有效数据 $prevRowData = []; for ($row = 1; $row <= $highestRow; $row++) { $currentStyleValue = $sheet->getCell($styleColumn . $row)->getValue(); // 如果当前行Style有值,更新上一行数据记录 if (!empty($currentStyleValue)) { // 获取当前行所有非空单元格的值 $prevRowData = []; $highestColumn = $sheet->getHighestColumn(); $columnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); for ($col = 1; $col <= $columnIndex; $col++) { $colLetter = PHPExcel_Cell::stringFromColumnIndex($col - 1); $cellValue = $sheet->getCell($colLetter . $row)->getValue(); if (!empty($cellValue)) { $prevRowData[$colLetter] = $cellValue; } } } else { // 如果当前行Style为空,用上一行对应值填充空单元格 foreach ($prevRowData as $col => $value) { $currentCell = $col . $row; if (empty($sheet->getCell($currentCell)->getValue())) { $sheet->setCellValue($currentCell, $value); } } } } // 保存处理后的文件 $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); $objWriter->save('./unmerged_files/unmerged.xlsx'); ?>
代码说明:
- 收集合并单元格信息:先把所有合并区域的范围和对应值(左上角单元格的值)保存下来,避免取消合并后丢失数据。
- 取消合并并填充单元格:取消合并后,遍历每个原合并区域的所有单元格,把之前保存的值填充进去,这样拆分后的单元格就不会是空的了。
- Style列驱动的空值填充:
- 假设
Style列是B列,你可以根据实际情况修改$styleColumn变量。 - 遍历每一行,如果当前行的Style值不为空,就记录这一行的所有非空单元格值;如果Style值为空,就用上一行记录的对应值填充当前行的空单元格。
- 假设
这样就能完美解决你遇到的问题啦!
内容的提问来源于stack exchange,提问作者user14004334
相关产品推荐
相关产品推荐

