PHPExcel Export for Larger Files失败

时间:2010-10-08 12:06:24

标签: php excel export

我正在使用PHPExcel库生成基于mysql datbase的excel数据。 MySql查询结果为1,34,000行。 Excel在一个工作表上支持65,536行。所以做了像

这样的逻辑
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');

在一张woeksheet达到65000条记录后创建新的工作表。

但它不起作用;没有给出任何输出或错误。最初我认为它是因为内存限制。但是当它回显时它显示峰值内存为1400.5 MB并且我使用ini_set('memory_limit', '3500M');将内存限制设置为3500MB

你能否提出一些建议或其他选择?

1 个答案:

答案 0 :(得分: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,则满足else条件

$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++;
}