Parcours d'un fichier Excel

Parcours d'un fichier Excel - PHP - Programmation

Marsh Posté le 13-08-2004 à 14:57:29    

Bonjour,  
 
Je cherche à parcourir un fichier en php, pour les insérer pour une base de données mysql. (pour faire des pages dynamiques à partir de la base aprés). Et j'ai commencé par chercher sur le net, et les seuls librairies que j'ai trouvé permettent de générer des fichiers excels avec php, donc dans ce sens ca m'interresse pas trop.  
 
Je me demande si cela est possible (en parcourant directement le fichier xls ca ne peut pas marcher car c'est du binaire)
 
Et sinon, il y a la solution d'utiliser des objets COM de microsoft (mon serveur est sur windows) pour interragir avec Excel. Mais je ne l'ai jamais utilisé COM, et je comprend pas trop comment ca marche.  
 
 
Voila, donc pour résumer je veux récupérer des données d'un fichier Excel. Can you help please  :ange:  
 
 


---------------
http://www.lolos.fr/
Reply

Marsh Posté le 13-08-2004 à 14:57:29   

Reply

Marsh Posté le 13-08-2004 à 15:05:03    

Dans Excel : Enregistrer Sous \ Type de fichier : CSV
 
Regarde ce que ca te donne, tu devrais avoir moins de mal  ;)

Reply

Marsh Posté le 13-08-2004 à 15:15:28    

Ouai, je connais cette solution, c'est évident que ca serait plus pratique de passer par ca.  
 
Mais la j'aimerai le faire sans que l'utilisateur doit enregistrer son fichier à chaque fois. (je bosse pour faire un intranet, y'a pas mal de fichiers à gérer et les gens sont handicapés :-()
 
C'est pour ca que je cherchais une solution PHP ONLY :)
 
Mais merci qd meme


---------------
http://www.lolos.fr/
Reply

Marsh Posté le 13-08-2004 à 15:27:45    

Arf, PHP ONLY, je vois pas comment faire dans ce cas...  :(  
 
Par contre, une macro dans excel qui enregistre le ficher au bon format, avec éventuellement l'ajout d'un bouton dans la barre de menu pour appeler cette macro, ca c'est trés faisable...
 
Un gros bouton PUBLIER, de 10 cm sur 5, c'est pas User Handicapés Friendly ca ? :D  :D

Reply

Marsh Posté le 13-08-2004 à 15:32:17    

La lecture c un peut comme l'écriture fo seulement faire open au début...
mais les manip pour accéder aux données sont les mêmes.
 
*************************************************************************
$excel = new COM("Excel.application" ); // ouverture connexion à Excel
 
$classeur = $excel->Workbooks->Open($nom_fichier);
// Nom du fichier à ouvrir : chemin absolu  
 
// je selectionne la feuille à lire (la numérotation des feuilles commence à 1
$feuille = $classeur->Worsheets($no_feuille);
 
// pour lire une cellule  ex : A1 ...
 
// je la selectionne :
$cellule = $feuille->Range("A1" );
 
// j'affiche son contenu :
echo $cellule->value;
 
// je ferme le document  
 
// si Excel fait la tête car on n' a pas sauvegardé  
// $classeur->save();  
 
$classeur->close();
 
// je ferme excel
$excel->Workbooks->close();
$excel->Quit();
 
// et on fait des unset de toutes les variables qu'on a utilsé
************************************************************************
 
sinon ya de bons tuto sur developpez.com

Reply

Marsh Posté le 13-08-2004 à 16:08:41    

J'y avais pensé aussi, d'ailleurs j'ai crée une macro.  
Je me suis dit que c'est la solution "AU CAS OU" je trouve rien d'autres car les gens ici sont vraiment trés trés handicapés (et pourtant je suis dans un grand centre info avec des gars supposés compétent) :)
 
L'idée du gros bouton est bonne aussi, j'aime bien ton concept de User Handicapés Friendly:)
Mais en fait je cherchais plus à faire un script avec le module COM comme knemo.  
D'ailleurs merci à vous 2 pour l'aide.  
 
