2016-08-16 7 views
0

Ich brauche eine Hilfe, ich habe viele Berichte mit 10 bis 30 Spalten und 20000 oder mehr Zeilen, mi Treiber ist mongodb und die Ergebnisabfrage ist sehr schnell, aber wenn ein Dokumentblatt mit der Bibliothek PHPExcel erstellen ist zu langsam fünf oder zehn Minuten etwa oder einige Zeit mehr, mein Code hat nur ein bucle:Beschleunigen Zeit exportieren phpExcel

$row++; 
    $contUser = 0; 
    foreach ($data as $index => $objUser) { 
     $backgroundColor = $colorOdd; 
     if ($contUser % 2 == 0) { 
      $backgroundColor = $colorPair; 
     } 
     $field = $objUser->getFields(); 
     $column = 0; 
     //case 'N°': 
     $sheet->setCellValueByColumnAndRow($column, $row, $contUser + 1); 
     $sheet->getColumnDimensionByColumn($column)->setAutoSize(true); 
     $sheet->getStyleByColumnAndRow($column, $row)->applyFromArray($styleArray); 
     $sheet->getStyleByColumnAndRow($column, $row)->getFill()->applyFromArray(array('type' => \PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => array('rgb' => $backgroundColor))); 

     $column++; 
     //case matricula: 
     $sheet->setCellValueByColumnAndRow($column, $row, $objUser->getChrUsername()); 
     $sheet->getColumnDimensionByColumn($column)->setAutoSize(true); 
     $sheet->getStyleByColumnAndRow($column, $row)->applyFromArray($styleArray); 
     $sheet->getStyleByColumnAndRow($column, $row)->getFill()->applyFromArray(array('type' => \PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => array('rgb' => $backgroundColor))); 
     $column++; 
     //case matricula: 
     $sheet->setCellValueByColumnAndRow($column, $row, $field['appaterno']['value']); 
     $sheet->getColumnDimensionByColumn($column)->setAutoSize(true); 
     $sheet->getStyleByColumnAndRow($column, $row)->applyFromArray($styleArray); 
     $sheet->getStyleByColumnAndRow($column, $row)->getFill()->applyFromArray(array('type' => \PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => array('rgb' => $backgroundColor))); 
     $column++; 
     //case matricula: 
     $sheet->setCellValueByColumnAndRow($column, $row, $field['apmaterno']['value']); 
     $sheet->getColumnDimensionByColumn($column)->setAutoSize(true); 
     $sheet->getStyleByColumnAndRow($column, $row)->applyFromArray($styleArray); 
     $sheet->getStyleByColumnAndRow($column, $row)->getFill()->applyFromArray(array('type' => \PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => array('rgb' => $backgroundColor))); 
     $column++; 
     //case matricula: 
     $sheet->setCellValueByColumnAndRow($column, $row, $objUser->getChrFirstname()); 
     $sheet->getColumnDimensionByColumn($column)->setAutoSize(true); 
     $sheet->getStyleByColumnAndRow($column, $row)->applyFromArray($styleArray); 
     $sheet->getStyleByColumnAndRow($column, $row)->getFill()->applyFromArray(array('type' => \PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => array('rgb' => $backgroundColor))); 

     //$field['dni']['value'] 
     $column++; 
     $type = PHPExcel_Cell_DataType::TYPE_STRING; 
     $sheet->getCellByColumnAndRow($column, $row)->setValueExplicit($field['dni']['value'], $type); 
     //$sheet->getColumnDimensionByColumn($column)->setAutoSize(true); 
     $sheet->getStyleByColumnAndRow($column, $row)->applyFromArray($styleArray); 
     $sheet->getStyleByColumnAndRow($column, $row)->getFill()->applyFromArray(array('type' => \PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => array('rgb' => $backgroundColor))); 
     //$field['sociedad']['value'] 
     $column++; 
     $sheet->getCellByColumnAndRow($column, $row)->setValueExplicit($field['sociedad']['value'], $type); 
     $sheet->getColumnDimensionByColumn($column)->setAutoSize(true); 
     $sheet->getStyleByColumnAndRow($column, $row)->applyFromArray($styleArray); 
     $sheet->getStyleByColumnAndRow($column, $row)->getFill()->applyFromArray(array('type' => \PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => array('rgb' => $backgroundColor))); 
     $column++; 
     $sheet->getCellByColumnAndRow($column, $row)->setValueExplicit($field['gerenciacentral']['value'], $type); 
     $sheet->getColumnDimensionByColumn($column)->setAutoSize(true); 
     $sheet->getStyleByColumnAndRow($column, $row)->applyFromArray($styleArray); 
     $sheet->getStyleByColumnAndRow($column, $row)->getFill()->applyFromArray(array('type' => \PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => array('rgb' => $backgroundColor))); 
     $column++; 
     $sheet->getCellByColumnAndRow($column, $row)->setValueExplicit($field['division']['value'], $type); 
     $sheet->getColumnDimensionByColumn($column)->setAutoSize(true); 
     $sheet->getStyleByColumnAndRow($column, $row)->applyFromArray($styleArray); 
     $sheet->getStyleByColumnAndRow($column, $row)->getFill()->applyFromArray(array('type' => \PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => array('rgb' => $backgroundColor))); 
     $column++; 
     $sheet->getCellByColumnAndRow($column, $row)->setValueExplicit($field['area']['value'], $type); 
     $sheet->getColumnDimensionByColumn($column)->setAutoSize(true); 
     $sheet->getStyleByColumnAndRow($column, $row)->applyFromArray($styleArray); 
     $sheet->getStyleByColumnAndRow($column, $row)->getFill()->applyFromArray(array('type' => \PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => array('rgb' => $backgroundColor))); 
     $column++; 
     $sheet->getCellByColumnAndRow($column, $row)->setValueExplicit($field['servicio']['value'], $type); 
     $sheet->getColumnDimensionByColumn($column)->setAutoSize(true); 
     $sheet->getStyleByColumnAndRow($column, $row)->applyFromArray($styleArray); 
     $sheet->getStyleByColumnAndRow($column, $row)->getFill()->applyFromArray(array('type' => \PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => array('rgb' => $backgroundColor))); 
     $column++; 
     $sheet->getCellByColumnAndRow($column, $row)->setValueExplicit($field['funcion']['value'], $type); 
     $sheet->getColumnDimensionByColumn($column)->setAutoSize(true); 
     $sheet->getStyleByColumnAndRow($column, $row)->applyFromArray($styleArray); 
     $sheet->getStyleByColumnAndRow($column, $row)->getFill()->applyFromArray(array('type' => \PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => array('rgb' => $backgroundColor))); 
     $column++; 
     $sheet->getCellByColumnAndRow($column, $row)->setValueExplicit($field['fecha']['value'], $type); 
     $sheet->getColumnDimensionByColumn($column)->setAutoSize(true); 
     $sheet->getStyleByColumnAndRow($column, $row)->applyFromArray($styleArray); 
     $sheet->getStyleByColumnAndRow($column, $row)->getFill()->applyFromArray(array('type' => \PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => array('rgb' => $backgroundColor))); 
     $column++; 
     $sheet->getCellByColumnAndRow($column, $row)->setValueExplicit($field['divpersonal']['value'], $type); 
     $sheet->getColumnDimensionByColumn($column)->setAutoSize(true); 
     $sheet->getStyleByColumnAndRow($column, $row)->applyFromArray($styleArray); 
     $sheet->getStyleByColumnAndRow($column, $row)->getFill()->applyFromArray(array('type' => \PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => array('rgb' => $backgroundColor))); 
     $column++; 
     $sheet->getCellByColumnAndRow($column, $row)->setValueExplicit($field['subpersonal']['value'], $type); 
     $sheet->getColumnDimensionByColumn($column)->setAutoSize(true); 
     $sheet->getStyleByColumnAndRow($column, $row)->applyFromArray($styleArray); 
     $sheet->getStyleByColumnAndRow($column, $row)->getFill()->applyFromArray(array('type' => \PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => array('rgb' => $backgroundColor))); 
     $column++; 
     $sheet->getCellByColumnAndRow($column, $row)->setValueExplicit($field['superior']['value'], $type); 
     $sheet->getColumnDimensionByColumn($column)->setAutoSize(true); 
     $sheet->getStyleByColumnAndRow($column, $row)->applyFromArray($styleArray); 
     $sheet->getStyleByColumnAndRow($column, $row)->getFill()->applyFromArray(array('type' => \PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => array('rgb' => $backgroundColor))); 
     $column++; 
     $sheet->getCellByColumnAndRow($column, $row)->setValueExplicit($field['matsuperior']['value'], $type); 
     $sheet->getColumnDimensionByColumn($column)->setAutoSize(true); 
     $sheet->getStyleByColumnAndRow($column, $row)->applyFromArray($styleArray); 
     $sheet->getStyleByColumnAndRow($column, $row)->getFill()->applyFromArray(array('type' => \PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => array('rgb' => $backgroundColor))); 
     $column++; 
     $sheet->getCellByColumnAndRow($column, $row)->setValueExplicit($field['estado']['value'], $type); 
     $sheet->getColumnDimensionByColumn($column)->setAutoSize(true); 
     $sheet->getStyleByColumnAndRow($column, $row)->applyFromArray($styleArray); 
     $sheet->getStyleByColumnAndRow($column, $row)->getFill()->applyFromArray(array('type' => \PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => array('rgb' => $backgroundColor))); 
     $column++; 
     $sheet->getCellByColumnAndRow($column, $row)->setValueExplicit($field['iniestado']['value'], $type); 
     $sheet->getColumnDimensionByColumn($column)->setAutoSize(true); 
     $sheet->getStyleByColumnAndRow($column, $row)->applyFromArray($styleArray); 
     $sheet->getStyleByColumnAndRow($column, $row)->getFill()->applyFromArray(array('type' => \PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => array('rgb' => $backgroundColor))); 
     $column++; 
     $sheet->getCellByColumnAndRow($column, $row)->setValueExplicit($field['finestado']['value'], $type); 
     $sheet->getColumnDimensionByColumn($column)->setAutoSize(true); 
     $sheet->getStyleByColumnAndRow($column, $row)->applyFromArray($styleArray); 
     $sheet->getStyleByColumnAndRow($column, $row)->getFill()->applyFromArray(array('type' => \PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => array('rgb' => $backgroundColor))); 
     $column++; 
     $sheet->getCellByColumnAndRow($column, $row)->setValueExplicit($objUser->getChrEmail(), $type); 
     $sheet->getColumnDimensionByColumn($column)->setAutoSize(true); 
     $sheet->getStyleByColumnAndRow($column, $row)->applyFromArray($styleArray); 
     $sheet->getStyleByColumnAndRow($column, $row)->getFill()->applyFromArray(array('type' => \PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => array('rgb' => $backgroundColor))); 
     $column++; 
     $sheet->getCellByColumnAndRow($column, $row)->setValueExplicit(empty($field['agencia']['value'])?'':$field['agencia']['value'], $type); 
     $sheet->getColumnDimensionByColumn($column)->setAutoSize(true); 
     $sheet->getStyleByColumnAndRow($column, $row)->applyFromArray($styleArray); 
     $sheet->getStyleByColumnAndRow($column, $row)->getFill()->applyFromArray(array('type' => \PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => array('rgb' => $backgroundColor))); 

     $date = ''; 
     $time = ''; 
     if(!empty($this->lastAccessQuiz) && $this->lastAccessQuiz>0){ 
      $date = date("Y-m-d", $this->lastAccessQuiz); 
      $time = date("H:i:s", $this->lastAccessQuiz); 
     } 
     $column++; 
     $sheet->getCellByColumnAndRow($column, $row)->setValueExplicit($date, $type); 
     $sheet->getColumnDimensionByColumn($column)->setAutoSize(true); 
     $sheet->getStyleByColumnAndRow($column, $row)->applyFromArray($styleArray); 
     $sheet->getStyleByColumnAndRow($column, $row)->getFill()->applyFromArray(array('type' => \PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => array('rgb' => $backgroundColor))); 
     $column++; 
     $sheet->getCellByColumnAndRow($column, $row)->setValueExplicit($time, $type); 
     $sheet->getColumnDimensionByColumn($column)->setAutoSize(true); 
     $sheet->getStyleByColumnAndRow($column, $row)->applyFromArray($styleArray); 
     $sheet->getStyleByColumnAndRow($column, $row)->getFill()->applyFromArray(array('type' => \PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => array('rgb' => $backgroundColor))); 
     $row++; 
     $contUser++; 
    } 
+0

Nicht möglich, hier eine klare Antwort zu geben, aber lassen Sie mich sagen, ich mache viele Importe von riesigen Daten, und ich denke, für 20000 + Zeilen ist eine Zeit von 5-20min ok. Wenn Engpässe auftreten, die das Skript verlangsamen, müssen Sie sie finden. Thema: xdebug mit Cachgrind und so weiter ... – JustOnUnderMillions

Antwort

0

Nun, mit zu beginnen, nicht für jede einzelne Zelle nicht gesetzt Spalt Styling (wie setAutoSizing true), dass Sie Schreiben Sie .... schreiben Sie alle Ihre Daten und wenden Sie dann die automatische Größenanpassung auf diese Spalte an.

Ähnlich wie bei den Zellstilen .... sie sind alle gleich, also wenden Sie sie nicht auf jede einzelne Zelle an, sondern gelten für den gesamten Bereich, wenn Sie mit dem Schreiben der einzelnen Zellen fertig sind. Wo es die Hintergrundfarbe für eine Zeile ist, gilt für den Zeilenbereich, aber nicht für jede einzelne Zelle.