[RESOLU] Mise en forme fichier CSV sur excel via PHP

Eléphanteau du PHP | 23 Messages

03 déc. 2013, 12:11

Bonjour,
Je vous expose mon problème, sur l'intranet de mon entreprise et plus particulièrement sur une page de "Relevé heures intérimaire", quand je choisie les rubriques etc .. et que je clic sur "filtrer" pour ensuite avoir la boite de dialogue "Enregistrer sous" qui s'affiche, tout marche le fichier CSV est reconnue et ouvert directement dans Excel, mais seul bémole il m'affiche uniquement les lignes de commande de mon fichier PHP (Hors quand j'était en HTML il me faisait bien mon tableau !
Voici mes commandes :
<?php
 
$file = 'Relevé heures intérimaires.csv';
header('Content-disposition: '.$file);
header('Content-type: application/octetstream');
header('Content-Type: text/csv');
 
header('Content-Disposition: attachment; filename="Relevé heures intérimaires.csv"');
 
 readfile($file);


echo '<SCRIPT LANGUAGE="JavaScript">
<!--
<form name="frm" action="doDownload.php" method="POST">
    <input type="hidden" name="div" />
</form>
 
function enregister_zone() { 
  document.frm.div.value = document.getElementById("test").innerHTML;
  document.frm.submit();
}
</script>';
Merci d'avance pour votre aide! si vous avez des questions ou que vous voulez d'autre ligne de commandes n'hésitez pas, je vous enverrais çà !
Modifié en dernier par moogli le 03 déc. 2013, 15:35, modifié 1 fois.
Raison : BBCODE PHP !

Eléphanteau du PHP | 23 Messages

03 déc. 2013, 12:44

Par ailleur j'ai vue beaucoup de fois revenir le mot : "fgetcsv"dans des forums mais je ne sais pas ce à quoi çà correspond/A quoi çelà sert et quelle est sa commande ?
Merci ! :)

Eléphanteau du PHP | 23 Messages

03 déc. 2013, 13:01

Voici si jamais toutes les lignes de commande :
<?
include("fonction.php");
include("fonction_personnel.php");
include("class_i_paye.php");
if (!d_ok(472)){header("location: accueil.php");exit;}

if (($save == 1)or($save == 2)){$load=' onload="download();" ';}


if (!isset($r_sem))
{
$r_sem=strftime("%V");
$r_annee=strftime("%Y");
$c3=1;
}

if(($save==3)and($mat > 0))
{
$res=my_query("select * from interne_compteur where mat = $mat order by id desc limit 1 ; ");
if(mysql_num_rows($res) == 1)
	{
	$row=mysql_fetch_array($res);
	$message="<center><h3>La semaine ".$row["semaine"]." de l'année ".$row["annee"]." du matricule $mat a été décloturé ! </h3></center>";
	my_query("update interne set compteur = '".$row["compteur_deb"]."' , conge_anc = '".$row["conge_anc_deb"]."' , conge_n = '".$row["conge_n_deb"]."' , conge_old = '".$row["conge_old_deb"]."' where mat = $mat");
	my_query("update pointage set clos = 0 where date >= '".$row["date"]."' and mat = $mat ;");
	del_visit(__FILE__,__LINE__,DL_1,"interne_compteur","where id = ".$row["id"]." ;");
	log2(__FILE__,__LINE__,DL_1,"La semaine ".$row["semaine"]." de l année ".$row["annee"]." du matricule $mat a été décloturé !");
	}
$mat='';
}


if(($save == 1)or($save == 2))
{
?>
<?php
 
$file = 'Relevé heures intérimaires.csv';
header('Content-disposition: '.$file);
header('Content-type: application/octetstream');
header('Content-Type: text/csv');
 
header('Content-Disposition: attachment; filename="Relevé heures intérimaires.csv"');
 
 readfile($file);


echo '<SCRIPT LANGUAGE="JavaScript">
<!--
<form name="frm" action="doDownload.php" method="POST">
    <input type="hidden" name="div" />
</form>
 
function enregister_zone() { 
  document.frm.div.value = document.getElementById("test").innerHTML;
  document.frm.submit();
}
</script>';



$ic = 0;


$res=my_query("SELECT * from evenement ;");
while($row=mysql_fetch_array($res))
	{
	$tab_e[$row["code"]]["code"]=$row["code"];
	$tab_e[$row["code"]]["paye"]=$row["paye"];
	$tab_e[$row["code"]]["tr"]=$row["tr"];
	$tab_e[$row["code"]]["abr"]=$row["abr"];
	$tab_e[$row["code"]]["des"]=$row["des"];
	$tab_e[$row["code"]]["paye"]=$row["paye"];
	}

$tab_h = tab_horaire();
	


	if($soc_interim > 0)$req2 .= " and fournisseur = '$soc_interim' ";
	if($secteur > 0)$req2 .= " and secteur = '$secteur' ";
	if($site > 0)$req2 .= " and site = '$site' ";
	if($r_mat > 0)$req2 .= " and mat = '$r_mat' ";
	$req= "select `mat` , `nom` , `fournisseur` from `interne` where contrat in (3,4) and actif = 1 $req2 order by `fournisseur` , `nom` , `prenom` asc ;";	
	if (!$res2=my_query($req)){echo "problème de connexion avec la base de donnée !";exit;}
	while ($row=mysql_fetch_array($res2))
	{
	echo $entete;
	$cp= new paye_interim;
	$cp->tab_e = $tab_e;
	$cp->tab_h = $tab_h;
	$cp->semaine=$r_sem;
	$cp->annee=$r_annee;
	$cp->mat=$row[0];
	$cp->cloturer = $cloturer;
	$cp->aff();
	echo '</p>';
	}



}
else
{

$page = new page;
$page->head("Préparation a la paye");
$page->body();
$page->entete("Préparation a la paye");
$page->add_button(1,0);
$page->add_button(2,1,parent(472));
$page->add_button(3,0);
$page->add_button(0,2);
if(d_ok(477))$page->add_button(29,1,"personnel_i_facture.php","Facture des Interimaires");
if(d_ok(430))$page->add_button(22,1,"personnel_i_renouvellement.php","Fiche de renouvellement des interimaires");
if(d_ok(475))$page->add_button(39,1,"personnel_facture_ticket.php","Facture ticket restaurant");

$page->fin_entete();
$page->datescript();
echo $message;
?>

<form method="post" name="form1" action="personnel_i_paye.php"  target="_blank">
<input type="hidden" name="save" value="1">

<table class=forumline cellSpacing=1 cellPadding=2 width="50%" align=center border=0>
<tr>
<td colspan=2 class=m3>Relevé des heures des interimaires</td>
</tr>
<tr>
<td  class=cel1>&nbsp;Semaine : </td>
<td  class=cel2>&nbsp;<select id="button2" size="1" name="r_sem" >
<?
$sem=strftime("%V");
for ($i=1;$i < 54; $i++)
{
if ($i == $r_sem){$s=" selected ";}else{$s="";}
echo '<option value="'.$i.'" '.$s.'>'.$i.'</option>'."\n";
}
?>
</select>
</td>
</tr>
<tr>
<tr>
<td  class=cel1>&nbsp;Année : </td>
<td  class=cel2>&nbsp;<select id="button2" name="r_annee" size="1" >
<?
$year=date("Y");
if ($r_annee == $year){$a1 = " selected ";}else{$a1="";}
if ($r_annee == ($year - 1)){$a2 = " selected ";}else{$a2="";}
echo "<option value=\"$year\" $a1> $year </option>\n";
echo "<option value=\"".($year - 1)."\" $a2> ".($year - 1)." </option>\n";
?>
</select>
</td>
</tr>
<tr>
<td class=cel1>&nbsp;Matricule : </td>
<td  class=cel2>&nbsp;<input size=8 id=button4 maxlength=4 type=text name="r_mat" value="<?echo $r_mat;?>" >
</td>
</tr>
<tr>
<td class=cel1 >&nbsp;Secteur : </td>
<td class=cel2 >&nbsp;<? echo liste_d2($j_secteur,$secteur,"secteur");?></td>
</tr>
<tr>
<td class=cel1 >&nbsp;Site : </td>
<td class=cel2 >&nbsp;<? echo liste_d2($j_site,$site,"site");?></td>
</tr>
<tr>
<td class=cel1 >&nbsp;Fournisseur : </td>
<td class=cel2 >&nbsp;<select id="button" name="soc_interim" size="1" >
<option value="0">TOUTES</option>
<?
$res=my_query("SELECT es.id , es.societe ,es.site, interne.fournisseur FROM interne left join externe_service as es on interne.fournisseur = es.id where interne.fournisseur > 0 and es.id is not null  group by interne.fournisseur order by es.societe asc");
while($row = mysql_fetch_array($res))
{
echo "\t\t<option value=\"$row[0]\" ".$sel." > ".$row[1]." - ".$row[2]."</option>\n";
}
?>
</select>
</td>
</tr>
<tr>
<td class=cel1 >&nbsp;Cloturer cette semaine : </td>
<td class=cel2 >&nbsp;<? echo liste_d2($j_yn,0,"cloturer");?></td>
</tr>
<tr>
<td colspan=2  class=m3><input id=button3 type=submit value="Filtrer"></td>
</tr>
</TABLE>

</form>
<br><br>

<form method="post" name="form2" action="personnel_cloture.php"  target="_blank">
<input type=hidden name="save" value="1">

<input type=hidden name="contrat" value="3">

<TABLE class=forumline cellSpacing=1 cellPadding=1 width="50%" align=center border=0>
<tr>
<td class=m3 height=25 colspan=2>Tableau récapitulatif</td>
</tr>
<tr>
<td class=cel1 width=50% >&nbsp;Matricule :</td>
<td class=cel2>&nbsp;<input type=texte name="mat" size="10" value="<? echo $mat ?>" ></td>
</tr>
<tr>
<td  class=cel1>&nbsp;Première semaine : </td>
<td  class=cel2>&nbsp;<select id="button2" size="1" name="r_sem_1" >
<?
$sem=strftime("%V");
for ($i=1;$i < 54; $i++)
{
if ($i == $r_sem_1){$s=" selected ";}else{$s="";}
echo '<option value="'.$i.'" '.$s.'>'.$i.'</option>'."\n";
}
?>
</select> &nbsp; <select id="button2" name="r_annee_1" size="1" >
<?
$year=date("Y");
if ($r_annee_1 == $year){$a1 = " selected ";}else{$a1="";}
if ($r_annee_1 == ($year - 1)){$a2 = " selected ";}else{$a2="";}
echo "<option value=\"$year\" $a1> $year </option>\n";
echo "<option value=\"".($year - 1)."\" $a2> ".($year - 1)." </option>\n";
?>
</select>
</td>
</tr>

<tr>
<td  class=cel1>&nbsp;Dernière semaine : </td>
<td  class=cel2>&nbsp;<select id="button2" size="1" name="r_sem_2" >
<?
$sem=strftime("%V");
for ($i=1;$i < 54; $i++)
{
if ($i == $r_sem_2){$s=" selected ";}else{$s="";}
echo '<option value="'.$i.'" '.$s.'>'.$i.'</option>'."\n";
}
?>
</select> &nbsp; <select id="button2" name="r_annee_2" size="1" >
<?
$year=date("Y");
if ($r_annee_2 == $year){$a1 = " selected ";}else{$a1="";}
if ($r_annee_2 == ($year - 1)){$a2 = " selected ";}else{$a2="";}
echo "<option value=\"$year\" $a1> $year </option>\n";
echo "<option value=\"".($year - 1)."\" $a2> ".($year - 1)." </option>\n";
?>
</select>
</td>
</tr>

<tr>
<td class=m3 height=25 colspan=2><input id=button3 type=submit value="Filtrer"></td>
</tr>
</TABLE>


</form>


<br>

<form method="post" name="form3" action="personnel_i_paye.php"  target="_self">
<input type=hidden name="save" value="3">

<TABLE class=forumline cellSpacing=1 cellPadding=1 width="50%" align=center border=0>
<tr>
<td class=m3 height=25 colspan=2>Décloturer la dernière semaine du matricule : &nbsp; <input type=texte name="mat" size="5" value="<? echo $mat ?>" > &nbsp; <input id=button3 type=submit value="Décloturer"></td>
</tr>
</TABLE>


</form>


<?
}


