IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[PHP Excel] Génération de PDF lente et incomplète


Sujet :

Bibliothèques et frameworks PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 2
    Par défaut [PHP Excel] Génération de PDF lente et incomplète
    Bonjour à tous

    J'utilise PHPExcel pour exporter des données tabulaires soit en .xls soit en .pdf.
    Malheureusement, le pdf créé ne possède plus de bordures (alors qu'elles y sont sous excel) et lorsque la quantité de donnée dépasse un certain seuil (très bas, genre 35 lignes sur 10 colonnes dont la moitié des cellules vides => les fichiers .xls font même pas 20ko) la génération plante car elle n'est pas terminée au bout de 30 secondes.

    En .xls la génération se fait en 6 secondes environ. Est-ce que cela vous parait lent ? Qu'est-ce que je pourrais faire éventuellement pour augmenter la vitesse ?

    Tous mes tests se sont fait sur un veil ordi (512Mo de Ram) en local avec EasyPHP.

    Voici le code :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
     
    $classeur = new PHPExcel;
    $feuille = $classeur->getActiveSheet();
    $feuille->setTitle( /*[...]*/ ); // le nom de la feuille (l'onglet) est la date du jour et l'heure    ex : 03-03-2010 14h30
     
    //[...]
     
    // $data_table est un array qui contient toutes les informations
     
    $feuille->getDefaultStyle()->applyFromArray( array( // style par défaut pour toutes les cellules
    	'font'=>array(
    		'name' => 'Arial',
    		'size' => 11,
    	),
     
    	'alignment' => array( 
    		'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
    		'vertical' => PHPExcel_Style_Alignment::VERTICAL_CENTER,
    		'wrap' => true // passage auto à la ligne
    		//'shrinkToFit' => true // change la taille DU TEXTE et non la largeur de la cellule
    	)
    ) );
     
     
    // ============
     
    $alpha = 'abcdefghijklmnopqrstuvwxyz';
    $id_ligne_excel = 1;
     
    foreach( $data_table as $id_ligne => $data_ligne )
    {
    	$id_ligne++;
     
    	foreach( $data_ligne as $id_col => $data_col )
    	{
    		$id_col--;
     
    		$cell = explode( '!', $data_col ); // data_col représente le contenu d'une cellule qui peu ressembler à ça : Date!rowspan="2"
    		if( !isset( $cell[1] ) ) // dans la plupart des cas il n'y a qu'une valeur et seule $cell[0] est définie   sauf dans la première ligne
    			$cell[1] = '';
     
    		$data_col = $cell[0];
     
    		if( $cell[1] != '' ) // n'arrive que dans la remière ligne
    		{
    			$cell = explode( '"', $cell[1] );  // exemple    rowspan="2"    coupe en rowspan= et 2
     
    			if( $cell[0] == 'rowspan=' ) // plusieurs lignes fusionnées dans une colonne
    			{
    				//$last_colspan = 1;
     
    				$ligne_fin = $id_ligne_excel+($cell[1]-1); // si rowspan = 2 on merge la cellule d'en dessus, donc c'est ligne+1 soit ligne+(rowspan-1)
     
    				$feuille->mergeCells( $alpha[$id_col].$id_ligne_excel.':'.$alpha[$id_col].$ligne_fin ); // ATTENTION   ici cela fonctionne avec id_ligne car ce n'est que le début du tableau 
    			}
    			elseif( $cell[0] == 'colspan=' ) // plusieurs colonnes dans un ligne
    			{
    				$last_colspan = $cell[1];
     
    				$id_col_fin = $id_col+($cell[1]-1); // si colspan = 3 on merge les 2 cellules à droite, donc c'est col+2 soit col+(colspan-1)
     
    				$feuille->mergeCells( $alpha[$id_col].$id_ligne_excel.':'.$alpha[$id_col_fin].$id_ligne_excel );
    			}
    		}
     
    		// ====================
    		// style des cellules
    		$style = $feuille->getStyle( $alpha[$id_col].$id_ligne_excel ); // style de la cellule 'en cours'
     
    		// bordure
    		$style->getBorders()->applyFromArray( array(
    			'allborders' => array( // allborders désigne toutes les bortdure d'une seule cellule, pas toutes les bordures de la feuille
    				'style' => PHPExcel_Style_Border::BORDER_THIN
    			) 
    		) );
     
    		// largeur des colonnes
    		if( $id_ligne_excel <= 2 && $data_col != '' )
    		{
    			switch( $data_col )
    			{
    				case 'Date' : 			$col_dim = 12; break; 
    				case 'Site' : 			$col_dim = 14; break;
    				case 'Fournisseur' :	$col_dim = 14; break;
    				case 'Kleyling' : 		$col_dim = 8; break;
    				case 'Document' :		$col_dim = 12; break;
    				case 'Euro' : 			$col_dim = 8; break;
    				case 'Perdue' : 		$col_dim = 8; break;
    				case 'GB' : 			$col_dim = 8; break;
    				case 'Commentaire' :	$col_dim = 30; break;
     
    				default : $col_dim = 14;
    			}
    			echo '<br/> $col_dim = '.$col_dim.' | col : '.$alpha[$id_col].' | id_ligne excel : '.$id_ligne_excel;
    			$feuille->getColumnDimension( $alpha[$id_col] )->setWidth( $col_dim );
     
    			// color en gris le fond des cellules du header
    			$style->getFill()->applyFromArray( array(  // instancie la classe de style de remplissage (fond)
    				'type' => PHPExcel_Style_Fill::FILL_SOLID,
    				'color' => array( 'rgb' => 'efefef' )
    			) );
     
    			// header en gras
    			$style->getFont()->applyFromArray( array(  // instancie la classe de style de remplissage (fond)
    				'bold' => true
    			) );
    		}
     
    		// ====================
    		// certaine cellule contient des valeur html utile pour le tableau html mais pas sous excel, il faut donc les enlever
    		$data_col = preg_replace( '#<br/>#', ' ', $data_col ); // on enlève le <br/> entre la date et l'heure
    		$data_col = preg_replace( '#^<.*checked="checked".*>$#', 'Oui', $data_col ); // check d'abord si il y a kleyling
    		$data_col = preg_replace( '#^<.*>$#', '', $data_col ); // ceux qui étaient kleyling sont déjà changé sinon il ne le sont pas encore et le sonty maintenant
    		// . signifie n'importe quel caractères   * est équivalent à {0,}  signifie "au moins 0 fois"
     
    		$feuille->setCellValueByColumnAndRow( $id_col, $id_ligne_excel , $data_col ); // ne pas utiliser $id_ligne car l'entrée avec id 93 (par exemple) sera placée ligne 93, et non juste en dessous des autres 
    	}
     
    	$id_ligne_excel++; // 
    }
     
     
    // création du fichier
    $type = $_GET['type'];
     
    if( $type == 'xls' )
    {
    	$fichier = new PHPExcel_Writer_Excel5( $classeur );
    	echo 'xls';
    }
     
    if( $type == 'pdf' )
    {
    	$fichier = new PHPExcel_Writer_PDF( $classeur );
    	$fichier->setSheetIndex( 0 );//Une seule feuille possible
    	echo 'pdf';
    }
     
    // =============
    $chemin = 'export/'.date('d-m-Y_H\hi').'_fichier_export.'.$type;
    $fichier->save( $chemin );
    Merci d'avance

  2. #2
    Nouveau candidat au Club
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 2
    Par défaut
    J'ai continuer mes recherche et il s'avère que l'exportation plante lorsqu'il y a trop de colonne dans les données et non trop de ligne.

    D'autre part, ça plante en 6 secondes et non trente. La page PHP mouline pendant 30 secondes avant d'afficher l'erreur ci dessous mais un fichier .pdf est créé vide (0ko) en 6 secondes environ, comme pour les .xls.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Maximum execution time of 30 seconds exceeded in M:\logiciels\EasyPHP\www\palettes\PHPExcel\Classes\PHPExcel\Shared\PDF\tcpdf.php on line 13627
    Ensuite, des ligne de débug indiquent que le script tourne sans problème jusqu'à l'enregistrement du fichier.
    La seule ligne non affichée est celle située tout à la fin après le "$fichier->save( $chemin );"

    Enfin, lorsque cela fonctionne, la colonne tout à droite du tableau est tronquée voire n'est pas affichée car le tableau est trop large contenu en entier sur la largeur de la page.


    Donc à mon avis c'est lorsque le tableau sort trop de la page que ça fait planter la sauvegarde.

    Alors deux questions :
    - est-ce qu'on peu demander à mettre la page en paysage (ainsi que toutes les pages suivantes si il y a plein de lignes) ?
    - est-ce qu'on peu demander à tout redimensionner pour faire tenir tout le tableau sur une seule page en largeur ?

    Merci d'avance

Discussions similaires

  1. Génération de pdf super lente !
    Par djoufouf dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 04/11/2015, 09h48
  2. Génération RML pdf (deprecated) lente ( 15 seconds ) odoo8
    Par Le13009 dans le forum Odoo (ex-OpenERP)
    Réponses: 1
    Dernier message: 14/05/2015, 10h39
  3. [PHP Excel] Problème PDF
    Par philodido dans le forum Bibliothèques et frameworks
    Réponses: 12
    Dernier message: 30/11/2010, 16h47
  4. [PHP Excel] Génération Excel2007
    Par philodido dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 25/11/2010, 18h04
  5. [FPDF] Génération de PDF en PHP
    Par Bomba dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 16/03/2006, 15h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo