gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 12:51:22 26 4
gpt4 key购买 nike

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

The problem

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

设置是:

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

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

What works

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

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

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

注意:\serverpath\PHPExcel\Classes\PHPExcel.php 729行 undefined offset :3

注意:\serverpath\PHPExcel\Classes\PHPExcel.php 729行 undefined offset :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,所以从字面上看任何读者和作家都可以,我正在使用 2003,因为我一直在使用它,到目前为止没有问题。

不过,我被迫将 XLS 工作表克隆到另一个文件中,我唯一可能做的技巧是将工作表克隆到同一个文件中,稍后通过保留原始文件来保存它,但如果还有其他机会“导出”样式我会非常感激。

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

编辑::

我也试过:

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

最佳答案

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

因为问题似乎在于:

  • 克隆
  • PHPExcel 工作表 ->copy() 原型(prototype)
  • 引用 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);

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

关于PHPExcel - 克隆工作表并保持其原始样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32712542/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com