我正在尝试创建一个excel文件,大约10个工作表,每列3列,每行大约30行。我试图通过设置一些样式属性(除了几个单元格合并和列大小调整)来突出显示每个工作表上的一些单元格组。我发现文档在第4个工作表之后删除了样式。
我的问题是:我可以做些什么来增加我可以应用于文档的样式数量吗?可能是因为我忽略了做一些清理工作?我缺少一些设置?
我注意到some memory issue questions on SO that seemed related,所以我检查了内存限制并尝试了缓存。据我所知,这似乎不是问题(如果我错了,请反驳我。)。
我创建了一个玩具示例来演示这个问题。在我的测试服务器上,样式在第3个工作表(大约50个应用程序)上给出。 玩具示例(编辑:由于this answer我稍微更改了示例,以便样式明显处于不相交的区域。)
编辑:我在不同的服务器上尝试了同样的事情(也许是一个稍微更新的PHPExcel版本),所有样式似乎都保存在Excel5格式的输出中,即使增加了复杂性和大小。<?php
require_once 'classes/PHPExcel.php';
ini_set('memory_limit','64M'); // The default memory_limit in php.ini is at least this as well
$cacheMethod = \PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
$cacheSettings=array( 'memoryCacheSize'=>'32MB');
\PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
$o = new \PHPExcel();
$style1 = array(
'fill'=>array(
'type'=> \PHPExcel_Style_Fill::FILL_SOLID,
'color'=>array('rgb'=>'CCFFCC'),
),
'font'=>array(
'size'=>17,
'name'=>'Calibri Light',
'bold'=>false
),
);
$style2 = array(
'fill'=>array(
'type'=> \PHPExcel_Style_Fill::FILL_SOLID,
'color'=>array('rgb'=>'FFCCCC'),
),
'font'=>array(
'size'=>17,
'name'=>'Calibri Light',
'bold'=>false
),
);
$maxws = 10;
$maxrow=40;
for ($ws=0;$ws<$maxws;$ws++){
$o->setActiveSheetIndex($ws);
$o->getActiveSheet()->setTitle("TEST $ws");
for ($row=1;$row<$maxrow; $row++){
if ($row % 2){
$o->getActiveSheet()
->getCell("A$row")
->setValue("Styled!");
$o->getActiveSheet() ->getStyle("A$row") ->applyFromArray($style1);
}else{
$o->getActiveSheet()
->getCell("A$row")
->setValue("Default");
}
$o->getActiveSheet()
->getCell("B$row")
->setValue("Default");
if ( ! ($row % 2)){
$o->getActiveSheet()
->getCell("C$row")
->setValue("Other style!");
$o->getActiveSheet() ->getStyle("C$row") ->applyFromArray($style2);
}else{
$o->getActiveSheet()
->getCell("C$row")
->setValue("Default");
}
}
if ($ws+1<$maxws) $o->createSheet($ws+1);
}
//echo "Peak memory usage ". (memory_get_peak_usage(true)/1024/1024) . " MB\r\n"; die();
$filename = 'export_test.xls';
header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=\"$filename.xls\"");
header("Cache-Control: max-age=0");
$objWriter = \PHPExcel_IOFactory::createWriter($o, "Excel5");
$objWriter->save("php://output");
exit;
答案 0 :(得分:2)
OfficeOpenXML .xlsx文件的样式限制(Excel2007 Writer):
BIFF .xls文件的样式限制(Excel5 Writer):
尽可能尝试在PHPExcel中为一系列单元格而不是单个单元格设置样式;所以而不是
$o->getActiveSheet() ->getStyle("A$row") ->applyFromArray($style);
在for
循环中,执行
$o->getActiveSheet() ->getStyle("A1:A$maxrow") ->applyFromArray($style);
for
循环完成后
答案 1 :(得分:1)
这不是一个完整的答案,但为我解决了这个问题。
问题是createWriter工厂方法中的导出格式“Excel5”。切换到“Excel2007”可以解决问题(我期望看到的样式正确显示)。这适用于我的实际应用和玩具示例。
在代码中:
header("Content-Disposition: attachment; filename=\"$filename.xlsx\"");
header("Cache-Control: max-age=0");
$objWriter = \PHPExcel_IOFactory::createWriter($o, "Excel2007");