PHPExcel Export for Larger Files失败

我正在使用
PHPExcel库来生成基于mysql数据库的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;

你能建议一些或其他选择吗?

最佳答案 您可能超过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++;
}
点赞