我正试图找到一种方法来删除所有但是文件中重复的行,我知道可以使用以下内容删除文件上的重复项:
$worksheet = $objPHPExcel->getActiveSheet();
foreach ($worksheet->getRowIterator() as $row) {
$rowIndex = $row->getRowIndex();
foreach ($worksheet->getRowIterator($rowIndex + 1) as $testRow) {
if ($testRow == $row) {
$worksheet->removeRow($rowIndex);
}
}
}
但是我需要做相反的事情,删除文件中没有任何重复项的所有行。
为什么我需要这个:重复行是M x M集与数据之间的交集。直接在文件上更容易,不得不考虑M x M可能的结果。
答案 0 :(得分:2)
此函数会从所选的列中删除唯一值:
function removeUniqueRows($objPHPExcel, $column = 'A') {
$worksheet = $objPHPExcel->getActiveSheet();
$cells = array();
foreach ($worksheet->getRowIterator() as $row) {
$rowIndex = $row->getRowIndex();
$cellValue = $worksheet->getCell($column.$rowIndex)->getValue();
array_push($cells, $cellValue);
}
$toRemove = array_keys(array_diff($cells, array_diff_assoc($cells, array_unique($cells))));
for ($i = count($toRemove)-1; $i > -1; $i--) {
$worksheet->removeRow($toRemove[$i]+1);
}
return $objPHPExcel;
}
如果你需要根据许多列中的值删除行,你可以很容易地修改这段代码,将单元格值连接成一个或直接在整行上工作(我不知道这是否可以在PHPExcel中使用,我没有试试吧。
<强>更新强>
这里有两个功能。一个用于删除重复的行(每个重复项只留一个),第二个用于删除所有唯一的行(完全)。这两个函数都可以作为参数snigle column leter 或列字母数组,并使用它来过滤行。
第一个功能:
function removeDuplicateRows($objPHPExcel, $columns = 'A', $separator = '|') {
$worksheet = $objPHPExcel->getActiveSheet();
$cells = array();
foreach ($worksheet->getRowIterator() as $row) {
$rowIndex = $row->getRowIndex();
if (is_array($columns)) {
$cellValue = '';
foreach ($columns as $column) {
$cellValue .= $worksheet->getCell($column.$rowIndex)->getValue() . $separator;
}
} else {
$cellValue = $worksheet->getCell($columns.$rowIndex)->getValue();
}
array_push($cells, $cellValue);
}
$toRemove = array_keys(array_diff_assoc($cells, array_unique($cells)));
for ($i = count($toRemove)-1; $i > -1; $i--) {
$worksheet->removeRow($toRemove[$i]+1);
}
return $objPHPExcel;
}
第二功能:
function removeUniqueRows($objPHPExcel, $columns = 'A', $separator = '|') {
$worksheet = $objPHPExcel->getActiveSheet();
$cells = array();
foreach ($worksheet->getRowIterator() as $row) {
$rowIndex = $row->getRowIndex();
if (is_array($columns)) {
$cellValue = '';
foreach ($columns as $column) {
$cellValue .= $worksheet->getCell($column.$rowIndex)->getValue() . $separator;
}
} else {
$cellValue = $worksheet->getCell($columns.$rowIndex)->getValue();
}
array_push($cells, $cellValue);
}
$toRemove = array_keys(array_diff($cells, array_diff_assoc($cells, array_unique($cells))));
for ($i = count($toRemove)-1; $i > -1; $i--) {
$worksheet->removeRow($toRemove[$i]+1);
}
return $objPHPExcel;
}
如果我正确地理解了你的需要,那么你必须做类似的事情:
$columns = array('A', 'B', 'G', 'H');
removeDuplicateRows(removeUniqueRows($objPHPExcel, $columns), $columns);