knemo je teste un peu ca, pour voir si j'arrive bien à faire ce que je veux avec. Je-repasse tout à l'heure quand j'ai testé un ptit bout de script.  :hello:  
 

-Farenheit- a écrit :

Arf, PHP ONLY, je vois pas comment faire dans ce cas...  :(  
 
Par contre, une macro dans excel qui enregistre le ficher au bon format, avec éventuellement l'ajout d'un bouton dans la barre de menu pour appeler cette macro, ca c'est trés faisable...
 
Un gros bouton PUBLIER, de 10 cm sur 5, c'est pas User Handicapés Friendly ca ? :D  :D


---------------
http://www.lolos.fr/
Reply

Marsh Posté le 14-08-2004 à 12:44:44    

Salut,  
 
J'ai pu testé ton code et ca marche extraordinairement. C'est magique comme tu peux accéder à des fichiers excel avec un objet COM.  
Terrible knemo, je te remercis pour m'avoir expliquer comment ca marchait (au moins me lancer dans le bain avec ton petit bout de code)
 
En fait, le seul truc embétant, c'est qu'apparament il n'y a pas de docs pour l'utilisation des objets COM avec excel, j'ai rien trouvé. J'ai fais un tour sur developpez.com, et j'ai fais comme il disais : de faire des macros, et aprés regarder le code de ces macros pour récupérer les fonctions utilisées...  
La seule chose que j'ai pas réussi à faire, c'est d'avoir le nombre de cellules d'une ligne ou d'une colonne, mais c'est un truc que je sais pas faire sous Excel à la base :-D
 
Sinon, le module COM de php fonctionne qu'avec les softs de Microsoft (Excel, Word, ... ?) car j'ai l'impression que ca sont les seuls softs à avoir ce module implémenté (j'trouve pas d'exemples avec d'autres softs)
 
 
Bref je le redis c'est génial :)
Merci beaucoup pour l'aide, maintenant je passes pour le dieu du php au boulot grace à toi ;-)
 
Sinon une ptite rectification bidon, mais si jamais qq1 reprend le code :  

Code :
  1. // je selectionne la feuille à lire (la numérotation des feuilles commence à 1
  2. $feuille = $classeur->Worksheets($no_feuille);


---------------
http://www.lolos.fr/
Reply

Marsh Posté le 14-08-2004 à 14:21:40    

Wahoooooooo!!!!
 
pour une fois que je rends service !!!!!!
 
Tu me diras moi non plus j'ai pas réussi à savoir le nombre de
feuilles d'un document (en fait c pas tout a fait
le meme probleme mais c dans le genre).
 
Au sujet de la doc : non effectivement c un peu la merde,
fo que t'y aille à la barbare....!!!
 
