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

2023-12-25

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

问题

我试图clone(或者诚实地说,复制)一张表将其解析为通过 phpexcel 创建的另一个文件保持克隆工作表的样式.

设置是:

工作表.xls

PHPExcel 对象

什么有效

克隆和附加工作非常出色,但由于一些与 phpexcel 文件相关的奇怪通知而需要时间:

注意:\serverpath\PHPExcel\Classes\PHPExcel.php 第 729 行中的未定义偏移量:1

注意:\serverpath\PHPExcel\Classes\PHPExcel.php 第 729 行中的未定义偏移量:2

注意:\serverpath\PHPExcel\Classes\PHPExcel.php 第 729 行中的未定义偏移量:3

注意:\serverpath\PHPExcel\Classes\PHPExcel.php 第 729 行中的未定义偏移量:4

EDIT ::

第 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 克隆 .xlsm 与宏 https://stackoverflow.com/questions/5913818/phpexcel-clone-xlsm-with-macros

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

PHPExcel 1.8.0 - 通过克隆模板工作表创建许多工作表,每次克隆都会变慢 https://stackoverflow.com/questions/26211682/phpexcel-1-8-0-creating-many-sheets-by-cloning-a-template-sheet-gets-slower-wi

使用 PHPExcel 复制样式的解决方法 https://stackoverflow.com/questions/18258318/workaround-for-copying-style-with-phpexcel

EDIT ::

我也尝试过:

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

好吧,我已经想出了一个可能的解决方法。

因为问题似乎在于:

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

我曾经想过:

  • 无需创建新的 PHPExcel 对象实例,只需打开原始文件即可。
  • 通过从同一文件复制工作表,将文件与同一文件的其他实例一起附加。
  • 完成后取出最后一张纸。

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

$file       =   new PHPExcel();

To this:

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

和这个:

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

To this:

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHPExcel - 克隆工作表并保持其原始样式 的相关文章

随机推荐