0

私はphpexcelを介してExcelシートにデータを書き込んでいます。結果のファイルには、500 行と約 35 列が含まれます。スクリプトの実行に 2 分以上かかります。最適化する方法はありますか? ありがとうございました

以下は私のスクリプトです

    require_once 'lib_phpexcel/PHPExcel.php';
ini_set('memory_limit', "512M");
ini_set('max_execution_time', 800);

$objPHPExcel = new PHPExcel();

// proprietes documents
$objPHPExcel->getProperties()->setCreator(utf8_encode("COCPIT"))
->setTitle(utf8_encode("COCPIT - Cohérence"))
->setSubject(utf8_encode("COCPIT - Cohérence"))
->setDescription(utf8_encode("COCPIT - Cohérence"));

$objPHPExcel->setActiveSheetIndex(0);
$sheet = $objPHPExcel->getActiveSheet();


$index_ligne = 4;
$res = mysql_query("SELECT * FROM $database.TEMP_CatalogueSI_RPS LIMIT 2, 999999999999") or die (mysql_error());
while($row = mysql_fetch_row($res)){
    $index_colonne = 0;
    foreach($row as $value){
        $range_colonne = getColonne(++$index_colonne);
        $id_cell = $range_colonne . $index_ligne;
        $sheet->setCellValue($id_cell, utf8_encode($value));
        $sheet->getStyle($id_cell)->applyFromArray($styleCelluleColonneInfos);

        // Pour les 8 premières colonnes => on est sur des colonnes 'fixes'
        if($index_colonne > 8){
            if(strcasecmp($value, "X") === 0){
                $sheet->getStyle($id_cell)->getFill()->getStartColor()->setRGB('CCFFCC');
            }
            else{
                $sheet->getStyle($id_cell)->getFill()->getStartColor()->setRGB('C0C0C0');
            }
        }
    }

    $index_ligne++;
}

$file = "db/$database/TEMP_CatalogueSI_RPS.xls";
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save($file);
4

1 に答える 1

3

ステップ1

foreach($row as $value) ループで各セルの値を個別に設定する代わりに、fromArray() メソッドを使用して一度にセルの行全体を書き込みます。これにより、500x35=17,500 の呼び出しが 500 に減少します。

while($row = mysql_fetch_row($res)) {
    // use array_walk() to utf-encode each value in the row
    array_walk($row, 'utf8_encode');
    // write the entire row to the current worksheet
    $sheet->fromArray($row, NULL, 'A' . $index_ligne);
    // increment row number
    $index_ligne++;
}

ステップ2

各セルスタイルを個別に設定しないでください

$sheet->getStyle($id_cell)->applyFromArray($styleCelluleColonneInfos);

ただし、1 回の呼び出しでセル範囲全体を設定します。

$sheet->getStyle('A4:AI503')->applyFromArray($styleCelluleColonneInfos);

これにより、500x35=17,500 の呼び出しが 1 に減ります。

ステップ #3

に基づいてさまざまなスタイルを設定するのではなく、

if(strcasecmp($value, "X") === 0){

Excel 条件スタイルを使用し、個々のセルではなく、セル範囲全体に再度適用します。

これにより、500x27=13,500 の呼び出しが 1 に減ります。

于 2013-08-23T14:36:22.497 に答える