Pour les autres soft : ben j'ai essayé avec crystal reports
mais bon ça se résumait à ouvrir et enregistrer un document
vierge (cro bien)... et comme j'ai bloqué à fond la dessus ben
je suis passé à excel.
Par contre je m'y connais pas trop en COM
(juste Excel à l'aide des tutos) donc je pourrais pas trop t'en
parler.
 
Justement, comme tu commences avec EXCEL/COM :
 
pourrais tu me rendre un service :
peux tu essayer de modifier par PHP la mise en forme  
de ton document Excel pour voir.
Genre : mettre en "ajusté sur une page" une des feuilles de
ton classeur . le code c'est :
 
$ps = $feuille->PageSetup;
$ps->Zoom = false;
$ps->FitToPagesWide = 1;
$ps->FitToPagesTall = 1;
 
  A mon boulot ce code plante : "Propriété non reconnue"

Reply

Marsh Posté le 14-08-2004 à 14:25:13    

suite du message ...(désolé)
 
 
alors que sur 2 postes de mon humble chez moi ça fonctionne.
 
(d'ailleurs à ce sujet j'ai laissé un topic sur le forum
auquel personne n'a répondu :??: )
 
Donc si tu pouvais essayé à titre de sondage ce serait sympathique!!
(et indiquer : système d'exploitation et version Excel version Office)
 
Merci d'avance et bon WE  :D !!!

Reply

Marsh Posté le 16-08-2004 à 10:50:29    

Je reviens à la charge, désolé mais le week-end je suis pas au boulot alors le PHP c'est forbiden à la maison ;-)
 
sinon pour la doc d'excel et du module COM, je crois que j'ai dégotté quelque chose, je te tient au courant.  
Et pour ton bout de code, je teste ce matin, la je dois finir un script je suis taquais :)
Mais peut tu me mettre ton code entier, avec l'ouverture et l'enregistrement de ton fichier xls car j'ai un peu la flemme de savoir quelle fonction on utilise avec excel :)
 
à toute


Message édité par roland77 le 16-08-2004 à 10:52:49

---------------
http://www.lolos.fr/
Reply

Marsh Posté le 16-08-2004 à 10:50:29   

Reply

Marsh Posté le 16-08-2004 à 11:16:35    

pour excel, j'étais tombé là-dessus y'a quelques mois, ça peut peut-être aider...
 
 
http://www.ozgrid.com/


---------------
London Box Office: Comédie Musicale Londres
Reply

Marsh Posté le 16-08-2004 à 13:16:12    

Voici le script ya plus qu'à remplacer le $nom_fichier_absolu_a_creer par un vrai nom de fichier à créer
 
<?
// *********************************
//CREATION FICHIER EXCEL
// **********************************
include("./../admin/ADMIN_config.php" );
 
$excel = new COM("Excel.application" ); //Instanciation de l'objet COM
 
$excel->sheetsinnewworkbook = 2;  // 2 feuilles dans mon classeur
 
$excel->Workbooks->Add(); //Ajout d'un classeur
 
$book = $excel->Workbooks(1); //$book contient le classeur actif
 
$sheet = $book->Worksheets(1); // j'écris dans la feuille 1
 
$sheet->Name = "PAYSAGE"; // nom de la page
 
$cell = $sheet->Range('A1');
$cell->value = "cette page doit s'imprimer en paysage";
 
 
$ps = $sheet->PageSetup;  
$ps->Zoom = false;  
$ps->FitToPagesWide = 1;  
$ps->FitToPagesTall = 1;  
 
 
$sheet = $book->Worksheets(2); // j'écris dans la feuille 2
$sheet->Name = "autre"; // nom de la page
$cell = $sheet->Range('A1');
$cell->value = "cette page doit s'imprimer en portrait";
 
$book->saveas($nom_fichier_absolu_a_creer);//Enregistrement du document
 
 
 
$excel->Workbooks->Close();//Fermeture du classeur
 
$excel->Quit();//On quitte Excel
 
unset($sheet);//Libération de $sheet
unset($book);//Libération de $book
unset($excel);//Libération de l'objet $excel
 
?>
 
Merci !!!
 
Sinon j'ai pas encore regarder le site ozgrid ... je vais y aller


Message édité par knemo le 16-08-2004 à 13:17:44
Reply

Marsh Posté le 16-08-2004 à 14:13:48    

Ca y est j'ai pu testé ton code.  
 
Cela a l'air de fonctionner à moitié, je m'explique.  
 
J'ai crée un fichier test.xls, j'ai mis son chemin absolu dans ton code. Quand j'execute il me demande si je veux enregistrer les modifications du fichier dans classeur1.xls.  
 
J'enregistre, et dans classeur1.xls il a 2 feuilles "Paysage" et "autres". Et ce fichier-la correspond bien avec ton code.  
 
 
Voila, ca t'a aidé :) ?


Message édité par roland77 le 16-08-2004 à 14:17:36

---------------
http://www.lolos.fr/
Reply

Marsh Posté le 16-08-2004 à 14:19:05    

zut ... chavais bien que j'avais oublié
le plus important :
 
après fo vérifier la mise en page correspondante
(aperçu avant impression)
 
la première page doit $etre en paysage et l'autre en portrait :
 
à noter, php a pas râlé : c une bonne nouvelle ...
(ps : c quoi ton système d'exploitation et version Office/Excel)
 
Merci !

Reply

Marsh Posté le 16-08-2004 à 14:26:12    

Heu  :sarcastic:, moi aussi j'ai oublié le plus important : lors du chargement de la page j'ai eu un ptit warning :)
 

Code :
  1. Warning: (null)(): Invoke() failed: Une exception s'est produite. Source: Microsoft Excel Description: Fichier inaccessible. Essayez l'une des opérations suivantes : • Vérifiez que le dossier spécifié existe. • Vérifiez que le dossier dans lequel se trouve le fichier n'est pas en lecture seule. • Vérifiez que le nom du fichier ne comporte les caractères suivants: | < > ? [ ] : ni * • Vérifiez que le nom du fichier ou du chemin ne dépasse pas 218 caractères. in d:\lot1\home\test5.php on line 36


 
J'avais complétement zappé ca.  
Au niveau de l'"apercu avant impression", les 2 s'affichent en portrait.  
 
Désolé si je t'ai filé une fausse joie :-)
 
Heu, j'ai win XP avec Excel 2000 installé


---------------
http://www.lolos.fr/
Reply

Marsh Posté le 16-08-2004 à 14:32:48    


et si tu mets en commentaire la partie mise en page (là où ya $ps)
ça dit quoi (parcequ'en fait ton message d'erreur est bizarre)
 
<?  
// *********************************  
//CREATION FICHIER EXCEL  
// **********************************  
include("./../admin/ADMIN_config.php" );  
 
$excel = new COM("Excel.application" ); //Instanciation de l'objet COM  
 
$excel->sheetsinnewworkbook = 2;  // 2 feuilles dans mon classeur  
 
$excel->Workbooks->Add(); //Ajout d'un classeur  
 
$book = $excel->Workbooks(1); //$book contient le classeur actif  
 
$sheet = $book->Worksheets(1); // j'écris dans la feuille 1  
 
$sheet->Name = "PAYSAGE"; // nom de la page  
 
$cell = $sheet->Range('A1');  
$cell->value = "cette page doit s'imprimer en paysage";  
 
 /*
$ps = $sheet->PageSetup;  
$ps->Zoom = false;  
$ps->FitToPagesWide = 1;  
$ps->FitToPagesTall = 1;  
 */
 
$sheet = $book->Worksheets(2); // j'écris dans la feuille 2  
$sheet->Name = "autre"; // nom de la page  
$cell = $sheet->Range('A1');  
$cell->value = "cette page doit s'imprimer en portrait";  
 
$book->saveas($nom_fichier_absolu_a_creer);//Enregistrement du document  
 
 
 
$excel->Workbooks->Close();//Fermeture du classeur  
 
$excel->Quit();//On quitte Excel  
 
unset($sheet);//Libération de $sheet  
unset($book);//Libération de $book  
unset($excel);//Libération de l'objet $excel  
 
?>  
 
sinon t'inquiète pas pour la fausse joie, aujourd'hui j'ai l'habitude,
j'arrête pas de tomber sur des trucs horribles...
 
PS : désolé d'utiliser ton serveur comme  poste de test distant
 
 

Reply

Marsh Posté le 16-08-2004 à 16:13:25    

re-
 
ca me donne exactement la même chose :  
 

Code :
  1. Warning: (null)(): Invoke() failed: Une exception s'est produite. Source: Microsoft Excel Description: Fichier inaccessible. Essayez l'une des opérations suivantes : • Vérifiez que le dossier spécifié existe. • Vérifiez que le dossier dans lequel se trouve le fichier n'est pas en lecture seule. • Vérifiez que le nom du fichier ne comporte les caractères suivants: | < > ? [ ] : ni * • Vérifiez que le nom du fichier ou du chemin ne dépasse pas 218 caractères. in d:\lot1\home\test5.php on line 34


 
J'ai l'impression que c'est plutot l'enregistrement ou l'ouverture du fichier qui pose problémes  
 
 
Y'a pas de probs, moi aussi chuis content si je peux t'aider :)


---------------
http://www.lolos.fr/
Reply

Marsh Posté le 16-08-2004 à 16:48:43    

Question : est ce que le nom de fichier que tu mets existe??
Parcequ'en fait j'avais oublier de mettre un condition d'existence.
MAINTENANT voici ce que fait le script :
Là on crée un fichier (dont on donne le nom absolu).
Avant d'enregistrer ce nouveau fichier excel, on vérifie son
existence, s'il existe , on l'éfface(unlink), puis
on enregistre notre fichier excel.
 
 
[ça c'est le dernier essai, après je te laisse tranquille...
en fait c pour élucider le problème du comment du pourquoi le
script il marche pas chez toi même sans les lignes de
mise en page ... ]  :??:  
 
[De toute façon j'ai une solution de rechange pour la mise en page ...
Pas très propre mais qui marche ... mais c pour savoir]
 
merchi!!
 
<?
// **********************
// CREATION FICHIER EXCEL
// **********************
 
$nom_fichier = "c:\\repertoire\\nom_fichier.xls";
 
$excel = new COM("Excel.application" ); //Instanciation de l'objet COM
 
$excel->sheetsinnewworkbook = 2;  // 2 feuilles dans mon classeur
 
$excel->Workbooks->Add(); //Ajout d'un classeur
 
$book = $excel->Workbooks(1); //$book contient le classeur actif
 
$sheet = $book->Worksheets(1); // j'écris dans la feuille 1
 
$sheet->Name = "PAYSAGE"; // nom de la page
 
$cell = $sheet->Range('A1');
$cell->value = "cette page doit s'imprimer en paysage";
 
/*
$ps = $sheet->PageSetup;  
$ps->Zoom = false;  
$ps->FitToPagesWide = 1;  
$ps->FitToPagesTall = 1;  
*/
 
$sheet = $book->Worksheets(2); // j'écris dans la feuille 2
$sheet->Name = "autre"; // nom de la page
$cell = $sheet->Range('A1');
$cell->value = "cette page doit s'imprimer en portrait";
if(file_exists($nom_fichier))
{
 unlink($nom_fichier);
}
$book->saveas($nom_fichier);//Enregistrement du document
 
$excel->Workbooks->Close();//Fermeture du classeur
 
$excel->Quit();//On quitte Excel
 
unset($sheet);//Libération de $sheet
unset($book);//Libération de $book
unset($excel);//Libération de l'objet $excel
 
?>
FINI!

Reply

Marsh Posté le 16-08-2004 à 17:08:51    

DE RETOUR :-)
 
