是否可以使用PHPExcel删除所有重复的行?

时间:2014-05-07 16:20:23

标签: php phpexcel duplicate-removal

我正试图找到一种方法来删除所有但是文件中重复的行,我知道可以使用以下内容删除文件上的重复项:

$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可能的结果。

1 个答案:

答案 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);