Mettre deux lignes d'une requête sql en une seule dans un fichier Excel

Lemjid Messages postés 72 Statut Membre -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -
J'ai la requête qui donne comme résultat :

Apres avoir choisir les dates(Start/Stop) je généré un fichier Excel comme ca

Je veux avoir le résultat suivante :


J'utilise le code simple :

$query = " SELECT ....";
$result= $mysqli->query($query);
if( mysqli_num_rows($result) > 0){ $output .= '
<table class="table" bordered="1">
<tr>
<th class="virsteligne">Date start</th>
<th class="virsteligne">IO start</th>
<th class="virsteligne">lat start</th>
<th class="virsteligne">lng start</th>

<th class="virsteligne">Date stop</th>
<th class="virsteligne">IO stop</th>
<th class="virsteligne">lat stop</th>
<th class="virsteligne">lng stop</th>
</tr>
';
while($row = mysqli_fetch_array($result)) {
$output .= ' <tr>
<td>'.$row["dates"].'</td>
<td>'.$row["io1"].'</td>
<td>'.$row["lat"].'</td>
<td>'.$row["lng"].'</td>
<td>'.$row["io1"].'</td>
<td>'.$row["lat"].'</td>
<td>'.$row["lng"].'</td>
</tr>';}
$output .= '</table>';
$filename = "Rapport_".date('Y-m-d H:i:s') . ".xls";
header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=\"$filename\"");

5 réponses

Résumé de la discussion

Problème central : obtenir un fichier Excel à partir d'une requête MySQL et afficher les dates et paramètres géographiques pour start et stop. Des approches variées évoquées incluent mémoriser une date lors du traitement des enregistrements et différer l'affichage, calculer les durées lors du passage à la ligne suivante, ou réorganiser le rendu en colonnes dans Excel. Parmi les suggestions, certains préconisent de traiter gauche et droit en alternance et d'afficher les durées à la fin de chaque ligne, ou d'utiliser une variable tampon pour terminer la dernière ligne. En cas de besoin, des retours suggèrent d'améliorer le rendu Excel en évitant les duplications et d'envisager une approche alternative comme l'usage d'un tableau par colonne pour clarifier le fichier.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour,
    je suggère de remplacer ta bouccle while par:
    $gauche = TRUE;
    while($row = mysqli_fetch_array($result)) {
     if ($gauche) {
      $output .= ' <tr> ';
     }
     $output .= '<td>'.$row["dates"].'</td>
      <td>'.$row["io1"].'</td>
      <td>'.$row["lat"].'</td>
      <td>'.$row["lng"].'</td>
      <td>'.$row["io1"].'</td>
      <td>'.$row["lat"].'</td>
      <td>'.$row["lng"].'</td>';
     if ( ! $gauche) {
      $output .= ' </tr> ';
     }
     $gauche = ! $gauche;
    }


    EDIT: quelques modifs
    0
  2. Lemjid Messages postés 72 Statut Membre
     
    J'ai déjà cette résultat : [https://img-


    Le résultat souhaite est le suivant :
    0
    1. Lemjid Messages postés 72 Statut Membre > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Bonjour,
      c'est bien fait ,
          $query = " SELECT ....";
      $result= $mysqli->query($query);
      if( mysqli_num_rows($result) > 0){ $output .= '
      <table class="table" bordered="1">
      <tr>
      <th class="virsteligne">Date start</th>
      <th class="virsteligne">IO start</th>
      <th class="virsteligne">lat start</th>
      <th class="virsteligne">lng start</th>
      
      <th class="virsteligne">Date stop</th>
      <th class="virsteligne">IO stop</th>
      <th class="virsteligne">lat stop</th>
      <th class="virsteligne">lng stop</th>
      </tr>
      ';
      while($row = mysqli_fetch_array($result)) {
      $output .= ' <tr>
      <td>'.$row["dates"].'</td>
      <td>'.$row["io1"].'</td>
      <td>'.$row["lat"].'</td>
      <td>'.$row["lng"].'</td>
      <td>'.$row["io1"].'</td>
      <td>'.$row["lat"].'</td>
      <td>'.$row["lng"].'</td>
      </tr>';}
      $output .= '</table>';
      $filename = "Rapport_".date('Y-m-d H:i:s') . ".xls";
      header("Content-Type: application/vnd.ms-excel");
      header("Content-Disposition: attachment; filename=\"$filename\"");
      0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Lemjid Messages postés 72 Statut Membre
       
      as-tu testé ma suggestion en #1?
      0
    3. Lemjid Messages postés 72 Statut Membre > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Oui, j'ai eu ca : les quatre lignes deviennent 2 lignes mais j'ai eu une duplication à gauche (en jeune) qui est non utile
      0
    4. Lemjid Messages postés 72 Statut Membre > Lemjid Messages postés 72 Statut Membre
       
      Avez vous des idées comment je peut supprimer les doublons en jeunes :(
      0
  3. Lemjid Messages postés 72 Statut Membre
     
       .....
       $result= $mysqli->query($query);
    
     if(  mysqli_num_rows($result) > 0)
     {
       $output .= '
       <table class="table" bordered="1">  
                        <tr>  
                             <th class="virsteligne">Article</th>  
                             <th class="virsteligne">Date start</th>  
                             <th class="virsteligne">Heure start</th>  
    						 <th class="virsteligne">GPS Start</th>						 
    						 <th class="virsteligne">Adress start</th>
    						 <th class="virsteligne">Date stop</th>
    						 <th class="virsteligne">Heure stop</th>
    						 <th class="virsteligne">Coordonnées GPS STOP</th>
    						 <th class="virsteligne">Adresse stop</th>	
    						 <th class="virsteligne">Temps</th>						 
    						 <th class="virsteligne">Contact</th>
    						 <th class="virsteligne">Station </th>
    						 <th class="virsteligne">Trajet</th>
    						 <th class="virsteligne">ometre</th>
                        </tr>';
     $gauche = TRUE;
      while($row = mysqli_fetch_array($result)){
    
    	
    	if ($gauche) {
    	  $output .= ' <tr> ';
    	}
        $output .= '        <td>'.$row["name"].'</td>  
    						
    						//Début Tous les lignes de la base de donnéees  dont les Io=1 // 
    						<td>'.date("d/m/Y", strtotime($row["date"])).'</td> 					
    						<td>'.date("H:i:s", strtotime($row["date"])).'</td>   
    						<td>'.$row["lat"].','.$row["lng"].'</td>  
    						<td>'.$row["name"].'</td>    
    						//Fin
    						
    						
    						//Début Tous les lignes de la base de donnéees  dont les Io=0 // 
    						<td>'.date("d/m/Y", strtotime($row["dt_trackers"])).'</td> 					
    						<td>'.date("H:i:s", strtotime($row["dt_trackers"])).'</td>   
    						<td>'.$row["lat"].','.$row["lng"].'</td>  
    						<td>'. $adresse.'</td>  
    						//Fin
    						
    						
    						<td>'.$row["Temps"].'</td>
    						<td>'.$row["Contact"].'</td>  
    						<td>'.$row["Station"].'</td>  
    						<td>'.$row["Trajet"].'</td>  
    						<td>'.$row["ometre"].'</td>';
    	if ( ! $gauche) {
        $output .= ' </tr> ';
        }
        $gauche = ! $gauche;					
        }
        $output .= '    <tr>  
                             <th class="lastligne"></th>   
    						 
                             <th class="lastligne"></th> 
                             <th class="lastligne"></th>   
                             <th class="lastligne"></th> 					 
    						 <th class="lastligne"></th>
    						 
    						 <th class="lastligne"></th>   
                             <th class="lastligne"></th> 
    						 <th class="lastligne"></th>   
                             <th class="lastligne">Somme</th> 
    						 
    						 <th class="lastligne"></th> 
    						 <th class="lastligne"></th>  
                             <th class="lastligne"></th>   
                             <th class="lastligne"></th> 
    						 <th class="lastligne"></th> 
    						 
                        </tr>
      ';
      $output .= '</table>';
      $filename = "Rapport_".date('Y-m-d H:i:s') . ".xls";			
      header("Content-Type: application/vnd.ms-excel");
      header("Content-Disposition: attachment; filename=\"$filename\"");
      
     }
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      et en remplaçant les lignes 31 à 53 par:
       $output .= '<td>'.$row["dates"].'</td>
        <td>'.$row["io1"].'</td>
        <td>'.$row["lat"].'</td>
        <td>'.$row["lng"].'</td>';  
      , n'obtiens-tu pas ce que tu décris en #2?
      0
      1. Lemjid Messages postés 72 Statut Membre > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        J'ai cette résultat :


        Ce qui est en vert : C'est correcte ( les deux ligne dont io=1)
        Ce qui est en rouge la 1iere ligne est vide et toute est écrit dans une seule ligne ( les deux ligne dont io=0)
        :(
        0
      2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Lemjid Messages postés 72 Statut Membre
         
        peux-tu montrer le code?
        je me demande si tu n'essaies pas d'obtenir autre chose que ce que tu expliquais en #2.
        0
      3. Lemjid Messages postés 72 Statut Membre > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Oui , c'est que je cherche : BRAVO

        Un seul truc : Au niveau de la cellule J ; je veux faire la différence entre : Heure stop & Heure start c-a-d
        Durée de conduit = Heure stop - Heure start

        Merci d'avance pour votre aide
        0
      4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Lemjid Messages postés 72 Statut Membre
         
        moi je rejouterais ceci à la première ligne du SELECT:
        timediff(cp.dates, dp.dates) as duree
        0
  4. Lemjid Messages postés 72 Statut Membre
     
    J'ai la ajouté au niveau de requête de SELECT mais ca pas donnée la bonne résultat et à mon avis c'est incorrecte de le mettre au niveau de SELECT car le résultat de select est :


    Le résultat au niveau de Excel est :


    Et n'oublier pas que les valeurs de SELECT sont devenue dans une seule ligne (avec le code #10)
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      il est en effet préférable de calculer la différence de dates en PHP.
      0
      1. Lemjid Messages postés 72 Statut Membre > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Oui c'est vrai mais comment je peux le faire en PHP vue que j'ai passé par une long requête pour filtrer les 1iere dont j'ai io1=1 puis les 1iere dont io1=0 et a ce de suite (la requête de select c'est déjà assez compliquer ) :

         select cp.idc as id, cp.dt_trackers, cp.io1c as io1,
         cp.name,
         TIMEDIFF(cp.dt_trackers, dp.dt_trackers) as duree
         from 
         (select d1.id as idc, d1.io1 as io1c, d1.dt_trackers, max(d2.id) as idp,
         d1.name
         from gs_data as d1, gs_data as d2
         where d1.id > d2.id
         group by d1.id) as cp,
         gs_data as dp
         where dp.id = cp.idp and dp.io1 <> cp.io1c ;
        


        EDIT : Ajout des balises de code

        Qui donne comme résultat :



        *
            • Donc moi je doit faire au niveau de cette requete :

        2020-07-23 10:42:26 - 2020-07-23 10:16:50 et puis
        2020-07-23 10:59:04 - 2020-07-23 10:56:55 ( c-a-d Io0 -Io1) ....
        0
      2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Lemjid Messages postés 72 Statut Membre
         
        c'est assez simple:
        - quand tu traites un enregistrement de gauche, tu mémorises sa date dans une variable
        - quand tu traites un enregistrement de droite, tu calcule la durée et tu l'affiches
        0
      3. Lemjid Messages postés 72 Statut Membre > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Oui c'est ca : Merci
        0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Lemjid Messages postés 72 Statut Membre
     
    Juste j'ai une question : est-il possible de calculer le somme au niveau de la dernière ligne comme ca :
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      moi, je calculerais la somme en PHP, en additionnant les valeurs dans la boucle d'affichage.
      je me demande si il est utile de faire la somme des valeurs des odomètres.
      0
    2. Lemjid Messages postés 72 Statut Membre > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Merci,
      Oui bonne question : C'est inutile
      0
    3. Lemjid Messages postés 72 Statut Membre > Lemjid Messages postés 72 Statut Membre
       
      restant dans le même sujet :( :
      @yg_be : Avez vous une idée comment je peut calculer ce truc en PHP de Contact Off qui est égale : Heure Start de 2iem ligne - Heure STOP de 1ier ligne (dans mon cas en Excel la formule est : =C3-G2 )
      mon tableau :




      Merci d'avance pour votre aide .
      0
    4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Lemjid Messages postés 72 Statut Membre
       
      moi je ferais presque comme en #18:
      - quand tu traites un enregistrement de droite, tu mémorises sa date dans une variable et tu ne termines pas la ligne de la table
      - quand tu traites un enregistrement de gauche, sauf le premier, tu calcules la durée "contact off" et tu l'affiches à la fin de la ligne précédente, que tu termines
      - à la fin de la boucle, il faut terminer la dernière ligne
      0
    5. Lemjid Messages postés 72 Statut Membre > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Voila mon boucle while déjà calculer les date a droite et à gauche :
      while($row = mysqli_fetch_array($result)){
      	
          $odometre =(($row["odometre"])/1000);
      	$odometre_converti = str_replace('.',',',$odometre);
      	
          $duree =((strtotime($row["dt_trackers"]))-(strtotime($row["dt_trackers"])));
      	
      	$objadd=new DbFunction();
      	$adresse=$objadd->geolocationAddress($row["lat"],$row["lng"]);
      	
      	if ($gauche) {
      	  $output .= ' <tr> <td>'.$row["name"].'</td>';
      	  $d1 = $row["dt_trackers"];
      	  
      	  $odometre1 = $row["odometre"];
      	}
       
          $output .= '    <td>'.date("d/m/Y", strtotime($row["dt_trackers"])).'</td> 					
      					<td>'.date('H:i:s', (strtotime("+60 minute", strtotime($row["dt_trackers"])))).'</td>
      					<td>'.$row["lat"].','.$row["lng"].'</td>  
      					<td>'.$adresse.'</td>';  
        
      	if ( ! $gauche) {
      		$d2 = $row["dt_trackers"];
      		$duree =((strtotime($d2))-(strtotime($d1)));
      		$odometre2 = $row["odometre"];
              $distance=($odometre2-$odometre1); 
      		
      		
          $output .= '    <td>'.date('H:i:s',$duree).'</td> 
      					<td>'.$row["contact_off"].'</td>  
      					<td>'.$row["stationaire_m"].'</td>  
      					<td>'.$distance.'</td>  
      					<td>'.$odometre_converti.'</td> 
      					</tr>';
          }
          $gauche = ! $gauche;					
          }
      0