1

YII フレームワークを使用して PHP スクリプトを実行しています。このスクリプトはデータベースを通過し、エクスポート用の Excel シートを作成します。データベース内のデータは現在約 15,000 レコードであり、増加しています。問題は、スクリプトが大量のメモリを消費し、生成される Excel ファイルが約 45 MB になることです。ファイルを zip して、問題になるとは思わないサイズに圧縮することはできますが、より多くのメモリを使用するスクリプトが私の懸念事項です。

私が考えていた解決方法の 1 つは、一度に 5,000 件のレコードだけを処理し、それらをすべて加算して 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,
        ));
    }
4

2 に答える 2

1

代わりにMerchant::model()->findAll()を使用する必要がありますCDbDataReader。ActiveRecord の利便性は失われますが、以前のようにすべてのレコードをメモリにロードすることはありません。

からデータ リーダーが返されCDbCommand::query()ます。したがって、次のようなことができます。

$command   = Yii::app()->db->createCommand();
$merchants = $command->query('SELECT * FROM merchants');
foreach($merchants as $merchant) {
    // Add to excel here
}
于 2013-08-02T07:38:53.540 に答える
0

また、MySQL から Excel にデータをエクスポートするプロジェクトにも取り組んでいました。生成された XL シートには約 30 個のタブがあり、それらはさまざまなセルの複雑な数式です。そのためにPHPExcelを使用しています。しかし、私の場合、時間がかかっていたので、cron ジョブとして Excel を生成していました。

ここで、複雑な Excel テンプレートがある場合は、設計されたテンプレートをサーバーに保存することもできます。次に、PHPExcel のリーダーおよびライター クラスの助けを借りて、そのテンプレートを読み取り、データを書き込み、新しいファイルに保存できます。

この情報が役立つと思います。さらに説明が必要な場合はお知らせください。

于 2013-08-01T13:04:13.103 に答える