Is there a way to tell PHPExcel to just write rows supplied from an array, without doing any calculation / apply styling / any other thing it does while writing OR when using fromArray ?
Need this for performance.
$inputFileName = 'client_files/sample.xlsx';
$objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
$objPHPExcel->getSheet(0)->setCellValue('D2', '@' . $user . ' followers');
$objPHPExcel->getSheet(0)->fromArray(
$followersData,
NULL,
'A5'
);
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$objWriter->setPreCalculateFormulas(false);
$objWriter->save(FINAL_FOLDER . '/' . $line[0] . '.xlsx');
Memory consumption isn't an issue. But the above is just taking too much time (2 minutes with 2700 rows)
the ->save() call takes 93 seconds. The ->fromArray() takes 53 seconds
Also is there any other wayy faster Excel library that allows loading existing xlsx and then writing to it ?
Thanks
I did a bunch of things that resulted in wayyyy faster performance.
Fixed memory leak
$objPHPExcel->disconnectWorksheets() ;
unset($objPHPExcel) ;
I am not sure what solved the issue..
You can try using Spout. If you don't care about styling/calculation, it should solve your performance problem (it takes only a few seconds).
Something along these lines should work:
$inputFileName = 'client_files/sample.xlsx';
$reader = ReaderFactory::create(Type::XLSX);
$reader->open($inputFileName);
$outputFileName = FINAL_FOLDER . '/' . $line[0] . '.xlsx';
$writer = WriterFactory::create(Type::XLSX);
$writer->openToFile($outputFileName);
$reader->nextSheet();
$rowCount = 0;
while ($reader->hasNextRow()) {
$row = $reader->nextRow();
if ($rowCount === 1) {
$row[1] = '@' . $user . ' followers';
}
$followersDataForCurrentRow = $followersData[$rowCount];
$columnIndexStart = 4; // To add stuff in the 5th column
foreach ($followersDataForCurrentRow as $followerValue) {
$row[$columnIndexStart] = $followerValue;
$columnIndexStart++;
}
$writer->addRow($row);
$rowCount++;
}
$reader->close();
$writer->close();