En fait, tt à l'heure le prob était de mon coté :)
comme nom de fichier j'avais mis "C:\Bureau\toto.xls" comme nom de fichier au lieu de "C:\\Bureau\\toto.xls" ce qui est plus logique (erreur de newbie :D)  
 
Bref, maintenant l'enregistrement de ton fichier fonctionne niquel, il n'y a plus d'erreur ni de warning lors du chargement.  
 
Par contre j'ai décommenté la partie sur l'affichage Portrait/paysage, et la dessus il n'y a pas de diffs dans le fichier Excel. Tout est en portrait comme avant.
 
 
Voila, ton script marche presque ;-)


Message édité par roland77 le 17-08-2004 à 09:31:33

---------------
http://www.lolos.fr/
Reply

Marsh Posté le 16-08-2004 à 20:55:11    

Oh ..... le teuteu neuneu!!!!!!!
 
Oh la honte...  :o  tu sais quoi ???
 
En fait dans la portion de code, c'est pas la mise en page paysage que  
j'ai mis, mais l'ajustement de la feuille sur une page d'impression...
et comme à mon stage ça marche pas j'ai pas fait attention...
(et donc c le comment du pourquoi t'as pas pu le voir en visu)
 
Oups..... désolé....
Mais bon, si PHP t'as rien dit c'est pas mal... ça veut dire
qu'il prend en compte les propriétés (en fait l'ajustement
marchait pas non plus)
 
