写入文件时出现如下错误
Error: Call to a member function getCacheData() on null
File E:\websites\d3a-qa\vendor\PHPExcel\PHPExcel\Worksheet.php
Line: 2554
第 2554 行:
public function garbageCollect() {
// Flush cache
$this->_cellCollection->getCacheData('A1');
我知道这个错误即将到来,因为$this->_cellCollection
是null
,但我不知道为什么会这样null
。我打电话$writer->save($saving_name);
给它给出这个问题的地方。
我试着做各种各样的事情。从回溯到注释 disconnectWorksheet 代码。重置 PHPExcel 对象的变量,但没有任何效果。
有趣的部分是它有时有效,有时无效。互联网上关于 PHPExcel 的查询没有太多文档或答案。因此,我终于来到这里,以便我可以得到任何答案,或者至少可以得到需要做什么的提示。
提前致谢。
编辑
这是我使用 PHPExcel 的代码。看来错误即将到来$writer->save($saving_name);
。
$parts
是一个包含多个 XLS 的数组,需要合并到一个 XLS 表中。
PS:只有在完成大量处理(或接近 45 张)时才会出现错误。对于较小的 xls,它的工作正常。
if(!empty($insertSummary)) {
$PHPExcel = new \PHPExcel();
$PHPExcel = $PHPExcel->createSheet();
$PHPExcel->setTitle(_EXPORT_DES_SUMMARY);
}
foreach ($parts as $part) {
$bigExcel = '';
if(!empty($insertSummary))
$bigExcel = $this->addSummarySheet($insertSummary, $part, $PHPExcel);
$bigExcel = $this->processPartFiles($part, $bigExcel);
$writer = \PHPExcel_IOFactory::createWriter($bigExcel, 'Excel5');
$returnFilename = $dbName . '_' . 'DES' . '_' . date('Y-m-d-h-i-s') . '_' . 'Part_' . ++$count . '.xls';
// name of file, which needs to be attached during email sending
$saving_name = _DES_PATH_WEBROOT . DS . $returnFilename;
$zipFiles[] = $saving_name;
$writer->save($saving_name);
//Log::write('debug', 'Line(' . __LINE__ .') memory_get_peak_usage - ' . memory_get_peak_usage(true));
//Log::write('debug', 'Line(' . __LINE__ .') memory_get_usage - ' . memory_get_usage());
}
编辑-2
$this->addSummarySheet()
public function addSummarySheet($insertSummary, $part, $PHPExcel) {
$keys = array_keys($part);
$bigExcel = $this->CommonInterface->readXlsOrCsv($insertSummary, false);
//Copy & paste values of range of cells
$cellValuesTitle = $bigExcel->getActiveSheet()->rangeToArray('A1:C1');
$cellValues = $bigExcel->getActiveSheet()->rangeToArray('A' . ($keys[0] + 1) .':C' . ($keys[count($keys) - 1] + 1));
$bigExcel->removeSheetByIndex(0);
$bigExcel->addSheet($PHPExcel);
$bigExcel->getActiveSheet()->fromArray($cellValuesTitle, null, 'A1');
$bigExcel->getActiveSheet()->fromArray($cellValues, null, 'A2');
foreach($keys as $rowCount => $sheet) {
$cellCordinateRow = $rowCount + 2;
$bigExcel->getActiveSheet()->getCell('A' . $cellCordinateRow)->getHyperlink()->setUrl("sheet://'Data $sheet'!A{$cellCordinateRow}");
}
return $bigExcel;
}
$this->CommonInterface->readXlsOrCsv()
public function readXlsOrCsv($filename = null, $unlinkFile = true, $sheetnames = null) {
require_once(ROOT . DS . 'vendor' . DS . 'PHPExcel' . DS . 'PHPExcel' . DS . 'IOFactory.php');
/** Identify the type of $inputFileName **/
$inputFileType = \PHPExcel_IOFactory::identify($filename);
$objReader = \PHPExcel_IOFactory::createReader($inputFileType);
if(!empty($sheetnames)) {
//$objReader->setReadDataOnly(true);
$objReader->setLoadSheetsOnly($sheetnames);
}
$objPHPExcel = $objReader->load($filename);
//$objPHPExcel = \PHPExcel_IOFactory::load($filename);
if ($unlinkFile == true)
$this->unlinkFiles($filename); // Delete The uploaded file
return $objPHPExcel;
}