0

我需要 exposrt 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++;
    }

问题是,在表中是 500 000 行,并且在while每次迭代时循环,当我也foreach循环时,这在 php 文件执行中需要很长时间。

可以优化这段代码吗?

4

4 回答 4

2

编写 500,000 行总是需要花费大量时间....即使您通过使用工作表的 fromArray() 方法来摆脱 foreach 循环来加快它的速度;并且(正如 nichar 所指出的那样)这对于 xls 格式来说太多了,除非您将它们拆分到多个工作表中。

您可以通过启用单元缓存来减少内存需求(SQLite 提供了最佳的内存使用率),但是执行 500,000 行仍然需要很长时间,并且任何这种大小的东西都应该作为批处理/cron 作业运行

于 2013-04-04T21:53:23.847 回答
1

这是需要注意的一点,而不是直接回答您的问题 - 但如果您输出的 Excel 文件格式为.xls,则最大行数为 65,536,如果是 MS Excel 2007+ 格式,例如.xlsx,最大行数为 1,048,576 .

因此,如果不将输出格式更改为.xlsx(这是一个完全不同的结构),文件将太大而无法打开。

于 2013-04-04T21:34:12.773 回答
1

考虑将数据转储到 csv 文件中,然后将其导入 Excel。应该快很多。

于 2013-04-04T21:36:14.387 回答
0

If you get a php timeout, you can reset the limit by adding this inside the while or for loop:

set_time_limit(300); //whatever seconds you want

If you're running it through the browser, your server may be timing out. I recommend you run it on command line to avoid this.

Also, similar to what nickhar mentioned, it can be an excel issue. I would try outputting as a csv file. I think it will allow you to output more lines.

于 2013-04-04T21:38:11.317 回答