Я пытаюсь написать файл Excel2007 с Zend Framework и PHPExcel. Я знаю, что могу увеличить ограничение памяти PHP .. но нет ли другого пути?
Это мой код до сих пор, он хорошо работает с 5000 строк и 77 столбцов, но мне нужно 12000 строк 🙂 Память установлена на 128 МБ
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_sqlite; PHPExcel_Settings::setCacheStorageMethod($cacheMethod); $db = Zend_Db_Table_Abstract::getDefaultAdapter(); $phpExcel = new PHPExcel(); // set headers $select = $db->select(); $select->from('IMPORT')->limit(1); $data = $select->query()->fetchAll(); $columns = array_keys($data[0]); $phpExcel->setActiveSheetIndex(0); $colCNT = 1; foreach ($columns as $column) { $letter = Nc_Utils::getNameFromNumber($colCNT); $phpExcel->getActiveSheet()->SetCellValue($letter . '1', $column); $colCNT++; } unset($select); unset($data); $sql = 'SELECT * FROM IMPORT LIMIT 7000'; $stmt = $db->query($sql); $rowCNT = 2; while($rows = $stmt->fetch()){ $phpExcel->getActiveSheet()->fromArray($rows, null, 'A'.$rowCNT); $rowCNT++; } unset($rowCNT); unset($select); unset($db); // MEMORY USAGE = 4 MB! $phpExcelWrite = new PHPExcel_Writer_Excel2007($phpExcel); $phpExcelWrite->setUseDiskCaching(true); $phpExcelWrite->save(str_replace('.php', '.xls', __FILE__));
PHP Неустранимая ошибка: допустимый размер памяти 134217728 байт исчерпан (пытался выделить 13878925 байт) в /Applications/MAMP/htdocs/phpexcel/library/PHPExcel/Shared/XMLWriter.php в строке 102
Я попытался использовать PhpExcel
но обнаружил те же проблемы, что и вы. Я пробовал все предложения по сокращению потребления памяти (ссылка Klinky, размещенная в его ответе), но получила только улучшение на 25-30%. Я даже думал о создании CSV-вывода вместо excel.
Теперь я использую PERE Spreadsheet_Excel_Writer, и он отлично подходит для меня с примерно одинаковым объемом данных (11k строк 62 столбца), хотя для создания файла требуется довольно много времени.
Это не так сильно, как PhpExcel
, но, как я вижу в вашем примере, вы не используете его для PhpExcel
ячеек и написания функций, правильно?
Пример:
$workbook = new Spreadsheet_Excel_Writer(); $workbook->send($filename . '.xls'); $workbook->setVersion(8); // excel 8 // Create worksheet $worksheet =& $workbook->addWorksheet('submissions'); $worksheet->setInputEncoding('UTF-8'); // Write some data on Sheet 1 $row = 0; $worksheet->write($row, 0, 'Poster #ID'); $worksheet->write($row, 1, 'Surname'); $worksheet->write($row, 2, 'Firstname'); $worksheet->write($row, 3, 'Country'); $worksheet->write($row, 4, 'E-mail'); $worksheet->write($row, 5, 'All authors'); $worksheet->write($row, 6, 'Institutions'); $worksheet->write($row, 7, 'Abstract topic'); $worksheet->write($row, 8, 'Abstract title'); foreach ($records as $rec_id => $rec_data) { $row++; $worksheet->write($row, 0, 'P-' . $rec_data['id']); $worksheet->write($row, 1, $rec_data['submitter_surname']); $worksheet->write($row, 2, $rec_data['submitter_firstname']); $worksheet->write($row, 3, $rec_data['submitter_country']); $worksheet->write($row, 4, $rec_data['submitter_email']); $worksheet->write($row, 5, $rec_data['authors']); $worksheet->write($row, 6, $rec_data['institutions']); $worksheet->write($row, 7, $rec_data['abstract_topic']); $worksheet->write($row, 8, $rec_data['abstract_title']); } $workbook->close(); // output
На веб-сайте PHPExcel обсуждается возможные способы сокращения потребления памяти:
Вы пробовали PHP_XLSXWriter ?
Это простая, легкая библиотека писателей XLSX в php. Хотя это не так полно, как PHP_Excel, он был разработан для решения некоторых проблем с памятью и потреблением процессора, часто сталкивающихся с экспортом данных PHP_Excel.
Я столкнулся с некоторыми проблемами памяти и обновил до последней версии PHPExcel улучшенную производительность для меня.