2013-08-23 3 views
0

Я пишу некоторые данные на листе excel через phpexcel. Итоговый файл содержит 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

Вместо установка каждого значения ячейки по отдельности в Еогеаспе ($ строка как $ значения) контур, используйте 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 для $$-> getStyle ($ id_cell) -> applyFromArray ($ styleCelluleColonneInfos); 'и вызвать его только один раз для всего диапазона, а затем применить условный стиль к столбцам> 8. Это условие также может быть применено к диапазону ячеек, вызывая его вне цикла, а не внутри. –

Смежные вопросы