Mettre deux lignes d'une requête sql en une seule dans un fichier Excel
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention -
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
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.
-
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 -
-
peux-tu montrer ton code?
tiens compte de ceci: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code -
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\""); -
-
-
-
-
..... $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\""); } -
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)-
- 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) ....
-
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
-
-
-
-
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 -
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; }
-
