PHPExcel - 克隆表并保持其原始样式

时间:2015-09-22 08:52:46

标签: php phpexcel

我已尝试在此处和PHPExcel官方文档/论坛中检查每个可能的类似解决方案,但我找不到任何解决方案。

  

问题

我正在尝试克隆(或复制,诚实)一张工作表,将其解析为另一个通过phpexcel创建的文件,保留克隆工作表的样式

设置为:

sheet.xls < ---文件到OPEN& COPY

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
}

据我所知,这是关于款式的。 < - 其中有数千个,不知道它们来自哪里,文件生成正确,它们只是丢失了上述格式。

  

什么行不通

生成的文件会保留原始格式,但会保留公式,因此原始“模板”(sheet.xls)的每个边框(和任何样式)都会丢失。

  

代码的相关部分

我只在这里发布真正相关的代码,主要是因为它大约有一千行代码。

稍后将保存创建的文件(发生在父foreach中):

$file       =   new PHPExcel();

克隆(在上面创建之后发生在子foreach中):

$sd = $objReader->load("sheet.xls");
$sc =   $sd ->getActiveSheet()->copy();
$clonedSheet = clone $sc;

追加(在上面克隆的儿童身上发生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

保存(在foreach之外,发生在创建PHPExcel对象的同一个foreach中:

$objWriter = PHPExcel_IOFactory::createWriter($file, 'Excel5');
$objWriter->save($filename);
  

限制

我对我应该使用什么样的excel格式绝对没有限制,我使用2003因为我有一些机器只适用于excel 2003,但它们很快就会升级到Office 2010,所以字面意思任何读者和作家都没关系,我正在使用2003,因为我一直使用它并且到目前为止没有任何问题。

但是,我被强制要将XLS表格克隆到另一个文件中,我唯一可以做的就是在同一个文件中克隆表格并稍后通过保留原始文件来保存,但是如果还有其他机会的话“出口”我真的很感激的风格。

  

我已经检查过:

PHPExcel clone .xlsm with macros

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

PHPExcel 1.8.0 - Creating many sheets by cloning a template sheet gets slower with each clone

Workaround for copying style with PHPExcel

编辑::

我也尝试过:

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

2 个答案:

答案 0 :(得分:7)

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

因为问题似乎与:

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

我已经考虑过了:

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

因此,简而言之,我改变了这一点:

$file       =   new PHPExcel();

对此:

$file       =   $objReader->load("sheet.xlsx"); // decided to work with excel2007

而且:

$objWriter = PHPExcel_IOFactory::createWriter($file, 'Excel5');
$objWriter->save($filename);

对此:

$sheetCount = $file->getSheetCount();
$file->removeSheetByIndex($sheetCount - 1);

$objWriter = PHPExcel_IOFactory::createWriter($file, 'Excel2007'); // same story, excel 2007 instead of 2003
$objWriter->save($filename);

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

答案 1 :(得分:1)

如果您不更改sheet.xls的格式,请尝试 A)使用.xlsx B)将* .xlsx重命名为* .zip C)解压缩sheet.zip,以及您保存的文件 D)将.xls / styles.xml从sheet复制到保存的文件 E)重新包装并将* .zip重命名为* .xlsx 你的格式又回来了。

,你可以通过不在php的循环中生成,而不是在循环中运行php来最小化问题。