ouvrir dans Excel un tableau html crée en PHP

ouvrir dans Excel un tableau html crée en PHP - PHP - Programmation

Marsh Posté le 20-02-2006 à 10:46:58    

Bonjour à tous.
J'ai quelques soucis qui m'ont valu de rester bloqué devant mon ordi tout le week-end.
 
Ce que je cherche à faire :
 - exporter une table MySQL vers un fichier Excel
 - le fichier Excel doit avoir une mise en page particulière (largeur, hauteur et couleur des colonnes, police et tailles des textes) donc pas de csv
 - certaines cellule auront plus de 1500 caracteres
 - la table comprend plus de 4000 enregistrements, donc gros fichier excel à la sortie
 
Ce que j'ai fait :
 - j'ai tenté d'utiliser php_writeexcel mais les fichiers créés par celui-ci ne peuvent dépasser 6.75Mo alors que les fichiers que je veux exporter tournent entre 7 et 10Mo. De plus, les cellules sont limitées à 255 caracteres, ce qui est bien trop peu
 - j'ai tenté d'écrire dans un fichier texte un tableau html, que je rends téléchargeable en le nommant *.xls : quand il n'y a que quelques centaines d'enregistrement, ça marche, le fichier obtenu s'ouvre dans excel, mais pour la totale, ça plante et les cellules sont toujours limitées mais à 1024 caracteres
 - j'ai tenté de générer en PHP un tableau html, en lui mettant le type mime de MS Excel : j'arrive à afficher toute ma table en Excel dans le navigateur (et meme plus, j'ai volontairement gonflé la table pour voir, ça passe avec plus de 5100 enregistrement), donc plus de probleme de taille de table. Pour la taille acceptée par une cellule, on est toujours à 1024 caractères, ce qui est insuffisant, mais en coupant ma chaine de caractere et en faisant une concaténation, j'ai résolu le probleme
 
Les problèmes qu'il me reste :
 - si je pouvais éviter la concaténation et mettre au moins 2500 caracteres dans une cellule, ce serait bien
 - les sauts de ligne ne passent pas, je sais que le saut de ligne dans excel est CAR(10), donc j'essaie de remplacer le \n de mysql par CAR(10), mais ça ne marche pas
J'espère avoir été assez clair.
Est-ce que quelqu'un aurait un truc pour m'aider à résoudre ces problemes ?
Il me semble qu'il existe un cgi pour exporter des excels de plus de 7Mo, mais je n'arrive pas à le trouver (ni la doc pour m'en servir)
Merci d'avance

Reply

Marsh Posté le 20-02-2006 à 10:46:58   

Reply

Marsh Posté le 20-02-2006 à 11:11:14    

Ben tu crées ton tableau HTML tres propres sans style css et avec la fonction header tu places le type mime de excel. "application/vnd.ms-excel" et tu verras que excel va interpreter le tableau.

Reply

Marsh Posté le 20-02-2006 à 11:11:53    

header('Content-type:application/vnd.ms-excel');

Reply

Marsh Posté le 20-02-2006 à 12:11:33    

Je me suis mal exprimé : j'ai fait exactement ce que tu as dit, le tableau est propre, sans css, sans fioritures. J'ai mis le type mime tel que tu me le dis.
Mais les sauts de ligne n'apparaissent pas et les cellules sont limités à 1024 caracteres. ils sont là mes problèmes...

Reply

Marsh Posté le 20-02-2006 à 13:31:01    

saut de ligne : /r /n ou <br> ?  car le r et n n'apparaitrons pas, le br oui.
- il me semble qu'il y a une class php qui permet de générer directement en  format xls.  
-Sinon il faut connaitre la synthaxe de excel qui n'est pas simple :/.
- Apparement il y a effectivement une limite de contenu de champ.

Reply

Marsh Posté le 20-02-2006 à 14:05:28    

Les \n et \r ne sont pas interpretés (ils sont invisibles) par excel.
Les <br> sont interpretés, mais ils créent une nouvelle ligne à chaque fois dans excel, en gros, pour un enregistrement de ma table mysql, si dans une cellule, y'a 5 saut de ligne, pour cette cellule, je me retrouve avec 5 lignes, mais par pour les autres, du coup, ça qui fout le bordel total dans le tableau. Y'a seulement CAR(10) qui marche, mais uniquement dans une formule. J'ai bien tenté de faire un CONCATENER("montexte";CAR(10);"suitedemontexte";...), mais la plupart du temps, ça ne marche pas, excel renvoit "Trop de parametres dans la formule".
Y'a bien une formule REMPLACER, mais elle se base sur la position et le nombre des caracteres à remplacer, (par exemple remplacer 5 caracteres à partir du 3eme), il me faudrait une fonction qui permette de remplacer un morceau de la chaine par un autre, par exemple dans "le petit chat boit du lait", remplacer "petit" par "grand", et ça, j'ai pas trouvé.

Reply

Marsh Posté le 20-02-2006 à 14:20:22    

La classe php qui permet de générer en xls, c'est pire, y'a pas de souci pour les sauts de ligne, par contre, pas moyen de mettre plus de 255 caracteres par cellule, et pas moyen de sortir un fichier de plus de 6,75Mo, il me manque au moins 2 ou 3 Mo....

Reply

Marsh Posté le 20-02-2006 à 14:22:38    

qu'est ce qu'il t'empeche de le faire via php le replace, tu traites le contenu des informations comme du texte brute apres c'est du coté client qui c'est interprété par rapport à ce que tu lui donnera.
Pour le br cela m'étonne qu'il le concidère comme une nouvelle ligne :/ a la place des \n et r bien souvent il faut inverser le sens pour qu'il y ait effet ou bien utilise cette fonction chr(10).chr(13)

Reply

Marsh Posté le 20-02-2006 à 14:46:26    

j'ai tenté de faire le replace en php, mais excel affiche CAR(10) en toute lettre au lieu du saut de ligne.
Si tu prends excel, et que tu tapes "une chaine de caractere" CAR(10) "une autre chaine de caratere" (équivalent au résultat que tu aurais si tu remplace directement en php), le saut de ligne n'est pas interpreté.
CAR(10) ou CAR(13) ne sont interpretés que comme des parametres dans une formule.
Merci pour toutes tes propositions, mais elles retracent à peu pres tout ce que j'ai tenté ce week end (je suis sur ce probleme depuis vendredi apres midi).
précision : dans excel en français, CHAR() est remplacé par CAR()
 
Pour le coup de la nouvelle ligne avec les br, si tu veux comprendre, crée un tableau en html, remplis les cellules avec du texte et des br, ajoute le type mime excel en header et regarde le résultat. Tu comprendras mon problème. Si en plus tu utilises la fonction CONCATENER d'excel sur 2 cellules avec des br, tu verras que ça fout totalement le bordel
ça commence à me gaver ce truc là, mais faut vraiment que je trouve une solution...
En tout cas, merci pour ton aide

Reply

Marsh Posté le 20-02-2006 à 15:20:55    

En faite c'est normal qu'il affiche CAR(10) au lieu de l'interpreter. Pour le br je viens de tester et effectivement c'est assez étonnant. j'ai tenté plusieurs solution mais c'est mon manque de connaissance en la matière me limite sérieusement. :/

Reply

Marsh Posté le 20-02-2006 à 15:20:55   

Reply

Marsh Posté le 20-02-2006 à 16:06:28    

Et encore un probleme detecté : quand on crée un tableau html en lui mettant un type mime de MS Excel (le tableau s'ouvre au format excel dans le navigateur), et qu'on concatène 2 cellules, le resultat s'affiche, mais impossible de faire un copier/collage spécial de la valeur si le texte total fait plus de 1024 caracteres. Pourtant, c'est possible dans une feuille Excel créée dans Excel.
Donc apparemment, dans tous les cas, il est impossible de mettre plus de 1024 caracteres dans une cellule d'un tableau excel créé en html... (houla, meme moi j'ai du mal à suivre...)

Reply

Marsh Posté le 20-02-2006 à 17:28:42    

En faite, en passant par du code HTML excel l'interprete visuellement mais le traitement du code source n'est pas pareille c'est pour cela qu'il aurait été préférable de l'écrire en code balise excel qui est simplement que du code html mais avec des particularités. regarde le code source d'un document généré  depuis excel il faut comprendre le truc

Reply

Marsh Posté le 21-02-2006 à 09:09:46    

J'ai eu la meme idée que toi, mais en ouvrant un excel dans le bloc note, on obtient du code indéchiffrable (excel est un format propriétaire non ?).
Y'a un moyen de chopper le code source d'un fichier excel ?
Sinon, j'ai découvert un truc : quand on fait un tableau html, et qu'on l'ouvre dans le navigateur avec le type mime d'excel, les cellules ne sont limitées à 1024 caracteres que pour le texte qui provient de PHP. Mais si on saisie du texte à la main dans une cellule vide, il n'y a plus de limite.
Il m'est aussi arrivé d'avoir des cellule qui proviennent de la base de donnée, dépassant 1024 caracteres, sans problème d'affichage ou de limite, mais c'est rare, et je n'ai pas compris le pourquoi du comment. Si ça se trouve, faut juste changer le type des caracteres ou variables insérés pour supprimer la limite. Quelqu'un aurait une info là dessus ?
 
Sinon, est-ce qu'excel est capable de lire un fichier texte distant (Excel sur poste local connecté à internet, fichier texte sur un serveur Web), et d'importer les données dans une table, en utilisant VBS et en formatant correctement le fichier texte (genre csv) ? Dans ce cas, je pourrais générer un fichier texte en php, et mettre le gabarit excel en téléchargement, qui saurait retrouver les données à distance, tout en conservant le format propriétaire d'excel. Quelqu'un peut me confirmer ou non la faisabilité ?

Reply

Marsh Posté le 21-02-2006 à 09:41:05    

Pour le deuxieme cas c'est largement possible. Si tu as une base reférencé dans ton odbc tu peux récupérer les informations direction dans excel. Pas besoin de language intermédiaire. Onglet Données
Regarde du coté XML si excel peut l'interpreter SQL => PHP => XML => Excel.
Mais bon j'en suis sur qu'il existe des class déjà écrite pour importer en format excel. Je suis sur l'avoir déjà vu.

Reply

Marsh Posté le 21-02-2006 à 11:10:39    

Je progresse dans mes recherches :
 - document vierge
 - je mets le type mime excel en header
 - je crée des variables en php, et je leur donne des chaines de plus de 2000 caractere en valeur
 - je crée un tableau html, et dans les différentes cellules, j'affiche soit directement les variables, soit je fais des concaténations.
 - je crée une boucle pour multiplier les lignes (5000 lignes) pour obtenir un gros fichier, équivalent à la taille de la table mysql que j'aimerai exporter
 - j'ouvre mon document dans le navigateur
 - j'obtiens un document sans limite, les textes dans les cellules peuvent faire allégrement 2000 voir plus de caracteres
Pourquoi quand je crée mes variables en php, elles s'affichent sans souci dans excel, alors que quand je récupère des données dans ma table mysql et que je cherche à les afficher, ces valeurs sont limitées à 1024 caractères ? Y'a un truc qui m'échappe là. Si je trouve la solution, me restera plus qu'à regler le probleme des sauts de ligne. Mais dans ce cas, les <br> feront l'affaire puisque pas besoin de concaténation...
Quelqu'un à une idée ?

Reply

Marsh Posté le 21-02-2006 à 11:21:01    

tes champs dans Mysql ne sont pas limité ? j'en suis sur que tu n'as pas toute la valeur dans le table. Controle le contenu via un script bateau.

Reply

Marsh Posté le 21-02-2006 à 11:55:37    

la table mysql, au départ, elle est prévue pour un affichage en php, y'a pas de probleme, ça fonctionne, tout apparait sans souci. Les champs sont des blob.
C'est simplement quand je visualise ma table avec le type mime excel qu'il y a des soucis.
Je viens de refaire mon fichier php contenant le tableau à afficher dans excel. J'ai programmer pour afficher juste une dizaine d'enregistrement. C'est fou, j'ai une seule colonne où certains champs font plus de 1024 caracteres. Parmi ces derniers, certains s'affichent correctement, d'autres sont coupé pile poil à 1024. Si j'arrive à en afficher certains, tous doivent pouvoir s'afficher correctement, non ? Pourtant c'est le meme code partout.
La colonne s'appelle "activites". Quand je récupère mes données de la table, je les affecte à une variable tableau "$activites[$compteur]", ou $compteur représente le numéro d'enregistrement.
Ensuite, je fais une boucle avec while, qui crée les lignes du tableau html :
<td width="150" height="150" align="left" valign="top"><font size="2" face="Arial, Helvetica, sans-serif"><?php print $activites[$compteur]  ?></font></td>
A la fin de chaque ligne, j'incrémente $compteur et la boucle passe à la ligne suivante. Donc il n'y a pas de différence de code d'une ligne à l'autre.
Normalement, toutes les cellules qui affichent $activites[$compteur] devraient avoir les memes caractéristiques. Et pourtant, parmi celles qui font plus de 1024 caracteres, certaines sont affichées correctement, d'autres sont coupées à 1024 pile poil, et excel renvoie un message du genre "cellule trop volumineuse". Et la coupure se fait en général au milieu d'un mot, c'est pas un problème de caractère spécial qui est mal interpreté...


Message édité par domri64 le 21-02-2006 à 11:56:17
Reply

Marsh Posté le 21-02-2006 à 12:00:40    

oui c'est tres bizarre cette affaire :/ et 1024 caractères ne fait pas peur pour une cellule excel. pour savoir si c'est un probleme de caractere mal interprété utilise la fonction htmlentities($str)

Reply

Marsh Posté le 21-02-2006 à 12:22:22    

J'ai trouvé un truc qui marche : pour toutes les colonnes qui sont succeptibles de recevoir plus de 1024 caracteres, j'entoure la variable par des "" :
<td>"<?php print $mavariable[$compteur] ?>"</td>
Du coup, plus de problème de cellule trop volumineuse. C'est un moindre mal...
Me reste plus qu'à regler le probleme des sauts de ligne. Je pense rester sur l'idée du br, vu qu'il n'y a plus de concaténation, ça ne devrait pas poser de probleme.

Reply

Marsh Posté le 21-02-2006 à 13:15:34    

Ha ok je sais pourquoi maintenant. Par défaut excel ne concidere pas qu'une cellule est de type texte. En effet, excel il est possible de définir le type de champs et cela agit sur le contenu et le traitement. Le type texte accepte plus de données.

Reply

Marsh Posté le 21-02-2006 à 13:32:49    

j'ai encore mieux comme explication, et surtout plus crétin....
Mon tableau était composé d'une ligne de titres, écrits en html, puis des lignes composées des variables tirées de ma base de donnée.
Je ne sais pas comment je me suis débrouillé, mais les titres commençaient presque tous pas des ", genre : "Activités du poste (sans fermer les " ).
J'ai supprimé ce " en trop avant chaque titre de la premiere ligne, du coup, tout marche nickel, sans se prendre la tête à entourer les chaines de caractères par des " par la suite. C'etait trop con pour que je le vois tout de suite.... Putain, 3 jours de perdus pour ça.
Si j'arrivais à trouver la solution pour faire des sauts de ligne sans utiliser les br, ce serait carrément génial.
Désolé pour le dérangement et merci pour ton soutiens. Même si j'avais déjà testé pratiquement tout ce que tu m'as dit, sans toi, je pense que j'aurai abandonné y'a longtemps.
 
Je suis presqu'au bout de ma galère. Si quelqu'un a une solution pour les sauts de ligne (récupérer une variable php contenant des sauts de ligne sous forme de \n et l'afficher dans une cellule excel tenant compte de ce \n)


Message édité par domri64 le 21-02-2006 à 13:33:38
Reply

Marsh Posté le 21-02-2006 à 15:46:22    

Ben c'est du propre :D
Maintenant que tu es en mode texte via les " regarde si le  

  • <br>  ou <br/>
  • \n
  • \r
  • \n\r
  • \r\n

passe.

Reply

Marsh Posté le 22-02-2006 à 07:56:10    

J'ai tout testé. Seul le br me fait des sauts de lignes, mais en créant des sous-cellules.
Je vais créer un nouveau poste pour voir si quelqu'un a une solution...
Merci encore pour ton aide

Reply

Marsh Posté le 22-02-2006 à 08:13:18    

de rien ;)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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