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

PHPExcel - Clone sheet and keep its original style

我已尝试在此处和 PHPExcel 官方文档/论坛中检查所有可能的类似解决方案,但我没有找到任何解决我的问题的方法。

The problem

我正在尝试 克隆(或者老实说,复制)一个 sheet 以将其解析为通过 php[=108 创建的另一个文件=] 通过 保持克隆的样式 sheet.

设置为:

sheet.xls <--- 要打开和复制的文件

PHPExcel 对象 <-- 在 for 循环中创建 X 次的文件,我需要根据一组数组在其中附加 Y 表。

What works

克隆和附加工作非常好,由于一些与 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
}

据我所知,这是关于风格的。 <-- 有成千上万个,虽然不知道它们来自哪里,但文件生成正确,它们只是失去了上面所说的格式。

What doesn't work

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

The relevant part of the code

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

稍后将保存创建的文件(发生在父 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);

Restrictions

我对应该使用哪种 excel 格式完全没有限制,我使用 2003 是因为我有一些机器只能使用 excel 2003,但是它们很快就会升级到 Office 2010,所以实际上任何 reader 和作家都可以,我正在使用 2003,因为我一直使用它并且到目前为止没有问题。

不过,我被迫将 XLS sheet 克隆到另一个文件中,我唯一可以做的技巧是将 sheet 克隆到同一个文件中,稍后通过保留原创,但如果有任何其他机会 "export" 这种风格,我将非常感激。

What I have already checked:

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

编辑::

我也尝试过:

好的,我找到了一个可能的解决方法。

因为问题似乎在于:

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

我考虑过:

  • 无需创建新的 PHPExcel 对象实例,只需打开原始文件即可。
  • 通过从同一文件复制 sheet 静止图像,将文件附加到同一文件的其他实例。
  • 完成后删除最后一个 sheet。

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

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

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

如果您不更改 sheet.xls 的格式,请尝试 一)使用.xlsx B) 将 *.xlsx 重命名为 *.zip C) 解压缩 sheet.zip,以及您保存的文件 D) 将 .xls/styles.xml 从 sheet 复制到保存的文件 E) 重新打包并重命名 *.zip 为 *.xlsx 你的格式又回来了。 您可以通过不在 php 中循环生成而是 运行 在循环中生成 php 来稍微减少问题。