PHPExcel克隆工作表 - 有效使用内存

时间:2016-07-11 08:21:47

标签: php phpexcel

我需要克隆第一个工作表几次,相应的行数,但可能有些错误。

代码是:

public function downloadFile()
{
    date_default_timezone_set('America/Sao_Paulo');

    if(file_exists("xpto.xlsx")){

        $objPHPExcel = PHPExcel_IOFactory::load("xpto.xlsx");

        $sheets = 3;//3 is enough to throw the error
        for($i = 0; $i<$sheets; $i++){

            $objClonedWorksheet = clone $objPHPExcel->getSheet(0);

            $objClonedWorksheet->setTitle('Sheet ' . $i);

            $objClonedWorksheet->setCellValue('A1', 'Test ' . $i);

            $objPHPExcel->addSheet($objClonedWorksheet);
        }

        $objPHPExcel->setActiveSheetIndex(0);

        $filename = 'file.xlsx';
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment;filename="'.$filename.'"');
        header('Cache-Control: max-age=0');

        $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
        ob_end_clean();
        $ret = $objWriter->save('php://output');

        exit;
    }
}

但是我遇到了精疲力竭的内存错误。比我尝试添加

的评论最多的解决方案(实际上是一种解决方法)
ini_set('memory_limit', '-1');

我在加载功能之后添加了这一行并且它有效,但我不认为它是在SaaS应用程序上使用的好方法。我甚至认为大多数主机(例如AWS)都不允许我使用它。

我也尝试在for循环之前克隆工作表,但是当使用addSheet时,我意识到这个函数不会创建一个新对象,当我更改工作表的名称时(通过for循环的第二次迭代) ),它更改最后创建的工作表,抛出“已存在的具有相同名称的工作表”错误。

尝试使用@rhazen列出的其中一个链接,我将for循环更改为:

    $objFromSheet = $objPHPExcel->getSheet(0);

    $sheets = 3;
    for($i = 1; $i<=$sheets; $i++){

        $objToSheet = $objPHPExcel->createSheet($i);
        foreach($objFromSheet->getRowIterator() as $row){
            $cellIterator = $row->getCellIterator();
            $cellFrom = $cellIterator->current();
            $cellTo = $objToSheet->getCell($cellFrom->getCoordinate());
            $cellTo->setXfIndex($cellFrom->getXfIndex());
            $cellTo->setValue($cellFrom->getValue());
        }
    }

但它似乎也没有用。有关Iterator或XfIndex的误解吗?

1 个答案:

答案 0 :(得分:0)

解决方案在编辑过的问题中。感谢那些帮助过的人。