为什么在PHPExcel中连续两次调用createSheet?

时间:2012-06-05 23:58:49

标签: phpexcel

$workbook = new PHPExcel();
$workbook->createSheet()->setTitle('whatt')->setCellValue( 'A1', 'Another sheet' );
$workbook->createSheet()->setTitle('whatt')->setCellValue( 'A1', 'Another sheet' );
$objWriter = new PHPExcel_Writer_Excel2007($workbook);
$objWriter->setOffice2003Compatibility(true);

ob_start();
$objWriter->save( "php://output" );
$contents = ob_get_contents();
ob_end_clean();



// required for IE, otherwise Content-disposition is ignored
if(ini_get('zlib.output_compression'))
  ini_set('zlib.output_compression', 'Off');

$size = count($contents);

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header('Content-Type: application/vnd.msexcel; charset=utf-8');
header("Content-Disposition: attachment; filename=\"test.xlsx\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: {$size}");
echo $contents;
exit;

当我下载工作表时,它下降为1个字节,其中一个工作表,其中第一个单元格为“P”(因为该文件仅包含该字母) 如果我注释掉第二条createSheet行,它就会完美无缺。有什么想法吗?

修改

我接受了下面的答案,它告诉我这不是PHPExcel的错,但事实并非如此。 如果我删除标题并保持输出缓冲,作为测试,它仍然有效。

ob_start();
$objWriter->save( "php://output" );
$contents = ob_get_contents();
ob_end_clean();

file_put_contents( "/mypath/uploads/test.xlsx", $contents );

我可以下载文件没问题。这让我相信标题会以某种方式搞砸它,考虑到如果我只使用一次createSheet就没有问题,这是非常奇怪的。我想,当我弄清楚时,我会在这里发布。

...

我弄清楚为什么标题会弄乱它。显然使用count($contents)和一张添加的工作表很好,但是添加了两张工作表,它只会返回1。我将其更改为strlen($contents)并且有效。如果有人能告诉我为什么会发生这种情况,可以获得奖励积分:)

1 个答案:

答案 0 :(得分:0)

没有大量的调试也不知道。摆脱冗余输出缓冲,它的工作原理。这是导致问题的原因,PHPExcel中没有任何内容。 那么你随后用$ contents做什么?

连续两次调用createSheet()并不会破坏任何东西:虽然为什么要创建一个包含两个具有相同标题的工作表的工作簿? PHPExcel实际上会将第二个添加的工作表重命名为whatt2以避免出现问题。