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 24281 Statut Contributeur -
yg_be Messages postés 24281 Statut Contributeur -
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\"");
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\"");
A voir également:
- Mettre deux lignes d'une requête sql en une seule dans un fichier Excel
- Fichier bin - Guide
- Comment imprimer un tableau excel sur une seule page - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier epub - Guide
- Déplacer une colonne excel - Guide
5 réponses
bonjour,
je suggère de remplacer ta bouccle while par:
EDIT: quelques modifs
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
tiens compte de ceci: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Bonjour,
c'est bien fait ,
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)
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 ) :
EDIT : Ajout des balises de code
Qui donne comme résultat :
*
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) ....
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
- 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;
}