?>
</center>
<?
echo pied_page();
?>
Modifié en dernier par moogli le 03 déc. 2013, 15:33, modifié 1 fois.
Raison : BBCODE PHP !

ViPHP
xTG
ViPHP | 7331 Messages

03 déc. 2013, 14:18

Je commencerai par remplacer les short_tags :
<?
par
<?php
car suivant la configuration de ton serveur ils peuvent ne pas être interprétés (et donc renvoyé au navigateur comme du texte brut).

Eléphanteau du PHP | 23 Messages

03 déc. 2013, 14:39

Je les ai tous remplacer et le problême persiste, ne serai-ce pas un problème de mise en forme (manque de commande) ?

Je précise que quand j'enlève cette petite partie de commande (çà ne change rien du tout donc est ce que je doit la laisser ?):

echo '<SCRIPT LANGUAGE="JavaScript">
<!--
<form name="frm" action="doDownload.php" method="POST">
<input type="hidden" name="div" />
</form>

function enregister_zone() {
document.frm.div.value = document.getElementById("test").innerHTML;
document.frm.submit();
}
</script>';

Eléphant du PHP | 79 Messages

03 déc. 2013, 15:17

Si on peut avoir un descriptif de ce que tu dois faire et à quelle étape sa bloque, parce que bon lire des lignes de code pour déchiffré là où tu veux en venir, c'est pas agréable.

