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
编辑::
我也尝试过:
- 打开文件并获取 sheet 而不是克隆原始文件 - 问题仍然存在。
- 尝试使用 Excel2007 进行读写 - 问题仍然存在。
- 尝试不使用 ->copy() - 问题仍然存在。
- 更新 phpexcel 到 1.8,现在上面的通知出现在第 1079 行,但指的是同一段代码 - 问题仍然存在。
好的,我找到了一个可能的解决方法。
因为问题似乎在于:
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 来稍微减少问题。
我已尝试在此处和 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
编辑::
我也尝试过:
- 打开文件并获取 sheet 而不是克隆原始文件 - 问题仍然存在。
- 尝试使用 Excel2007 进行读写 - 问题仍然存在。
- 尝试不使用 ->copy() - 问题仍然存在。
- 更新 phpexcel 到 1.8,现在上面的通知出现在第 1079 行,但指的是同一段代码 - 问题仍然存在。
好的,我找到了一个可能的解决方法。
因为问题似乎在于:
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 来稍微减少问题。