我需要克隆第一个工作表几次,相应的行数,但可能有些错误。
代码是:
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的误解吗?
答案 0 :(得分:0)
解决方案在编辑过的问题中。感谢那些帮助过的人。