Eléphanteau du PHP | 23 Messages

03 déc. 2013, 15:33

Ce que je voudrais faire, c'est une fois mes rubriques en "volet deffilent" choisi ; exemple = Semaine : ("volet deffilent"je choisi 49). Donc semaine 49 séléctionner. Bref une fois que j'ai mis tout mes critères de recherche, je clic sur le bouton "Filtrer" et donc, (à partir de là) avant sa m'ouvrais une nouvelle onglet avec le fichier HTML (qui était un tableau avec tous les critères de recherche séléctionner et donc les résultats mis à cotés), Or moi je voulais que quand je clic sur le "Filtrer" sa m'ouvre une boite de dialogue où l'on clic sur "Enregistrer sous" ou "Ouvrir avec" etc .. Donc j'ai effectuer les modifs', j'ai bien la boite de dialogue et l'onglet, j'ai bien le fichier au format csv et donc reconnue par excel qui s'ouvre or quand je l'ouvre j'obtien le fichier cepandant au lieux d'avoir le tableau (le même que quand c'était sur HTML) je me retrouve avec tout plein de donnée qui sont celle du fichier PHP (les lignes de commandes, donc rien à voir). Voilà mon problème (j'ai été je pense le plus clair possible ^^)

Eléphanteau du PHP | 23 Messages

03 déc. 2013, 16:08

Au passage si vous voulez une copie de l'ancien fichier (quand c'était en HTML) il n'ya à presque rien qui change a part de la ligne 35 à 58.

Sur l'ancien il y'avais çà :

<html><head></head><body onload="printPage();">
<STYLE type=text/css>



td{
font-family: Arial;
font-size: 11;
border-bottom-width:1;
border-left-width:0;
border-right-width:1;
border-top-width:0;
border-style:inset;}

.tete{font-weight:bolder;}

td.t2{
background-color: #ffffff;
color:#000000;
border-width:0;}

.print{page-break-after:always;height:auto;page:auto;}
</STYLE>

<center>
<?


