Как устранить ошибку «Разрешен размер памяти исчерпан»? - PullRequest
2 голосов
/ 31 января 2020

Я работаю с phpspreadsheet и хочу изменить файл xlsx на 4 листа. Я хочу вставить данные только в 2 листа, но хочу скопировать все 4 листа в новый файл xlsx. Когда я это делаю, я получаю эту ошибку:

Неустранимая ошибка: допустимый объем памяти 536870912 байт исчерпан (попытка выделить 20480 байт)

Это происходит из-за листы тяжелые, но этот тяжелый лист я только хочу скопировать, а не модифицировать. Я попытался загрузить это:

ini_set('memory_limit', -1);

Но это не работает для меня, потому что он выходит за пределы определенного времени выполнения (более 120 секунд).

Я также попробовал это:

$inputFileType = 'Xls';
$inputFileName = './sampleData/example1.xls';
$sheetnames = ['Data Sheet #1','Data Sheet #3'];

/**  Create a new Reader of the type defined in $inputFileType  **/
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType);
/**  Advise the Reader of which WorkSheets we want to load  **/
$reader->setLoadSheetsOnly($sheetnames);
/**  Load $inputFileName to a Spreadsheet Object  **/
$spreadsheet = $reader->load($inputFileName);

Но это только копирует в новый файл указанные листы.

РЕДАКТИРОВАТЬ: Я попытался скопировать листы, которые мне не нужно редактировать, с помощью следующего кода:

$spreadsheet1 =\PhpOffice\PhpSpreadsheet\IOFactory::load("./sampleData/example1.xls");
$clonedWorksheet = clone $spreadsheet1->getSheetByName('Data Sheet #2 ');
$clonedWorksheet->setTitle('Test');
$spreadsheet->addSheet($clonedWorksheet);

Но теперь я получаю еще одну ошибку:

Неустранимая ошибка: необученная ошибка: вызов функции-члена getCell () для null в C: \ xampp \ htdocs \ OfferConfigurator \ vendor \ phpoffice \ phpspreadsheet \ src \ PhpSpreadsheet \ Calculation. * Calculation. php: 2785 Трассировка стека: # 0 C: \ xampp \ htdocs \ OfferConfigurator \ vendor \ phpoffice \ phpspreadsheet \ src \ Php. . php (262): PhpOffice \ PhpSpreadsheet \ Calculation \ Calculation-> calculateCellValue (Object (PhpOffice \ PhpSpreadsheet \ Cell \ Cell), true) # 1 C: \ xampp \ htdocs \ OfferConfigurator \ vendor \ phpoffheet \ php \ src \ PhpSpreadsheet \ Writer \ Xlsx \ Worksheet. php (1077): P hpOffice \ PhpSpreadsheet \ Cell \ Cell-> getCalculatedValue () # 2 C: \ xampp \ htdocs \ OfferConfigurator \ vendor \ phpoffice \ phpspreadsheet \ src \ PhpSpreadsheet \ Writer \ Xlsx \ Worksheet. php 10ff: * PhpSpreadsheet \ Writer \ Xlsx \ Worksheet-> writeCell (Объект (PhpOffice \ PhpSpreadsheet \ Shared \ XMLWriter), Объект (PhpOffice \ PhpSpreadsheet \ Worksheet \ Worksheet), 'M7', Array) # 3 C: \ xampp \ htdocs OfferConfigurator \ vendor \ phpoffice \ phpspreadsheet \ src \ PhpSpreadsheet \ Writer \ Xlsx \ Worksheet. php (76): PhpOffice в C: \ xampp \ htdocs \ OfferConfigurator \ vendor \ phpoffice \ phpspreadsp \ Calculate \ phpspreadspheet \ ss Вычисление. php в строке 2785

Я думаю, это потому, что с помощью клона вы не можете копировать формулы. Может ли это быть причиной? Это другое решение для копирования листа с формулами?

1 Ответ

1 голос
/ 05 февраля 2020

Наконец-то я нашел решение. Проблема была в писателе и формулах, поэтому добавьте эту строку в код, и теперь она работает хорошо:

$writer->setPreCalculateFormulas(false);

Итак, весь код для писателя теперь:

$writer = new Xlsx($spreadsheet);
$writer->setPreCalculateFormulas(false);
$writer->save('test.xlsx');
...