0

写入文件时出现如下错误

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

$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;
    }
4

1 回答 1

0

我已经解决了我在使用 PHPExcel 时遇到的问题。

我已按照EDIT 2中的说明将其$bigExcel = $this->CommonInterface->readXlsOrCsv($insertSummary, false);删除$this->addSummarySheet()并放置在其下。if(!empty($insertSummary)) {

另外,我在下面的代码行中添加了$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;
    }

感谢马克提供$this->addSummarySheet()提示。它确实有帮助。

于 2016-01-08T12:54:49.137 回答