2013-08-23 241 views
0

我正在通過phpexcel將一些數據寫入Excel表單。生成的文件包含500行和大約35列。運行腳本需要兩分鐘的時間,有什麼方法可以優化它嗎?謝謝phpexcel腳本花費太長時間

下面是我的腳本

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); 

回答

3

第1步

而不是在foreach單獨設置每個單元格的值($行作爲$值)循環,使用fromArray()方法一次寫入整行單元格。降低500x35 = 17500調用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); 

但設定單元的整個範圍內以單一電話。

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

這降低了500x35 = 17500呼叫1.

步驟#3

而不是基於

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

使用Excel條件樣式設置不同的風格,和再次將其應用於整個細胞範圍,而不是每個細胞。

將500x27 = 13,500個呼叫減少到1個。

+0

您可以請執行步驟#1的幫助嗎?代碼是什麼樣的? – user2613707

+0

事情是,每個細胞可以有不同的風格。 – user2613707

+0

你的代碼顯示每個單元格在調用'$ sheet-> getStyle($ id_cell) - > applyFromArray($ styleCelluleColonneInfos);'然後一些單元格被賦予不同的背景顏色'if(strcasecmp( $ value,「X」)=== 0){'。你可以省去17500次對'$ sheet-> getStyle($ id_cell) - > applyFromArray($ styleCelluleColonneInfos);'的調用,並在整個範圍內調用它一次,然後將條件樣式應用於大於8的列。該條件也可以應用於一系列單元格,將其稱爲循環之外而不是內部 –