PHPExcel,Excel工作表 - 限制样式数量?

时间:2014-01-29 16:56:55

标签: php phpexcel

我正在尝试创建一个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;

2 个答案:

答案 0 :(得分:2)

OfficeOpenXML .xlsx文件的样式限制(Excel2007 Writer):

  • 独特的单元格格式/单元格样式: 64,000
  • 填充样式 256
  • 线宽和样式: 256
  • 独特的字体类型:1,024种全球字体可供使用;每个工作簿512个 工作簿中的数字格式:200到250之间,具体取决于您已安装的Excel的语言版本

BIFF .xls文件的样式限制(Excel5 Writer):

  • 工作簿中的颜色: 56
  • 工作簿中的单元格样式: 4,000
  • 自定义数字格式:200到250之间,具体取决于您安装的Excel的语言版本。

尽可能尝试在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");