Connexion excel et php mysql(base de donnees)
Fermé
majdoulin
Messages postés
106
Date d'inscription
lundi 16 juillet 2007
Statut
Membre
Dernière intervention
31 mai 2008
-
24 juil. 2007 à 10:50
majdoulin Messages postés 106 Date d'inscription lundi 16 juillet 2007 Statut Membre Dernière intervention 31 mai 2008 - 24 juil. 2007 à 17:15
majdoulin Messages postés 106 Date d'inscription lundi 16 juillet 2007 Statut Membre Dernière intervention 31 mai 2008 - 24 juil. 2007 à 17:15
A voir également:
- Connexion excel et php mysql(base de donnees)
- Gmail connexion - Guide
- Si et excel - Guide
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Formules excel de base - Guide
4 réponses
j'ai retrouvé ça dans mes sauvegardes est ce que cela répond à ta question ?
PHP Génération du fichier Excel sans graphique (www.developpez.com)
3.1. Explication du résultat voulu
Nous allons créer un fichier Excel qui contiendra tous les appels des clients, en ayant, un client par colonne et le total du nombre d'appels par client en bas de chaque colonne.
Comme vous vous en doutez, ne sachant pas à l'avance combien de clients ont effectué des appels, il nous faudra appliquer un algorithme pouvant déterminer à la volée, dans quelle colonne, il faudra placer les données.
Les colonnes Excel sont intitulées de la manière suivante "A" "B" "C"....."Z" "AA" "AB" "AC"..."BA" "BB".. Si plus de 26 clients ont appelé, il faudra donc placer le client 27 dans la colonne "AA" et ainsi de suite.
Pour pouvoir réaliser cela, nous allons jouer sur les codes ASCII, il y a peut-être d'autres méthodes mais celle-ci me convient.
Voici à quoi le fichier Excel ressemblera
3.2. Code PHP
<?
define("FILENAME","votre_racine_web\\phpexcel.xls"); //constante: nom du fichier à générer
$conn=mysql_connect('votre_hôte','utilisateur','mdp') or die('Probleme lors de la connexion a la BD MYSQL');
mysql_select_db('phpexcel',$conn) or die('Problème lors de la sélection de la BD MYSQL');//Sélection de la DB "phpexcel"
$query="SELECT DATE_APPEL,NOM_CLIENT,XID_CLIENT FROM APPELS_CLIENTS INNER JOIN CLIENTS ON ";
$query.="ID_CLIENT=XID_CLIENT ORDER BY XID_CLIENT,DATE_APPEL";//Requête faisant une jointure sur les 2 tables
$res=mysql_query($query) or die('Problème lors de la réception des enregistrements '.$query);//Exécution de la requête
if(mysql_num_rows($res)>0){ //Si au moins une ligne est retournée
if(file_exists(FILENAME)){ //Suppression du fichier précédement créé
unlink(FILENAME); //Suppression du fichier
}
$excel=new COM("Excel.application"); //Instanciation de l'objet COM
$excel->sheetsinnewworkbook=1;//1 seule feuille de calcul dans le document
$excel->Workbooks->Add();//Ajout d'un classeur
$book=$excel->Workbooks(1);//$book contient le classeur actif
$sheet=$book->Worksheets(1);//$sheet contient la feuille active
$sheet->Name="Rapport appel des clients";//Attribution d'un nom à la feuille
$j=64;//C'est ici qu'on va jouer sur les codes ascii
$jj=64;
$client_prec=0;
$nombre_ligne=0;
while($row=mysql_fetch_object($res)){//Parcours du résultat de la requête
if($client_prec != $row->XID_CLIENT){//Rupture sur le numéro de client
$j++;
$i=3;
if($nombre_ligne>0){
$lignes[]=$nombre_ligne;//le tableau $lignes contiendra le nbre d'appels par client
$nombre_ligne=0;
}
//Ce bloc if vérifie si il s'agit d'une colonne de type "A" "B" ou "AA" "AB"...
if($jj==64){
$cell=$sheet->Range(chr($j).'1');//chr, renvoie la lettre correspondant au code ASCII
}
else{
$cell=$sheet->Range(chr($jj).chr($j).'1');
}
$cell->value=$row->NOM_CLIENT;//Attribution d'une valeur à la cellule
$cell->HorizontalAlignment=-4108;//On centre le texte
$cell->Font->ColorIndex = 41;//Coloration
}
$nombre_ligne++;//$nombre_ligne sert à calculer le nbre d'appels par client
if($jj==64){
$cell=$sheet->Range(chr($j).$i);
}
else{
$cell=$sheet->Range(chr($jj).chr($j).$i);
}
//Si $j représentant la colonne simple = "Z", alors incrémenter $jj qui représente la 2ème colonne
if(chr($j)=='Z'){
$jj++;
$j=64;
}
$cell->value=$row->DATE_APPEL;//Attribution de la date et de l'heure à la cellule
$cell->NumberFormat="jj/mm/aaaa hh:mm:ss";//Définition du format de la cellule
/* Notez que selon vos paramètres régionaux et la configuration d'Excel, vous devez peut-être
utiliser un format de cellule comme ceci: dd/mm/yyyy hh:mm:ss (anglais)*/
$client_prec=$row->XID_CLIENT;//gestion de la rupture sur le numéro de client
$i++;
}
}
else{
die('Les tables sont vides ou pas de jointure possible');//si la requête ne retourne rien
}
$lignes[]=$nombre_ligne;//ajout des appels du dernier client dans $lignes
$sorted=$lignes; //on copie le nombre d'enreg par client dans un autre tableau
sort($sorted); //on trie cet autre tableau
//on récupère le plus grand nombre de record, pour pouvoir aligner les résultats dans Excel
$max_val=5+$sorted[count($sorted)-1];
$colonne=65;
$colonne2=64;
//Boucle allant afficher le nombre total d'appels par client
for($i=0;$i<count($lignes);$i++){
if($colonne2>64){
$cell=$sheet->Range(chr($colonne2).chr($colonne).$max_val);
}
else{
$cell=$sheet->Range(chr($colonne).$max_val);
}
if(chr($colonne)=='Z'){
$colonne2++;
$colonne=64;
}
$cell->value="Total: ".$lignes[$i];
$cell->HorizontalAlignment=-4108;
$cell->Font->ColorIndex=3;
$colonne++;
}
$book->saveas(FILENAME);//Sauvegarde du fichier
unset($sheet);//Libération de $sheet
unset($book);//Libération de $book
$excel->Workbooks->Close();//Fermeture du classeur
$excel->Quit();//On quitte Excel
unset($excel);//Libération de l'instance $excel
?>
PHP Génération du fichier Excel sans graphique (www.developpez.com)
3.1. Explication du résultat voulu
Nous allons créer un fichier Excel qui contiendra tous les appels des clients, en ayant, un client par colonne et le total du nombre d'appels par client en bas de chaque colonne.
Comme vous vous en doutez, ne sachant pas à l'avance combien de clients ont effectué des appels, il nous faudra appliquer un algorithme pouvant déterminer à la volée, dans quelle colonne, il faudra placer les données.
Les colonnes Excel sont intitulées de la manière suivante "A" "B" "C"....."Z" "AA" "AB" "AC"..."BA" "BB".. Si plus de 26 clients ont appelé, il faudra donc placer le client 27 dans la colonne "AA" et ainsi de suite.
Pour pouvoir réaliser cela, nous allons jouer sur les codes ASCII, il y a peut-être d'autres méthodes mais celle-ci me convient.
Voici à quoi le fichier Excel ressemblera
3.2. Code PHP
<?
define("FILENAME","votre_racine_web\\phpexcel.xls"); //constante: nom du fichier à générer
$conn=mysql_connect('votre_hôte','utilisateur','mdp') or die('Probleme lors de la connexion a la BD MYSQL');
mysql_select_db('phpexcel',$conn) or die('Problème lors de la sélection de la BD MYSQL');//Sélection de la DB "phpexcel"
$query="SELECT DATE_APPEL,NOM_CLIENT,XID_CLIENT FROM APPELS_CLIENTS INNER JOIN CLIENTS ON ";
$query.="ID_CLIENT=XID_CLIENT ORDER BY XID_CLIENT,DATE_APPEL";//Requête faisant une jointure sur les 2 tables
$res=mysql_query($query) or die('Problème lors de la réception des enregistrements '.$query);//Exécution de la requête
if(mysql_num_rows($res)>0){ //Si au moins une ligne est retournée
if(file_exists(FILENAME)){ //Suppression du fichier précédement créé
unlink(FILENAME); //Suppression du fichier
}
$excel=new COM("Excel.application"); //Instanciation de l'objet COM
$excel->sheetsinnewworkbook=1;//1 seule feuille de calcul dans le document
$excel->Workbooks->Add();//Ajout d'un classeur
$book=$excel->Workbooks(1);//$book contient le classeur actif
$sheet=$book->Worksheets(1);//$sheet contient la feuille active
$sheet->Name="Rapport appel des clients";//Attribution d'un nom à la feuille
$j=64;//C'est ici qu'on va jouer sur les codes ascii
$jj=64;
$client_prec=0;
$nombre_ligne=0;
while($row=mysql_fetch_object($res)){//Parcours du résultat de la requête
if($client_prec != $row->XID_CLIENT){//Rupture sur le numéro de client
$j++;
$i=3;
if($nombre_ligne>0){
$lignes[]=$nombre_ligne;//le tableau $lignes contiendra le nbre d'appels par client
$nombre_ligne=0;
}
//Ce bloc if vérifie si il s'agit d'une colonne de type "A" "B" ou "AA" "AB"...
if($jj==64){
$cell=$sheet->Range(chr($j).'1');//chr, renvoie la lettre correspondant au code ASCII
}
else{
$cell=$sheet->Range(chr($jj).chr($j).'1');
}
$cell->value=$row->NOM_CLIENT;//Attribution d'une valeur à la cellule
$cell->HorizontalAlignment=-4108;//On centre le texte
$cell->Font->ColorIndex = 41;//Coloration
}
$nombre_ligne++;//$nombre_ligne sert à calculer le nbre d'appels par client
if($jj==64){
$cell=$sheet->Range(chr($j).$i);
}
else{
$cell=$sheet->Range(chr($jj).chr($j).$i);
}
//Si $j représentant la colonne simple = "Z", alors incrémenter $jj qui représente la 2ème colonne
if(chr($j)=='Z'){
$jj++;
$j=64;
}
$cell->value=$row->DATE_APPEL;//Attribution de la date et de l'heure à la cellule
$cell->NumberFormat="jj/mm/aaaa hh:mm:ss";//Définition du format de la cellule
/* Notez que selon vos paramètres régionaux et la configuration d'Excel, vous devez peut-être
utiliser un format de cellule comme ceci: dd/mm/yyyy hh:mm:ss (anglais)*/
$client_prec=$row->XID_CLIENT;//gestion de la rupture sur le numéro de client
$i++;
}
}
else{
die('Les tables sont vides ou pas de jointure possible');//si la requête ne retourne rien
}
$lignes[]=$nombre_ligne;//ajout des appels du dernier client dans $lignes
$sorted=$lignes; //on copie le nombre d'enreg par client dans un autre tableau
sort($sorted); //on trie cet autre tableau
//on récupère le plus grand nombre de record, pour pouvoir aligner les résultats dans Excel
$max_val=5+$sorted[count($sorted)-1];
$colonne=65;
$colonne2=64;
//Boucle allant afficher le nombre total d'appels par client
for($i=0;$i<count($lignes);$i++){
if($colonne2>64){
$cell=$sheet->Range(chr($colonne2).chr($colonne).$max_val);
}
else{
$cell=$sheet->Range(chr($colonne).$max_val);
}
if(chr($colonne)=='Z'){
$colonne2++;
$colonne=64;
}
$cell->value="Total: ".$lignes[$i];
$cell->HorizontalAlignment=-4108;
$cell->Font->ColorIndex=3;
$colonne++;
}
$book->saveas(FILENAME);//Sauvegarde du fichier
unset($sheet);//Libération de $sheet
unset($book);//Libération de $book
$excel->Workbooks->Close();//Fermeture du classeur
$excel->Quit();//On quitte Excel
unset($excel);//Libération de l'instance $excel
?>
Je suppose que tu veux "lire" dans les deux bases en parallèle ?
alors une idée essayes de remlpacer:
$query = "insert into TProduits(NumPro,libPro,Prix,Qte)"; // champs de la table
$query .= "VALUES ('$UnMumero','$UnLibelle','$UnPrix','$UneQuantite') "; // les valeurs à insérer
$result = odbc_do ($cnx,$query);
par
$query_access = "SELECT* FROM table_access WHERE "tes conditions"; // extractions de la table access
$result_access = odbc_do ($cnx,$query_access);
et table_mysql WHERE "tes conditions"; // extractions de la table mysql
$result_mysql = mysql_query ($cnx,$query_mysql);
et après tu affiches les deux en même temps par une boucle while habituelle et la boucle for de l'exemple ci dessus
alors une idée essayes de remlpacer:
$query = "insert into TProduits(NumPro,libPro,Prix,Qte)"; // champs de la table
$query .= "VALUES ('$UnMumero','$UnLibelle','$UnPrix','$UneQuantite') "; // les valeurs à insérer
$result = odbc_do ($cnx,$query);
par
$query_access = "SELECT* FROM table_access WHERE "tes conditions"; // extractions de la table access
$result_access = odbc_do ($cnx,$query_access);
et table_mysql WHERE "tes conditions"; // extractions de la table mysql
$result_mysql = mysql_query ($cnx,$query_mysql);
et après tu affiches les deux en même temps par une boucle while habituelle et la boucle for de l'exemple ci dessus
majdoulin
Messages postés
106
Date d'inscription
lundi 16 juillet 2007
Statut
Membre
Dernière intervention
31 mai 2008
24 juil. 2007 à 13:41
24 juil. 2007 à 13:41
Merci alain bcp ,ce code m'aidera surement a avoir une idee ,mais ce dont j'ai besoin exactement c faire la connexion de 2 bases de donnes en mem temp (acces et aussi mysql ) avec le php , voila j'ai trouve un code oul 'on explique comemnt conecter php et acces mais c le cas d'une seule base (on n'y prends pa en consideration mysql aussi).
Connexion à une base de données Access :
<?
$mon_dsn="Un_dsn"; // identifiant du dsn
$user="kelkun"; // le login ici
$pwd=""; // et le mot de passe
$cnx = odbc_connect( $mon_dsn , $user, $pwd );
if( ! $cnx ) echo "Impossible de se connecter à la base de données";
?>
Exécution d'une requête(cas d'une insertion)
<?
$query = "insert into TProduits(NumPro,libPro,Prix,Qte)"; // champs de la table
$query .= "VALUES ('$UnMumero','$UnLibelle','$UnPrix','$UneQuantite') "; // les valeurs à insérer
$result = odbc_do ($cnx,$query);
?>
// L'idéal serait d'écrire une fonction qui génère automatiquement le numéro de produit
Listing des champs d'une table
<?
$query = "select * FROM UneTable "; //la requête
$UnJeu= odbc_exec( $cnx,$query ); // Jeu d'enregistrements
if ($result = odbc_do($cnx, $query)){
for ($i=1;$i<odbc_num_fields( $UnJeu )+1;$i++) //Parcours des champs et récupération ...
{
echo odbc_field_name($UnJeu, $i)." - "; // du nom du champ
echo odbc_field_len($UnJeu, $i)." - "; // de sa longueur
echo odbc_field_type($UnJeu, $i)."<br>"; // de son type
}
?>
merci
Connexion à une base de données Access :
<?
$mon_dsn="Un_dsn"; // identifiant du dsn
$user="kelkun"; // le login ici
$pwd=""; // et le mot de passe
$cnx = odbc_connect( $mon_dsn , $user, $pwd );
if( ! $cnx ) echo "Impossible de se connecter à la base de données";
?>
Exécution d'une requête(cas d'une insertion)
<?
$query = "insert into TProduits(NumPro,libPro,Prix,Qte)"; // champs de la table
$query .= "VALUES ('$UnMumero','$UnLibelle','$UnPrix','$UneQuantite') "; // les valeurs à insérer
$result = odbc_do ($cnx,$query);
?>
// L'idéal serait d'écrire une fonction qui génère automatiquement le numéro de produit
Listing des champs d'une table
<?
$query = "select * FROM UneTable "; //la requête
$UnJeu= odbc_exec( $cnx,$query ); // Jeu d'enregistrements
if ($result = odbc_do($cnx, $query)){
for ($i=1;$i<odbc_num_fields( $UnJeu )+1;$i++) //Parcours des champs et récupération ...
{
echo odbc_field_name($UnJeu, $i)." - "; // du nom du champ
echo odbc_field_len($UnJeu, $i)." - "; // de sa longueur
echo odbc_field_type($UnJeu, $i)."<br>"; // de son type
}
?>
merci
majdoulin
Messages postés
106
Date d'inscription
lundi 16 juillet 2007
Statut
Membre
Dernière intervention
31 mai 2008
24 juil. 2007 à 17:15
24 juil. 2007 à 17:15
Bonjour
D'accord merci Alain je vais esseyer ce code et je te repondrai
D'accord merci Alain je vais esseyer ce code et je te repondrai