PHPExcel从大型工作表中删除行



我正试图根据Cell B=59/61等条件删除行。但是,PHPExcel加载行的速度非常慢。对于18000行/3MB的工作表,加载大约需要4小时30分钟。如何提高数据工作表的加载和删除速度?

set_include_path(get_include_path() . PATH_SEPARATOR . 'Classes/');
/** PHPExcel_IOFactory */
include 'PHPExcel/IOFactory.php';
//Defining File Type
$fileType = "Excel2007";
//Retrieving File
$tmpfname = "bigfile.xlsx";
//Loading file into PHPExcel
$objPHPExcel = PHPExcel_IOFactory::load($tmpfname);
$worksheet = $objPHPExcel->getSheet(0); //Worksheet of file defined as first
$lastRow = $worksheet->getHighestRow();
//Determine which rows to be remove
$DeletedRows = [];
$DeletedRowCount = 0;
for ($row = 2; $row <= $lastRow; $row++) {
//Checker
$CellA = $worksheet->getCell('A' . $row)->getValue();
$CellB = $worksheet->getCell('B' . $row)->getValue();
$CellE = $worksheet->getCell('E' . $row)->getValue();
//To check condition
if ($CellB != 8 && $CellB != 9 && $CellB != 18 && $CellB != 19) {
$DeletedRows[] = $row;
continue;
}
//To check if condition
else if ($CellE == 59 || $CellE == 61){
$DeletedRows[] = $row;
continue;
}
}
//Removing the rows
//Deleting this way as when one row deleted, one row less.
foreach ($DeletedRows as $key => $value) {
$row = $value - $DeletedRowCount;
$objPHPExcel->getActiveSheet()->removeRow($row, 1);
$DeletedRowCount++;
}
//Write file into original file
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, $fileType);
$objWriter->save($tmpfname);

提高性能的一种方法是从电子表格的底部向上而不是向下。

删除一行时,PHPExcel必须检查其下方每一行中的单元格,并在必要时调整这些单元格中的引用。这样效率更高,从工作表底部向上工作时所需的检查/更新更少。


如果一次可以删除多行,效率也会高得多。如果需要删除第15、16和17行;然后

$objPHPExcel->getActiveSheet()->removeRow(15, 3);

比快3倍

$objPHPExcel->getActiveSheet()->removeRow(15, 1);
$objPHPExcel->getActiveSheet()->removeRow(16, 1);
$objPHPExcel->getActiveSheet()->removeRow(17, 1);

因此,花一点时间评估$DeletedRows阵列寻找范围可能是有益的


如果不是在第一个循环中构建一个要删除的行号数组并在第二个循环中删除它们,而是在第一个环路中删除它们。。。1个环路将不可避免地快于2个环路


最后,您的方法有一个主要缺陷。如果您的第一个循环告诉您需要删除第1行、第5行;你删除了第1行,然后删除了第5行……除了第5行实际上是第4行,因为你删除了第一行,而且当你进行原始循环以评估要删除哪些行时,你实际上刚刚删除了第6行。。。。从下到上工作可以防止这个问题,同时提高的效率

最新更新