将大的mysql表导出为.xls格式

时间:2013-04-04 21:28:29

标签: php phpexcel

我需要将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文件。

可以优化此代码吗?

4 个答案:

答案 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文件。我认为它可以让你输出更多的行。