【问题标题】:PHPExcel - Call to a member function getCacheData() on nullPHPExcel - 在 null 上调用成员函数 getCacheData()
【发布时间】: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->_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());
        }

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%20Documentationhitautodestruct.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


【解决方案1】:

我已经解决了我在使用 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() 提示。它确实有帮助。

【讨论】:

  • 我不确定我做了多少,除了看到潜在的错误可能在于该方法;但我很高兴你能够解决它
猜你喜欢
  • 2017-08-09
  • 2020-03-10
  • 2017-09-24
  • 2018-02-06
  • 2018-09-29
  • 2018-08-04
  • 2020-03-28
  • 2020-10-28
  • 2020-09-01
相关资源
最近更新 更多