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