我在编写文件时收到类似下面的错误
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
$这 - > 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;
}
$这 - > 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;
}
答案 0 :(得分:0)
我已经解决了PHPExcel面临的问题。
我已将$bigExcel = $this->CommonInterface->readXlsOrCsv($insertSummary, false);
中的已移除$this->addSummarySheet()
更改为if(!empty($insertSummary)) {
,如 EDIT 2 中所述。
另外,我在$this->addSummarySheet()
$PHPExcelSheet = new \PHPExcel();
$PHPExcelSheet->removeSheetByIndex(0);
$PHPExcel = new \PHPExcel();
$PHPExcel = $PHPExcel->createSheet();
$PHPExcel->setTitle(_EXPORT_DES_SUMMARY);
所以$this->addSummarySheet()
中的最终代码变为
public function addSummarySheet($insertSummary, $part, $PHPExcel, $summaryExcel) {
$keys = array_keys($part);
//$summaryExcel= $this->CommonInterface->readXlsOrCsv($insertSummary, false);
//Copy & paste values of range of cells
$cellValuesTitle = $summaryExcel->getActiveSheet()->rangeToArray('A1:C1');
$cellValues = $summaryExcel->getActiveSheet()->rangeToArray('A' . ($keys[0] + 1) .':C' . ($keys[count($keys) - 1] + 1));
$PHPExcelSheet = new \PHPExcel();
$PHPExcelSheet->removeSheetByIndex(0);
$PHPExcel = new \PHPExcel();
$PHPExcel = $PHPExcel->createSheet();
$PHPExcel->setTitle(_EXPORT_DES_SUMMARY);
$PHPExcelSheet->addSheet($PHPExcel);
$PHPExcelSheet->getActiveSheet()->fromArray($cellValuesTitle, null, 'A1');
$PHPExcelSheet->getActiveSheet()->fromArray($cellValues, null, 'A2');
foreach($keys as $rowCount => $sheet) {
$cellCordinateRow = $rowCount + 2;
$PHPExcelSheet->getActiveSheet()->getCell('A' . $cellCordinateRow)->getHyperlink()->setUrl("sheet://'Data $sheet'!A{$cellCordinateRow}");
}
return $PHPExcelSheet;
}
感谢Mark提供$this->addSummarySheet()
提示。它真的有帮助。