[RESOLU] export vers PHPEXCEL, Afficher colonnes dynamiquement

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] export vers PHPEXCEL, Afficher colonnes dynamiquement

Re: export vers PHPEXCEL, Afficher colonnes dynamiquement

par moimeme30 » 08 août 2014, 19:31

Super ça fonctionne à merveille..
Une fois de plus je te remercie yann18... Mais qu'est ce que je ferai sans toi :)

Re: export vers PHPEXCEL, Afficher colonnes dynamiquement

par yann18 » 08 août 2014, 15:05

bonjour,

Il y a 2 cas de figures:

- soit tu pars du tableau des années ($annees) qui est censé contenir les années stockées en bd c-a-d les années où il y a des ventes. Plus loin dans ton code pour gérer les années de manière dynamique il te suffit de parcourir, avec une boucle foreach, le tableau $annees.

Par exemple ce bout de code
//...

                 $sheet->setCellValueByColumnAndRow(0,1,'Produit' );
                $sheet->setCellValueByColumnAndRow(1,1,'2013' );// A AFFICHER DYNAMIQUEMENT
                $sheet->setCellValueByColumnAndRow(2,1,'2014' );// A AFFICHER DYNAMIQUEMENT
//...
sera remplacé par :
                 $sheet->setCellValueByColumnAndRow(0,1,'Produit' );
                foreach( $annees as $i=>$annee ){
                 $sheet->setCellValueByColumnAndRow(++$i,1,$annee );// A AFFICHER DYNAMIQUEMENT
                }
                
-soit tu récupères les années en bd avec une requête sql. Puis tu construis un tableau en php à partir des données retournées par le résultat cette requête. De ce tableau tu pourras l'utiliser comme dans l'exemple précédent

export vers PHPEXCEL, Afficher colonnes dynamiquement

par moimeme30 » 07 août 2014, 18:22

Bonjour,
J'ai une page de statistiques et j'aimerai pouvoir exporter le tableau sous format excel.
J'utilise PHPEXCEL et ça fonctionne plutot bien.
Sauf sur cette statistique car elle est un peu spéciale.
Voici le code qui m'affiche mon tableau sous format HTML
Une parti du formulaire:

<SELECT id="" name="annee4">
	<OPTION value="0"></OPTION>
		$req = Cnx::connectCnx()->prepare("SELECT DISTINCT YEAR( date_vente ) an_vente FROM contacts WHERE YEAR(date_vente)<>0000-00-00 ORDER BY an_vente DESC"); 
		$req->execute(array('id' => $Auth->user('id'))); 
			while($user=$req->fetch(PDO::FETCH_OBJ)) { 
					echo "<OPTION value=".$user->an_vente.">".$user->an_vente."</OPTION>"; 
					$annee_min4 = $user->an_vente;
			}
				
</SELECT>	
Le traitement

<?php
$now = date('Y'); //année actuelle
$annees = range($annee_min4, $now );//génère les années comprises entre l'année la plus petite enregistrée en BDD et l'année actuelle
$_SESSION['annees'] = range($annee_min4, $now );//idem mais en session pour PHPEXCEL
$total_par_an='';

foreach ( $annees as $annee ) {
   $total_par_an .=",SUM(CASE WHEN YEAR(date_vente) = '".$annee."'  THEN ttc/(1+(tva/100)) ELSE 0 END) '".$annee."' ";
}
$req1 = Cnx::connectCnx()->prepare("SELECT c.prod_ref, p.categorie_prod ".$total_par_an ." FROM contacts c INNER JOIN produits p ON c.prod_ref=p.ref_prod AND c.prod_ref <>  '' AND YEAR(date_vente) NOT LIKE '0' GROUP BY p.categorie_prod ORDER BY YEAR(date_vente)");

if ( $req1->execute(array(':annee' => $_SESSION['annee4'], ':commercial' => $_SESSION['commercial4'])) )
	{
		$ventes = $req1->fetchAll(PDO::FETCH_ASSOC);
?>		
		
<table class="tabl_graph">
	<thead>
		<tr>
			<th></th>
			<?php foreach ( $annees as $annee ) { echo "<th>".$annee."</th>";}?>
		</tr>
	</thead>
	<tbody>
			<?php foreach ( $ventes as $annee_v ){ ?>
		<tr>
			<th><?php echo $annee_v['categorie_prod']; ?></th>
			<?php foreach ( $annees as $annee ) {
		
if(number_format($annee_v[$annee], 2, ',', ' ') == 0.00) {
		$resultat4 = '-';
	}
else {
		$resultat4 = number_format($annee_v[$annee], 2, ',', ' ');
	}
					echo '<td>'.$resultat4.'</td>'."\n";
			} ?>
		</tr>
		   <?php } ?>
	</tbody>
</table>
<?php
}
?>
Jusque là aucun soucis, ça fonctionne parfaitement.
Maintenant, pour l'exporter en format excel, voici ce que j'ai
<?php
$workbook = new PHPExcel;
$sheet = $workbook->getActiveSheet();			

$query = Graph::connectGraph()->query("SELECT c.prod_ref, p.categorie_prod ".$total_par_an ." FROM contacts c INNER JOIN produits p ON c.prod_ref=p.ref_prod AND c.prod_ref <>  '' AND YEAR(date_vente) NOT LIKE '0' GROUP BY p.categorie_prod ORDER BY YEAR(date_vente)");

$nbre=$query->ColumnCount();

			for($i=0;$i<$nbre;$i++){//design entete dans excel
					$j=$i;
					$sheet->getStyleByColumnAndRow($j++,1)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
			}


			for($i=0;$i<=23;$i++){//design entete dans excel
					$styleA = $sheet->getStyleByColumnAndRow($i,1);
					$styleA->applyFromArray(array(
					'font'=>array(
						'bold'=>true),
					));
			}
		$sheet->setCellValueByColumnAndRow(0,1,'Produit' );
		$sheet->setCellValueByColumnAndRow(1,1,'2013' );// A AFFICHER DYNAMIQUEMENT
		$sheet->setCellValueByColumnAndRow(2,1,'2014' );// A AFFICHER DYNAMIQUEMENT


$ligne = 2;
while($data = $query->fetch()){
		$colonne=0;
		$sheet->setCellValueByColumnAndRow($colonne, $ligne, $data['categorie_prod']);$colonne++;
		$sheet->setCellValueByColumnAndRow($colonne, $ligne, $data['2013']);$colonne++;// A AFFICHER DYNAMIQUEMENT
		$sheet->setCellValueByColumnAndRow($colonne, $ligne, $data['2014']);$colonne++;// A AFFICHER DYNAMIQUEMENT
		$ligne++;//ligne suivante					
		}
Le code tel que vous le voyez fonctionne très bien, mais je voudrai que l'affichage des colonnes "Année" s'affiche dynamiquement en fonction des années enregistrées en BDD.
Une idée svp?