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