echo '<SCRIPT LANGUAGE="JavaScript">
<!--
function printPage()
{
if (window.print)
{
agree = confirm(\'Imprimer la fiche ?\');
if (agree) window.print();
}
}
-->
</script>';

Eléphant du PHP | 79 Messages

03 déc. 2013, 16:17

Tu veux donc faire un export d'une requête SQL en fichier CSV.

Avec la manipulation que tu fais, tu enregistre en fait la page web complète. Il est claire que ton tableur va donc en faire une mauvaise lecture. Pour moi tu dois donc afficher ta requête SQL par les moyens classique (html) et proposé un lien de téléchargement en CSV. Ce lien renverrait à un script de ce genre :
<?php

$dsn = "mysql:dbname=maBaseDeDonnees;host=127.0.0.1;port=3306;" ;

$database = new PDO( $dsn, 'root', '' );

$fichier = "id;col1;col2\n";
$filtre = 'unFiltre' ;

$sql = "SELECT id,col1,col2 FROM maTable WHERE filtre = ?" ;
$req = $database-> prepare( $sql );
$req-> execute( array( $filtre ) );

foreach( $req-> fetchAll( PDO::FETCH_ASSOC ) as $row )
{
    $fichier .= implode( ';', $row )."\n" ;
}

header( "Content-type: application/vnd.ms-excel" );
header( "Content-disposition: attachment; filename=fichier.csv" );
print $fichier ;
exit ;
Ciao
Modifié en dernier par orenx22 le 03 déc. 2013, 16:52, modifié 3 fois.

Eléphanteau du PHP | 23 Messages

03 déc. 2013, 16:20

Et donc j'ai juste à copie/coller le lien ?

A la place d'autre chose ou en plus ?

Eléphant du PHP | 79 Messages

03 déc. 2013, 16:24

Quelles sont les étapes :

1ère : formulaire de sélection des différents filtre.
2ème : Affichage du résultat de la requête SQL en HTML lisible dans ton navigateur. Sur cette page un lien pour récupérer le même résultat en format CSV.
3ème : Au cliquant sur lien, tu es redirigé vers un script comme celui que j'ai fait dans le post plus haut. Automatiquement un téléchargement va être proposé avec le contenu de ta requête en CSV cette fois.

Il est clair que le script que j'ai fournis doit être modifié en fonction des tes besoins SQL.
Modifié en dernier par orenx22 le 03 déc. 2013, 16:28, modifié 1 fois.

Eléphanteau du PHP | 23 Messages

03 déc. 2013, 16:27

Ok, j'ai compris mais là tu parle à un novice/débutant ^^

Tu pourrais m'expliquer en vitesse ce que tu entend par modifier en fonction de mes besoin SQL ? Quelle ligne précisement je dois modifier ?
Au passage désoler de t'ennuyer :/
Modifié en dernier par mateo2996 le 03 déc. 2013, 16:31, modifié 1 fois.

Eléphant du PHP | 79 Messages

03 déc. 2013, 16:31

Utilises-tu une base de données ?

Eléphanteau du PHP | 23 Messages

03 déc. 2013, 16:32

Oui,

Eléphant du PHP | 79 Messages

03 déc. 2013, 16:42

Tu dois changer dans le script :

maBaseDeDonnees par le nom de la tienne.
dans l'objet PDO, remplacer 'root' et null par le bon login et mot de passe de la base de données.
dans la premier variable $fichier, tu dois donner les noms des différentes colonnes que tu veux récupérer dans ton fichier CSV.
changer la requête SQL dans la variable $sql en fonction de tes filtres souhaité.

Pour le reste rien ne changera.

Après si tu ne comprends pas, je te peux pas plus t'aider. Commence par le commencement pour te lancer dans la programmation PHP. Apprends ce qu'est une variable, un pointeur, une condition, une boucle, une fonction, un objet.. et tout le reste avant de ce lancer dans le développement de quelque chose ;)
Modifié en dernier par orenx22 le 03 déc. 2013, 16:45, modifié 1 fois.