我正在使用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
你能否提出一些建议或其他选择?
答案 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++;
}