donc pour que ça fasse vraiment une impression en paysage après le
bloc $ps... (que tu peux laisser)
fo mettre (STP) :
$ps->Orientation = 2; // 2 = xlLandscape
 
Mais bon t'embête plus avec...
là de toute façon c'est un problème de config du serveur...
parceque ça marche sur 2 postes de mon chez moi,  
et dans plein d'autres exemples) Par contre je l'ai vu  
de mes yeux à moi marcher qu'avec un SE Win XP
(et apperemment toi aussi t'es en XP)
 
 
Mais juste pour donner des idées aux personnes qui ont des soucis  
avec certaines propriétés voici mon bidouillage pour passer
à trav :
j'utilise un modèle préformaté (avec la mise en page déjà
configurée : marges, orientation etc ....)
et lorsque je veux générer un fichier, je fais une copie
et j'écris direcetemnt sur la copie : l'avantage : comme
ya déjà une partie tout faite, c plus rapide et ya moins de code à écrire.
Bon c pas un truc extraordinaire.... mais en dernier recours  
fo bien sortir quelquechose.
 
Donc voilà ... Merci à Rolland pour avoir
consacré du temps à tester des tas de fois mes bouts de  
code erroné... sniff.
 
Bonne soirée tout le monde!!!! :hello:  
 

