Размер файла не подходит для работы с книгами при работе с PHPExcel.Количество строк и столбцов (т. Е. Ячеек) является более важным.
Сам код PHPExcel имеет размер от 10 до 25 МБ, в зависимости от того, к каким компонентам осуществляется доступ.
В настоящее времякаждая ячейка в рабочей книге занимает в среднем 1 КБ памяти (без кеширования) или 1,6 КБ на 64-битном PHP - на данный момент я предполагаю 32-битный PHP - поэтому (например) рабочий лист из 8000 строк с 31 столбцом(248 000 ячеек) будет около 242 МБ.При использовании кэширования ячеек (например, php: // temp или DiskISAM) этот показатель может быть уменьшен примерно до трети, поэтому для 8000 строк на 31 столбец потребуется около 80 МБ.
Существует несколько вариантов, доступных дляпомочь вам сократить использование памяти:
Используете ли вы кэширование ячеек с PHPExcel?
require_once './Classes/PHPExcel.php';
$cacheMethod = PHPExcel_CachedObjectStorageFactory:: cache_to_phpTemp;
$cacheSettings = array( ' memoryCacheSize ' => '8MB');
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objPHPExcel = $objReader->load("test.xlsx");
Если вам нужен только доступ к данным в ваших таблицах, и вам не нужен доступ к ячейкеформатирование, тогда вы можете отключить чтение информации о форматировании из рабочей книги:
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load("test.xlsx");
Если вам требуется доступ только к некоторым, но не ко всем рабочим листам в рабочей книге, вы можете загрузить только эти рабочие листы:
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setLoadSheetsOnly( array("Worksheet1", "Worksheet2") );
$objPHPExcel = $objReader->load("test.xlsx");
если вы хотите читать только определенные ячейки на листах, вы можете добавить фильтр:
class MyReadFilter implements PHPExcel_Reader_IReadFilter
{
public function readCell($column, $row, $worksheetName = '') {
// Read title row and rows 20 - 30
if ($row == 1 || ($row >= 20 && $row <= 30)) {
return true;
}
return false;
}
}
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setReadFilter( new MyReadFilter() );
$objPHPExcel = $objReader->load("test.xlsx");
Все эти методы могут значительно снизить требования к памяти.