我需要将mysql表暴露为.xls
格式,这是我代码中的片段
$result = mysql_query( /* here query */ );
$objPHPExcel = new PHPExcel();
$rowNumber = 1;
while ($row = mysql_fetch_row($result)) {
$col = 'A';
foreach($row as $cell) {
$objPHPExcel->getActiveSheet()->setCellValue($col.$rowNumber,$cell);
$col++;
}
$rowNumber++;
}
问题在于,当我同时进行while
循环时,在每次迭代中,表中有500 000行并且在foreach
循环中,这需要花费很多时间来执行php文件。
可以优化此代码吗?
答案 0 :(得分:2)
500,000行总是需要花费大量时间来编写....即使你通过使用工作表的fromArray()方法加速你的foreach循环来加速它;并且(正如nichar所指出的那样)除非你将它们分成多个工作表,否则xls格式的处理行太多了。
您可以通过启用单元格缓存来减少内存需求(SQLite提供最佳的内存使用量),但是仍然需要很长时间才能执行500,000行,而这个大小的任何内容都应该作为批处理/ cron作业运行
答案 1 :(得分:1)
这是注意事项,而不是直接回答您的问题 - 但如果您输出的Excel文件格式为.xls
,则最大行数为65,536,如果是MS Excel 2007+格式例如.xlsx
,最大行数为1,048,576。
因此,如果不将输出格式更改为.xlsx
(这是一个完全不同的结构),文件将太大而无法打开。
答案 2 :(得分:1)
考虑将数据转储到csv文件中,然后将其导入Excel。应该快得多。
答案 3 :(得分:0)
如果你得到一个php超时,你可以通过在while或for循环中添加这个来重置限制:
set_time_limit(300); //whatever seconds you want
如果您通过浏览器运行它,您的服务器可能会超时。我建议你在命令行上运行它来避免这种情况。
此外,类似于nickhar提到的,它可能是一个excel问题。我会尝试输出为csv文件。我认为它可以让你输出更多的行。