Не удается экспортировать PHPExcel для больших файлов - PullRequest
4 голосов
/ 08 октября 2010

Я использую библиотеку PHPExcel для генерации данных Excel на основе базы данных mysql.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');

, чтобы создать новый лист после того, как будет достигнуто 65000 записей для одного рабочего листа.

Но это не работает;не дает никакого вывода или ошибки.Первоначально я думал, что это из-за ограничения памяти.Но при отражении он показывает пиковую память в 1400,5 МБ, и я установил предел памяти до 3500 МБ, используя ini_set('memory_limit', '3500M');

Не могли бы вы предложить что-нибудь или любую альтернативу?

1 Ответ

2 голосов
/ 08 октября 2010

Возможно, вы превышаете лимит в 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++;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...