PHPExcel - 克隆表并保持其原始风格

bri*_*eje 7 php phpexcel

我试图在这里和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表克隆到另一个文件中,我唯一可以做的就是将表单克隆到同一个文件中,稍后通过保留原始文件保存,但是如果还有其他机会"导出" "我真的很感激它的风格.

我已经检查过:

PHPExcel克隆.xlsm与宏

http://www.mindfiresolutions.com/Cloning-a-XLS-worksheet-in-PHP--Mindfire-Solutions-933.php

PHPExcel 1.8.0 - 通过克隆模板表创建多个工作表,每个克隆都会变慢

使用PHPExcel复制样式的解决方法

编辑::

我也试过:

  • 打开文件并获取表单而不是克隆原始表单 - 问题仍然存在.
  • 试图使用Excel2007进行阅读和写作 - 问题仍然存在.
  • 试图不使用 - > copy() - 问题仍然存在.
  • 更新的phpexcel为1.8,现在上面的通知显示在第1079行,但是指的是相同的代码 - 问题仍然存在.

bri*_*eje 8

好的,我已经找到了可能的解决方法.

因为问题似乎与:

  • clone
  • PHPExcel工作表 ->copy()原型
  • 引用PHPExcel工作表

我考虑过这个问题:

  • 只需打开原始文件,而不是创建新的PHPExcel对象实例.
  • 通过从同一文件复制工作表,将文件附加到同一文件的其他实例.
  • 完成后删除最后一页.

所以,简而言之,我改变了这个:

$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)

现在我没有任何错误,一切都按预期工作,尽管我确信可能有另一个更聪明的解决方案.