我试图在这里和PHPExcel官方文档/论坛中检查每个可能的类似解决方案,但我没有找到任何解决我的问题的方法.
问题
我正在尝试克隆(或复制,诚实)一张表,通过保留克隆表的样式将其解析为通过phpexcel创建的另一个文件.
设置是:
sheet.xls <---要打开和复制的文件
PHPExcel对象< - 在for循环中创建X次的文件,我需要根据一组数组附加Y表.
什么有效
由于与phpexcel文件相关的一些奇怪的通知,克隆和附加工作非常好,需要时间:
注意:未定义的偏移量:在第729行的\ serverpath\PHPExcel\Classes\PHPExcel.php中为1
注意:未定义的偏移量:在729行的\ serverpath\PHPExcel\Classes\PHPExcel.php中为2
注意:未定义的偏移量:第729行的\ serverpath\PHPExcel\Classes\PHPExcel.php中的3
注意:未定义的偏移量:第729行的\ serverpath\PHPExcel\Classes\PHPExcel.php中的4
编辑::
第729行指的是:
foreach ($sheet->getCellCollection(false) as $cellID) {
$cell = $sheet->getCell($cellID);
++$countReferencesCellXf[$cell->getXfIndex()]; // line 729
}
Run Code Online (Sandbox Code Playgroud)
据我所知,这是关于款式的.< - 有上千种,不知道它们来自哪里,文件正确生成,它们只是失去了如上所述的格式.
什么行不通
生成的文件丢失原始格式但保留公式,因此原始"模板"(sheet.xls)的每个边框(和任何样式)都将丢失.
代码的相关部分
我只在这里发布真正相关的代码,主要是因为它大约有一千行代码.
稍后将保存创建的文件(发生在父foreach中):
$file = new PHPExcel();
Run Code Online (Sandbox Code Playgroud)
克隆(在上面的创建后发生在子foreach内):
$sd = $objReader->load("sheet.xls");
$sc = $sd ->getActiveSheet()->copy();
$clonedSheet = clone $sc;
Run Code Online (Sandbox Code Playgroud)
追加(在上面克隆的子项中发生N次):
$ficheName = "not relevant tbh and less than 31 characters";
$temporarySheet = clone $clonedSheet;
$temporarySheet->setTitle($ficheName);
$file->addSheet($temporarySheet,0);
$file->setActiveSheetIndex($file->getIndex($temporarySheet));
unset($temporarySheet);
// some actions are done here
Run Code Online (Sandbox Code Playgroud)
保存(在foreach之外,发生在创建PHPExcel对象的同一个foreach中:
$objWriter = PHPExcel_IOFactory::createWriter($file, 'Excel5');
$objWriter->save($filename);
Run Code Online (Sandbox Code Playgroud)
限制
我对我应该使用什么样的excel格式绝对没有限制,我使用的是2003,因为我有一些机器只适用于excel 2003,但它们很快就会升级到Office 2010,所以几乎任何读者和作家没关系,我正在使用2003年,因为我一直使用它,到目前为止没有问题.
不过,我被迫将XLS表克隆到另一个文件中,我唯一可以做的就是将表单克隆到同一个文件中,稍后通过保留原始文件保存,但是如果还有其他机会"导出" "我真的很感激它的风格.
我已经检查过:
http://www.mindfiresolutions.com/Cloning-a-XLS-worksheet-in-PHP--Mindfire-Solutions-933.php
PHPExcel 1.8.0 - 通过克隆模板表创建多个工作表,每个克隆都会变慢
编辑::
我也试过:
好的,我已经找到了可能的解决方法.
因为问题似乎与:
clone->copy()原型我考虑过这个问题:
所以,简而言之,我改变了这个:
$file = new PHPExcel();
Run Code Online (Sandbox Code Playgroud)
对此:
$file = $objReader->load("sheet.xlsx"); // decided to work with excel2007
Run Code Online (Sandbox Code Playgroud)
还有这个:
$objWriter = PHPExcel_IOFactory::createWriter($file, 'Excel5');
$objWriter->save($filename);
Run Code Online (Sandbox Code Playgroud)
对此:
$sheetCount = $file->getSheetCount();
$file->removeSheetByIndex($sheetCount - 1);
$objWriter = PHPExcel_IOFactory::createWriter($file, 'Excel2007'); // same story, excel 2007 instead of 2003
$objWriter->save($filename);
Run Code Online (Sandbox Code Playgroud)
现在我没有任何错误,一切都按预期工作,尽管我确信可能有另一个更聪明的解决方案.