Я знаю, здесь много вопросов, связанных с улучшением производительности PHPExcel
. Но все они касаются записи данных, и моя проблема заключается в чтении .
Моя функция:
function parse($filename){ $objPHPExcel = PHPExcel_IOFactory::load($filename); $activeSheet = $objPHPExcel->getActiveSheet(); $parsedData = array(); $columnHeaders = array('order', 'ts', 'summ', 'name', 'quant', 'price', 'bccu'); foreach ($activeSheet->getRowIterator() as $rkey => $row) { $cellIterator = $row->getCellIterator(); foreach ($cellIterator as $ckey => $cell) { $parsedData[$columnHeaders[$ckey]] = $cell->getCalculatedValue(); } } return $parsedData; }
Файл содержит ~ 300 строк и 7 столбцов. И этот скрипт не запускается через 30 секунд.
Как я могу улучшить его?
редактировать:
используемый
$objReader = PHPExcel_IOFactory::createReader("Excel2007"); $objPHPExcel = $objReader->load($filename);
без успеха
Если ваши столбцы уже определены, что вы хотите удалить итератор столбца?
Попробуйте что-то вроде этого:
foreach ($activeSheet->getRowIterator() as $rkey => $row) { $rowIndex = $row->getRowIndex (); $parsedData[$rowIndex]['order'] = $activeSheet->getCell('A' . $rowIndex); $parsedData[$rowIndex]['ts'] = $activeSheet->getCell('B' . $rowIndex); $parsedData[$rowIndex]['summ'] = $activeSheet->getCell('C' . $rowIndex); . . . }
Попробуйте отключить сборщик мусора перед запуском parse (), выпуская gc_disable()
. Предполагая, что уровни итераций здесь не оптимизируются PHP.
Если вы не собираетесь изменять содержимое файла; настройка чтения только на чтение дает примерно 10-кратное повышение.
Например:
$objReader = PHPExcel_IOFactory::createReader( 'Excel5' ); $objReader->setReadDataOnly( true );