Reply

Marsh Posté le 18-08-2004 à 11:29:50    

en fait j'ai rectifié mon post, j'avais fais ca comme erreur :  
j'avais mis "C:\Bureau\toto.xls" comme nom de fichier au lieu de "C:\\Bureau\\toto.xls"
 
Ca fais newbie quand même mais bon :)
sinon, j'pense que c'est la meilleure idée d'ouvrir un fichier déja préformaté, ca coute moins cher en code comme tu dis :)
 
Y'a pas de probs, j'ai besoin d'aider mais si je peux aider aussi chuis la :)
D'ailleurs si t'as un bout de code à faire tester, n'hésite pas. Surtout que tu m'as tellement aider pour la partie sur COM, maintenant j'ai l'impression d'avoir appris qqch de plus consistant dans mon stage;)
 
 
Astalavista !


---------------
http://www.lolos.fr/
Reply

Marsh Posté le 19-01-2009 à 10:13:33    

bjr,
le code de lecture marche bien merci mais j'aimerai lire tous les lignes et colonnes du feuille excel sans savoir les données.est-ce possible?merci de me donner le code

Reply

Marsh Posté le 19-01-2009 à 13:07:46    

Petits rappels sur COM : ça peut paraître évident, mais le serveur de production doit être sous windows et avoir Excel d'installé. Et, a moins que ça n'ait été corrigé depuis, l'implémentation de COM dans PHP souffre d'un pb de désallocation de mémoire : quand on demande la fermeture d'Excel puis la libération mémoire, le processus Excel.exe reste en mémoire du serveur... Donc, dans un environnement de prod, COM n'est pas conseillé. C'est bien pour faire de l'import de données ponctuellement et avant la mise en prod ;) Pour avoir importé plusieurs 100ène de fichiers Excel dans une BD Mysql, j'en sais qq chose. Je devais le faire par lots de qq fichiers, sinon, la RAM était saturée d'Excel.exe :(...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed