2010-10-08 60 views
4

我正在使用PHPExcel库生成基于mysql数据库的excel数据。 MySql查询结果为1,34,000行。 Excel在一张工作表上支持65,536行。所以制作逻辑如PHPExcel导出大文件失败

 
foreach($result as $value) 
{ 
    $val = array_values($value); 

    if($rowscounter < 65000) 
    { 
     $objPHPExcel->addRow($val,$rowscounter); 
    } 
    else 
    { 
     $active_sheet++; 
     $objPHPExcel->createSheet(); 
     $objPHPExcel->setActiveSheetIndex($active_sheet); 
     $rowscounter = 1; 
    } 
    $rowscounter++; 
} 
// deliver header 
header("Content-Type: $mtype; charset=" . $objPHPExcel->sEncoding); 
header("Content-Type:application/octet-stream"); 
header("Content-Disposition: inline; filename=\"" . $filename . ".$ext\""); 

// Save it as an excel 2003 file 
$objWriter = IOFactory::createWriter($objPHPExcel,$objPHPExcel->sFileFormat); 
//echo "Peak memory usage: " . (memory_get_peak_usage(true)/1024/1024) . " MB";exit; 
$objWriter->save('php://output'); 

创建新的工作表后,65000记录达到一个woeksheet。

但它不起作用;不给任何输出或错误。起初我认为这是因为内存限制。但是,当回显它显示峰值内存1400.5 MB,我已经设置我的内存限制高达3500MB使用ini_set('memory_limit', '3500M');

您可以请建议的东西或任何替代?

+0

您能概述您对PHPExcel所做的更改吗?您正在引用诸如$ objPHPExcel-> addRow()(我希望将其与工作表而不是工作簿关联)等方法以及不属于PHPExcel库代码的属性(如$ objPHPExcel-> sFileFormat)。 – 2010-10-08 12:23:50

+0

您是否尝试过调试以确定它在foreach()循环中失败,还是尝试写入文件? – 2010-10-08 12:24:18

+0

是标记,$ objPHPExcel-> addRow()是我的函数,它只是使用 - > getActiveSheet() - > setCellValueByColumnAndRow(); – 2010-10-08 12:31:31

回答

2

您可能会超过65,000的限制,您将$ rowscounter初始值设置为? 1或0(零)?我问这个数组的结果是从索引0(零)开始,你添加了行,然后在添加之后递增计数器。因此,如果您在0(零)时启动计数器,那么您可能会有更多行计算出您所计算的值。你还缺少一个行的else语句,你通过一个价值循环,但不将其添加到图纸

试试这个

$rowscounter = 1; 

foreach($result as $value) 
{ 
    $val = array_values($value); 

    if($rowscounter < 65000) 
    { 
     $objPHPExcel->addRow($val,$rowscounter); 
    } 
    else 
    { 
     $active_sheet++; 
     $objPHPExcel->createSheet(); 
     $objPHPExcel->setActiveSheetIndex($active_sheet); 
     $rowscounter = 1; 

     // add missing row 
     $objPHPExcel->addRow($val,$rowscounter); 
    } 
    $rowscounter++; 
} 
// deliver header 
header("Content-Type: $mtype; charset=" . $objPHPExcel->sEncoding); 
header("Content-Type:application/octet-stream"); 
header("Content-Disposition: inline; filename=\"" . $filename . ".$ext\""); 

// Save it as an excel 2003 file 
$objWriter = IOFactory::createWriter($objPHPExcel,$objPHPExcel->sFileFormat); 
//echo "Peak memory usage: " . (memory_get_peak_usage(true)/1024/1024) . " MB";exit; 
$objWriter->save('php://output'); 

的什么,我试图解释一个简单的例子,如果$ i设置为0(零),则不满足else条件。所以你的结果会有额外的一行。如果$ i设置为1,则满足其他条件

$count = array(1,2,3,4,5,6,7,8,9,10); 
$i=1; // set this to 0 (zero) and test, set to 1 and test 

foreach($count as $cnt) { 
    if($i < 10) { 
     echo "If condition - Count value: ".$cnt." i value:".$i."<br />"; 
    } else { 
     echo "Else condition - Count value: ".$cnt." i value:".$i."<br />"; 
    } 
    $i++; 
} 
+0

嗨菲尔,是的,我错过了一排。感谢识别逻辑错误。现在问题是内存问题。由于显示任何内容花费的时间太长,因此很难确定其确切的内存量。我试图分配35000M,但仍然没有效果。 – 2010-10-12 05:38:34

+0

找到一个关于PHPExcel是内存泄漏问题的有趣线索:http://phpexcel.codeplex.com/Thread/View.aspx?ThreadId=18404它有一个解决方法 – 2010-10-12 13:15:01