如何使用PhpExcel将Excel电子表格写入变量?

30
在用我的数据加载PHPExcel对象后,我希望将内容直接输出到一个php变量中,而不是写入文件。我错过了这样做的方法吗?因为似乎唯一的保存方式是保存到磁盘上。
2个回答

62

你可以使用一个写入器将数据保存到磁盘,或者保存到php://output。如果选择后者,你可以使用输出缓冲来捕获该输出并将其存储在变量中......不确定为什么你要这样做。

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
ob_start();
$objWriter->save('php://output');
$excelOutput = ob_get_clean();

3
谢谢。如果我要在像Symfony这样的框架中使用它,我可能需要将内容从Excel服务传递到某种输出服务或控制器中。我宁愿避免写入磁盘的影响。 - Aaron
5
你意识到这可能会非常占用内存,需要将整个文件保存在PHP内存中。 - Mark Baker
一个公正的问题。谢谢建议。 - Aaron
1
值得注意的是,相当数量的编写者(但不是全部)会检测您是否正在写入到“php://output”或“php://stdout”,并且在创建过程中将使用一个临时文件,然后将该文件的内容复制到指定的流中,因此您最好直接选择一个临时文件并直接使用它。 - frak

3

由于PHPExcel无论如何都会将文件写入磁盘,所以如果你捕获标准输出流,内部会发生以下过程:文件先被写入磁盘,然后从磁盘读取(并删除),再打印到标准输出流中,最后被捕获到输出缓存区中。

你可以这么做:

$tmpfile = tempnam($tmp_dir, 'phpxltmp');

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save($tmpfile);

$excelOutput = file_get_contents($tmpfile);
unlink($tmpfile);

3
这是关于如何处理这个问题的一些常识,但这种方法有很多弊端。创建/使用磁盘需要更多的操作/时间/空间。 如果此脚本在多个实例或重叠运行,则需要为每个实例生成不同的文件。这可能会导致损坏/访问问题。原帖中直接将结果输出到变量,而不是输出到文件再存入变量中。 - Angry 84
1
答案已经解决了这些缺点。tempnam会为每个实例创建一个不同的文件,而且由于PHPExcel在任何情况下都要使用文件,因此“直接转变为变量”方法似乎是效率较低的方法。在许多情况下,可以使用readfile或流处理来避开内存问题并进一步提高性能。尽管被接受的答案看起来更为简单,这本身就很有价值,但我仍然认为这个应该是被接受的答案,或者是可信的替代方案。 - LSerni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接