我有一个使用 YII 框架运行的 PHP 脚本,它遍历数据库并创建 Excel 表以用于导出目的。数据库中的数据现在大约有 15K 条记录,并且还在增加。问题是脚本消耗了大量内存,生成的 excel 文件变成了 45 MB 左右。我可以尝试压缩文件以将其压缩到我认为不会有问题的大小,但使用更多内存的脚本是我关心的。
我正在考虑解决它的一种方法是一次只处理 5k 条记录,然后将它们全部加起来以创建 Excel 文件。我不确定这是否会是这样。
public function actionExport() {
Yii::import('ext.phpexcel.XPHPExcel');
XPHPExcel::init();
// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
// Adding data
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A1', 'SN')
->setCellValue('B1', 'Full Name')
->setCellValue('C1', 'Gender')
->setCellValue('D1', 'Date Of Birth')
->setCellValue('E1', 'Products')
$merchantModels = Merchant::model()->findAll();
$i = 2; //starting after the header row
foreach ($merchantModels as $model) {
$merchantPModels = MerchantProducts::model()->findAll(array(
'condition' => 'merchantID = :merchantID',
'params' => array(':merchantID' => $model->id),
));
$productStr= "";
$pStr ="";
$x = 0; // counter for the merchnat product Loop
foreach ($merchantModels as $MPmodel) {
if($MPmodel->product !== null){
$pStr = $MPmodel->product->productName;
}else{
$pStr = "";
}
if ($x == 0) { // First Object
$productStr = $pStr;
}else{
$productStr = $productStr . "," . $pStr;
}
$x++;
}
*
*/
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A' . $i, $i - 1)
->setCellValue('B' . $i, $model->fullName)
->setCellValue('C' . $i, $model->gender)
->setCellValue('D' . $i, $model->dateOfBirth)
->setCellValue('E' . $i, $productStr);
$i++;
}
// Rename worksheet
$objPHPExcel->getActiveSheet()->setTitle('Merchants');
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);
$date = new DateTime('NOW');
$date = $date->format('Y-m-d H:i:s'); // for example
$this->render('export', array(
'excelModel' => $objPHPExcel,
'date' => $date,
));
}