【发布时间】:2016-01-07 12:42:14
【问题描述】:
写入文件时出现如下错误
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());
}
EDIT-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;
}
【问题讨论】:
-
这位倒霉的开发者因为没有提供足够的文档(github.com/PHPOffice/PHPExcel/wiki/User%20Documentation 和 hitautodestruct.github.io/PHPExcelAPIDocs)而自责,因为他没有提供关于他的无用产品的足够文档,并为从不回答问题(stackoverflow.com/…)道歉,但可能会展示更多你的代码,或者至少告诉我你正在运行什么版本的 PHPExcel,可能让我至少尝试猜测出了什么问题
-
@MarkBaker 我正在使用 v1.8.0。我将使用我正在使用的代码编辑问题。
-
你能显示
$this->addSummarySheet();的代码吗? -
我在
EDIT-2下为addSummarySheet()和readXlsOrCsv()添加了相关代码。 -
@MarkBaker。当我评论
$this->addSummarySheet()时,您的方向是正确的,该代码也适用于较大的文件。问题在于$this->addSummarySheet()函数。我现在专注于调试这个功能。
标签: php phpexcel cakephp-3.1