PHPExcel - 在null

时间:2016-01-07 12:42:14

标签: php phpexcel cakephp-3.1

我在编写文件时收到类似下面的错误

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->_cellCollectionnull,但我不知道为什么会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;
    }

1 个答案:

答案 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()提示。它真的有帮助。