我使用phpexcel库基于mysql数据库生成excel数据。mysql查询结果为134 000行。excel在一个工作表中支持65536行。让逻辑变得像
foreach(结果为$value)
{
$val=数组值($value);
如果(RowsCounter{
$objphpexcel->添加行($val,$rowscounter);
}
其他的
{
$active_sheet++;
$objphpexcel->创建工作表();
$objphpexcel->setactivesheetindex($active_sheet);
$rowscounter=1;
}
$rowscounter++;
}
//传递头
header(“内容类型:$mtype;charset=”.$objphpexcel->sencoding);
header(“内容类型:应用程序/八位字节流”);
header(“内容配置:内联;文件名=\””。$文件名。“$Ext \“”;
//保存为excel 2003文件
$objwriter=iofactory::createwriter($objphpexcel,$objphpexcel->sfileformat);
//echo“内存使用峰值:”。(内存使用率峰值(真)/1024/1024)。”退出;
$objwriter->保存('php://output');
在一张工作表达到65000条记录后创建新工作表。
但它不起作用;没有输出或错误。最初我以为是因为记忆的限制。但当它显示峰值内存为1400.5 MB时,我使用ini_set('memory_limit', '3500M');
将内存限制设置为3500MB。
你能给我提些建议吗?
最佳答案
您可能超过了65000个限制,您将$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++;
}