PHP中While循环结合PHPEXCEL写入Excel时数据重复问题求助
问题分析与解决方案
首先咱们来拆解下你代码里的问题根源——while循环和foreach循环的嵌套逻辑出了问题。
你设置$asignadorB从6开始,只要它小于等于$lastRowEmpla就会进入while循环,然后在循环里完整遍历一遍$posicionesX数组,每遍历一个元素就写一行并让$asignadorB自增。举个实际例子:假设$lastRowEmpla是10(需要写6-10共5行),但$posicionesX只有3个元素。第一次foreach会写完6、7、8行,$asignadorB变成9,这时候while循环条件还满足(9<=10),于是又会从头遍历$posicionesX数组,把第一个元素写到第9行,第二个写到第10行——这就直接导致了数据重复!
同样的逻辑问题也出现在处理$posicionesY的代码块里。
修正后的代码方案
你需要让数组的每个元素对应唯一的一行,避免重复遍历数组。这里给你两种可行的修正思路:
方案1:用索引同步数组与行号
这种方式能精准控制每一行对应数组的哪个元素,同时避免超出Excel的最大行限制:
<?php $posicionesX = $_POST['postposX']; $posicionesY = $_POST['postposY']; $startRow = 6; $maxRow = $lastRowEmpla; // 处理X坐标 $totalXItems = count($posicionesX); for ($i = 0; $i < $totalXItems && ($startRow + $i) <= $maxRow; $i++) { $currentRow = $startRow + $i; $excelObj->getSheet(2)->SetCellValue("E{$currentRow}", $posicionesX[$i]); } // 处理Y坐标 $totalYItems = count($posicionesY); for ($i = 0; $i < $totalYItems && ($startRow + $i) <= $maxRow; $i++) { $currentRow = $startRow + $i; $excelObj->getSheet(2)->SetCellValue("F{$currentRow}", $posicionesY[$i]); } $objWriter->save("../configuracion.xlsx"); ?>
方案2:合并遍历(适合X/Y数组长度一致的场景)
如果$posicionesX和$posicionesY是一一对应的(每个按钮对应一组X/Y坐标),可以合并成一个循环,代码更简洁:
<?php $posicionesX = $_POST['postposX']; $posicionesY = $_POST['postposY']; $currentRow = 6; $maxRow = $lastRowEmpla; // 同时遍历X和Y数组,确保每组坐标对应同一行 foreach ($posicionesX as $key => $xValue) { if ($currentRow > $maxRow) break; // 超过最大行就停止写入 // 处理Y数组长度不足的情况,避免报错 $yValue = isset($posicionesY[$key]) ? $posicionesY[$key] : ''; $excelObj->getSheet(2)->SetCellValue("E{$currentRow}", $xValue); $excelObj->getSheet(2)->SetCellValue("F{$currentRow}", $yValue); $currentRow++; } $objWriter->save("../configuracion.xlsx"); ?>
额外小提示
- 建议先检查
$_POST数据的完整性,比如用isset($posicionesX) && !empty($posicionesX)判断数组是否存在且有值,避免出现数组未定义的错误。 - 如果
$lastRowEmpla对应的行数比数组元素多,剩下的行可以留空或者填充默认值;如果数组元素比行数多,超出的元素会被自动忽略,避免出现行号越界的问题。
内容的提问来源于stack exchange,提问作者Hector
相关产品推荐
相关产品推荐

