Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CRÉATION D'UN DOCUMENT WORD SANS WORD SUR LE SERVEUR


Information sur la source

Catégorie :Astuces Niveau : Expert Date de création : 24/09/2003 Vu : 29 699

Note :
9 / 10 - par 9 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (42)
Ajouter un commentaire et/ou une note

Description

On peut au besoin générer un document word sur un serveur en appelant le composant correspondant mais avec quelques utilisateurs on monte très vite en charge. De plus, tout doit être configuré côté serveur et on peut remarquer dans les forums que c'est pas si simple à mettre en oeuvre.

Pour palier à ces problèmes, un langage universel dans le mode texte, le RTF, nous permet de générer des documents Word ou RTF sans aucun composant.
Ci-dessous un bout de code afin de créer un simple document Word avec les infos fichier, les entêtes et pieds de page ainsi qu'un simple texte avec un tableau.
 

Source

  • Dim fso, MyFile,sRTF
  • 'Creation du fichier pour le RTF
  • Set fso = CreateObject("Scripting.FileSystemObject")
  • Set MyFile = fso.CreateTextFile(Server.MapPath("document.doc"), True)
  • ' Ecriture RTF : définition des styles
  • MyFile.WriteLine("{\rtf1\ansi\deff0")
  • sRTF = "{\fonttbl" &_
  • "{\f0\fnil\fprq2\fcharset0\fs20 Arial;}" &_
  • "}"
  • MyFile.WriteLine(sRTF)
  • ' Infos Fichier
  • MyFile.WriteLine( "{\info" & _
  • "{\title Votre Titre }" & _
  • "{\subject Mon premier document}" & _
  • "{\author Zeb13}" & _
  • "{\operator RD medias}" & _
  • "}")
  • ' Entêtes & Pieds de Page
  • MyFile.WriteLine( "{\header\pard\qc " &_
  • "{\fs30 ::: Zeb13 - RD medias :::\par} ") & _
  • "}"
  • MyFile.WriteLine( "{\footer\pard\qc\brdrt\brdrs\brdrw10\brsp100" & _
  • "\fs18 Page " & _
  • "{\field{\*\fldinst PAGE}{\fldrslt 1}} sur " & _
  • "{\field{\*\fldinst NUMPAGES}{\fldrslt 1}} \par}")
  • ' Création du document ========================
  • ' le tableau
  • sRTF = "\par {"
  • sRTF = sRTF & "\trowd\cellx9000\pard\intbl \cell{\row}"
  • sRTF = sRTF & "\trowd\clbrdrb\brdrs\cellx9000\pard\intbl\b > Un titre dans un tableau \b0\cell{\row}"
  • sRTF = sRTF &"\trowd\cellx9000\pard\intbl "
  • sRTF = sRTF &"\bullet\~ Nom Prénom (par exemple) \par\plain\ql "
  • sRTF = sRTF &" \cell{\row}"
  • sRTF = sRTF &"}"
  • ' le texte
  • sRTF = sRTF & "\par {"
  • sRTF = sRTF &"Un simple texte dans votre document. \par"
  • sRTF = sRTF &"}"
  • sRTF = sRTF &"\pagebb"
  • MyFile.WriteLine(sRTF)
  • MyFile.WriteLine("}")
  • ' Astuce pour lancer en auto le document créé, remplacez adressedevotresite
  • Response.Write "<META HTTP-EQUIV=""REFRESH"" Content=""0;URL=adressedevotresite/document.doc"">"
Dim fso, MyFile,sRTF

'Creation du fichier pour le RTF
Set fso = CreateObject("Scripting.FileSystemObject")
Set MyFile = fso.CreateTextFile(Server.MapPath("document.doc"), True)

' Ecriture RTF : définition des styles
MyFile.WriteLine("{\rtf1\ansi\deff0")
sRTF =	"{\fonttbl" &_
	"{\f0\fnil\fprq2\fcharset0\fs20 Arial;}" &_
	"}"
MyFile.WriteLine(sRTF)

' Infos Fichier
MyFile.WriteLine(	"{\info" & _
		"{\title Votre Titre }" & _
		"{\subject Mon premier document}" & _
		"{\author Zeb13}" & _
		"{\operator RD medias}" & _
		"}")

' Entêtes & Pieds de Page
MyFile.WriteLine(	"{\header\pard\qc " &_
		"{\fs30 ::: Zeb13 - RD medias :::\par} ") & _
		"}"
MyFile.WriteLine(	"{\footer\pard\qc\brdrt\brdrs\brdrw10\brsp100" & _
                                "\fs18 Page " & _
                                "{\field{\*\fldinst PAGE}{\fldrslt 1}} sur " & _
                                "{\field{\*\fldinst NUMPAGES}{\fldrslt 1}} \par}")

' Création du document ========================
' le tableau
sRTF =	"\par {"
sRTF =	sRTF & "\trowd\cellx9000\pard\intbl  \cell{\row}"
sRTF =	sRTF & "\trowd\clbrdrb\brdrs\cellx9000\pard\intbl\b > Un titre dans un tableau \b0\cell{\row}"			
sRTF =	sRTF &"\trowd\cellx9000\pard\intbl "
sRTF =	sRTF &"\bullet\~ Nom Prénom (par exemple) \par\plain\ql "
sRTF =	sRTF &" \cell{\row}"
sRTF =	sRTF &"}"
' le texte
sRTF =	sRTF & "\par {"
sRTF =	sRTF &"Un simple texte dans votre document. \par"
sRTF =	sRTF &"}"

sRTF =	sRTF &"\pagebb"	
MyFile.WriteLine(sRTF)

MyFile.WriteLine("}")

' Astuce pour lancer en auto le document créé, remplacez adressedevotresite
Response.Write "<META HTTP-EQUIV=""REFRESH"" Content=""0;URL=adressedevotresite/document.doc"">"

Conclusion

Attention car la moindre ouverture ou fermeture de commande plante la page ASP sans aucune information. Aussi pour commencer faîtes juste un response.write de la variable SRTF afin de voir son contenu, avant de l'enregistrer.

Toute la doc sur le RTF by MSN :
http://msdn.microsoft.com/library/?url=/library/en-us/dnrtfspec/html/rtfspec.asp?frame=true?frame=true

Have a good luck ..., Zeb13.
 

Commentaires et avis

signaler à un administrateur
Commentaire de Focalizer le 24/09/2003 22:05:47

Très bonne idée ... ;)

signaler à un administrateur
Commentaire de Mercury le 26/09/2003 15:33:35

Pas mal, mais ça reste que du formet RTF, et non WORD.

signaler à un administrateur
Commentaire de zeb13 le 26/09/2003 15:51:44

Pourquoi tu dis ça ? tu vois la différence quand tu ouvres un .doc sous WORD entre un fichier RTF (enregistré en .doc) et un fichier Word normal ?
De plus, et ce que je trouve avantageux par ce moyen c'est que tu peux directement éditer dans un bloc notes un fichier word enregistré en RTF et toujours sans pénaliser un serveur et sans activeX ou Word installé.
Et pour faire tes gabarits, rien de plus simple, tu enregistres ton fichier Word en RTF, tu l'ouvres dans le bloc notes, copier coller, et tu as ton word à l'identique et modifiable à souhait. Par ce moyen j'en suis même rendu à faire de la fusion de documents à distance (ajout de données, de textes et d'images), chose impossible avec deux fichiers Word (à moins que tu aies l'astuce, je n'y suis jamais arrivé et aucune doc te laisse supposer que tu puisses le faire). Par contre on peut très bien fusionner un fichier word distant avec une base locale, sans utiliser word sur le serveur, mais celà s'arrette là.

signaler à un administrateur
Commentaire de grossetruie le 26/09/2003 16:15:41

Salut,

Très sympa ton script. Je ne savais pas que l'on pouvait accéder à la source d'un fichier de type word si je puis dire... (comme ya des puristes)
En échange je te file le code d'impression en paysage qui peut être utile, à placer au dessus du script d'en-tête.
Je ne sais pas si tous le code est  utile ou non en tout cas ça marche.

MyFile.writeline( "paperw15840paperh12240margl1440" &_  
"margr1440margt1797margb1797" &_
"widowctrlftnbjaenddochyphhotz425" &_
"
oxlattoyenexpshrtn
oultrlspcdntblnsbdb
ospaceforul" &_
"hyphcaps0horzdocdghspace120dgvspace120dghorigin1701" &_
"dgvorigin1984dghshow0dgvshow3jcompressviewkind4" &_
"viewscale100
olnhtadjtblfet0sectdlndscpsxnpsz1linex0" &_
"sectdefaultcl")

signaler à un administrateur
Commentaire de zeb13 le 26/09/2003 16:22:36

Je le note et m'en félicite... lol
Merci grossetruie,  je l'avais pas cette source en RTF. Comme quoi il suffit de jeter la pierre pour avoir des infos sur la question.

signaler à un administrateur
Commentaire de grossetruie le 26/09/2003 17:00:34

Pas de quoi :)

J'espère seulement que tu vas pas te galérer avec les slash, sinon tu regardes les correspondances dans un fichiers

@+

signaler à un administrateur
Commentaire de grossetruie le 26/09/2003 18:08:21

Ok y a plus simple . En plus ça formate le document en A4 en paysage
automatiquement soit 21 par 29,7. Remplacer tous les * par des anti-slach et le tour et joué. Placer le script juste après : "' Entêtes & Pieds de Page"

MyFile.writeline( "*paperw16840*paperh11907*margl1440*margr1440" &_
"*margt1797*margb1797*lndscpsxn")

ouf !

signaler à un administrateur
Commentaire de Warny le 29/09/2003 11:50:03

Salut,
J'avais eu cette idée pour génerer des impressions depuis un site web vers word. Mais le langage RTF n'est pas d'un pratique absolu. Il est très difficiliement lisible. Il y a aussi quelques limitations du genre impossibilité d'imbriquer plus de deux niveaux de tableaux.
Depuis word 2000, on peut mettre du html avec des balise spéciales pour office. Et nommer le fichier ".doc"
Mieux, quand on renvoie le document au client, on peut mettre dans les en-têtes http un content-type avec la commande :
Response.ContentType = "application/msword"
On peut avec le même système génerer des documents excel et des animations powerpoint (là il faut connaitre le vml)

signaler à un administrateur
Commentaire de zeb13 le 29/09/2003 16:06:07

Salut Warny,

En parlant de HTML dans word, j'ai essayé la manip, chose qui m'arrangerait bien, mais il ne veut pas m'interpréter les balises HTML. Si tu avais à tout hasard un monceau de codes pour nous mettre sur la voie se serait sympa à toi de nous le présenter.

signaler à un administrateur
Commentaire de Warny le 29/09/2003 16:23:06

Salut,
J'ai expérimenté les deux solution pour deux clients différents (RTF et HTML).
Dans le cas HTML j'ai été confronté au client Word97 qui gère très mal ce langage, par exemple une feuille de style en début de fichier ne sera pas gérée, mais ça passe quand même.
Quand on génère des pages web, le plus simple est de mettre la ligne Response.ContentType = "application/msword" en début de fichier. Déjà, le fichier sera ouvert par word côté client.
Pour optimiser l'ouverture, je t'invite à recopier les lignes que word met quand on sauve un document sous le modèle html (ça va du modèle de page aux styles exotiques) Les caractères spéciaux bénéficient de balises spéciales enfermées dans des commentaires du type &lt;!-- if [mso9] --&gt;&lt;!-- else --&gt;&lt;!-- end if --&gt;
Je ne suis pas vraiment allé plus loin parce que ça marchait comme ça.

PS: pour tout le monde pour afficher les \ il suffit de les doubler

signaler à un administrateur
Commentaire de grossetruie le 29/09/2003 18:03:28

Salut :)

Est-ce que tu as la fonction aprerçu web dans le menu affichage de word. Si oui tu peux toujours lancer l'aperçu web d'une page word et regarder par un clic droit la source qui est codée (qui est comme celle dont parlait warny.) Je sais c'est un peu simple mais ça peut peut-être t'aider.

signaler à un administrateur
Commentaire de grossetruie le 29/09/2003 18:12:21

Salut warny:)

Effectivement le Rtf n'est pas très lisible il faut des bons yeux, cependant on peut jongler. D'un côté tu fabriques ton gabarit sous word comme une feuille normale, puis tu l'enregistres en type rtf et tu reprends le code que tu intègres à ton asp ou php. Question tableau je n'ai pas été gêné. Par contre si vous connaissez un moyen pour mettre un doc rtf en mode partagé ?

signaler à un administrateur
Commentaire de Warny le 29/09/2003 18:30:55

re,
effectivement, c'est une solution que j'utilise, mais j'ai plutôt cette methode : j'écrit mon doc rtf et je met quelques balises asp dedans et je l'inclus à partir d'un asp "pur code"
exemples sur www.generationsroller.asso.fr le bulletin d'adhésion et le flyer parcours.
j'édite le fichier sous word en écrivant des balise &lt;%=%&gt; dedans
bien sur je rajoute quelques balises rtf par code, mais c'est déjà plus limité que le gros pavé généré par word.
Comme quoi, c'est pas les solutions qui manquent !
Pour les adeptes je vous conseille vivement les documents compilés qui vous permettent de mettre des images INCLUSES dans des fichiers html (sous word, sauver sous... choisissez l'option "page web à fichier unique" et visualisez le résultat sous notepad).

signaler à un administrateur
Commentaire de grossetruie le 29/09/2003 19:10:09

hé pas malé ton document:)

je suis en train de de faire un document comme celui-ci actuellement sauf que je vais faire appel à une base de données et reprendre les variables qui sont dedans pour les coller sur le .doc Les premiers tests sont plutôt concluant. Tout ça pour des questions de format d'impression avec le titre qui se répète sur chaque page etc... Je me demande des fois si on réinvente pas access tous les jours ? bien que l'asp ou le php offre une très grande souplesse comparé à ce dernier, du moment qu'on sait coder...

signaler à un administrateur
Commentaire de istarnos le 14/10/2003 14:59:26

Y a t'il la possibilité de remplacer des signets d'un documents word ?

Mon probleme n'ayant pas word sur le serveur , je veux l'ouvrir a partir d'un poste client ayant word.

Sur le serveur se trouve des ".doc" type dans lesquels je veux remplacer des signets à l'aide d'une BDD.

Et part la suite je voudrais imprimer le document.

Est ce possible ? et si oui comment ?

merci de votre aide

signaler à un administrateur
Commentaire de zeb13 le 14/10/2003 15:12:43

Bien sûr, c'est ce que j'utilise pour faire une fusion. Mais il faut que ton fichier soit en RTF et non en DOC ! car on peut faire une vraie fusion Word d'un fichier distant seulement avec une base en local si Word n'est pas sur le serveur (sauf si c'est une base SQL of course).

En gros tu ouvres ta BDD, et à la lecture du document tu fais un replace des signets par la valeur du champ correspondant.
Ex : texte = replace(texte,"{NOM}",rs("NOM")) et ainsi de suite pour tous les champs.

texte étant le contenu du document RTF que tu auras pris soin de lire à partir d'un File System Object, t'as plein d'exemples dans ce site qui en parle.

Si tu attends 3 semaines je posterai comment fusionner un document Word avec une base de données MS Access, car je suis en train de le développer pour un client.

signaler à un administrateur
Commentaire de zeb13 le 14/10/2003 15:18:14

ASTUCE pour la génération d'un RTF (surtout pou rl'intégration d'images) :

1. rédigez le document sous Word
2. enregistrez-le au format RTF
3. ouvrez ce même document enregistré sous WORD PAD
4. Ré enregistrez le
5. Ouvrez le sous bloc notes

De plusieurs centaines de lignes, vous passez à quelques lignes qui deviennent alors très simples à lire !

PS Pour Warny : j'ai essayé ta méthode, mais on ne peut pas inclure d'images, il veut obligatoirement créer un répertoire. Mais vraiment pas bête pour des documents textes.

signaler à un administrateur
Commentaire de istarnos le 14/10/2003 15:24:46

OK je te remerci, je vais regarder tout ca .

Par contre j'ai essayé ton script pour la création du document  ca marche nikel, mais j'ai pas compris pour la gestion de l'impression.

Y es tu arrivé ?

signaler à un administrateur
Commentaire de zeb13 le 14/10/2003 15:54:44

cherche un brin je l'ai lu dans aspfr.com ou asp-php.net y'a quelques mois, y'a une petite commande vb à écrire de quelques malheureuses lignes. Désolé je l'ai pas en bookmark et encore moins en tête.

signaler à un administrateur
Commentaire de istarnos le 15/10/2003 10:50:45

Je voulais savoir si a partir d'un document .rtf avec texte, image on pouvait parcourir ce meme document et en faire une copie complete avec texte et image ?

Si oui, y a t il quelque chose de particulier pour gerer les images ?

signaler à un administrateur
Commentaire de zeb13 le 15/10/2003 12:48:10

bien sûr celà fait appel aux file system object, tu trouveras un très bon tutorial dessus sur http://asp-php.net.

pour voir le rendu d'une image, utilise l'astuce que j'ai posté quelques commentaires au dessus. Une image en rtf commence par {pict avec tout plein de codes hexa à la suite.

signaler à un administrateur
Commentaire de istarnos le 20/10/2003 11:14:11

Comment faire pour integrer l'impression dans un document rtf qui existe deja et dans lequel j'ai effectué des remplacement de signet ?

Si quelqu'un a la solution merci

signaler à un administrateur
Commentaire de grossetruie le 20/10/2003 15:18:13

essaye ça :


par {*kmkstart nom du signet}repere dans le texte{*kmkend nom du signet}

par}}

signaler à un administrateur
Commentaire de grossetruie le 20/10/2003 15:20:13

remplace les * par des anti-slash et les deux carrés par la lette "b"

signaler à un administrateur
Commentaire de grossetruie le 20/10/2003 15:25:06

et fais précédé "par" par un anti-slash aussi,  le serveur interprete à sa sauce les caractère ici.

signaler à un administrateur
Commentaire de istarnos le 21/10/2003 15:42:46

Oui ok.
Par contre quand on a un document rtf avec des images, le document est hyper lourd !!
Quel est la solution pour l'alleger ?


ps zeb13 : je ne suis pas arrivé avec ton systeme , quand j'ouvre le rtf dans wordpad les tableaux et les images de mon rtf disparaissent.

merci pour votre aide

signaler à un administrateur
Commentaire de grossetruie le 23/10/2003 00:46:22

Ben, tout dépend combien pèse ton image... il faut que tu la compresses en gif ou en jpeg en basse def. De toute façon ton document n'invente rien :) surtout le rtf !

signaler à un administrateur
Commentaire de Yannick74 le 29/04/2004 09:29:32

Bien joué, c'est complet comme réponse avec toutes ces approches.

signaler à un administrateur
Commentaire de maxmach le 13/05/2004 10:06:58

Salut, je trouve ton script tout à fait intéressant, et je souhaiterai l'étendre pour une utilisation vers des PowerPoint...

Je souhaiterai pouvoir afficher en ASP les miniatures des diaporamas (slides) d'un PowerPoint dans une partie de ma page (ex dans la partie droite de ma page, dans un tableau de une ou deux colonnes, mettre les 8 premiers slides par exemple...)

Si tu vois comment procéder, et-ou connais les termes clés à utiliser pour l'ouverture, la lecture et l'affichage???

Merci d'avance

signaler à un administrateur
Commentaire de ourdani le 19/07/2004 13:34:16

bonjour,
j'ai vu que vous manipuler très bien le RTF, aussi je m'adresse à vous pour m'aider dans un problème d'extreme urgence : j'ai besoin d'un fonction à qui je passe du texte, la taille et le nom de police et le type d'alignement (surtout la justification) et qui me retourne une chaine de type RTF. Merci d'avance pour toute aide.

signaler à un administrateur
Commentaire de berserk le 05/08/2004 16:32:44

Bonjour,
Comment faire pour intégrer une image lorsqu'on génère le document à la volée.
car le nom de mon image est tiré d'une base access, mais il me fait remonté la valeur du champs en texte et nom l'image...

Merci d'avance..

signaler à un administrateur
Commentaire de zeb13 le 07/08/2004 18:21:07

Pour power Point :

Dans power point, tu peux générer un document HTML avec tout plein de XML, ça marche terrible. Un peu lourd à l'affichage mais ça a l'honnêté de marcher. tu te trouveras avec un fichier html de lancement et un rép avec tous les slides dedans.
Pour les miniatures, jamais essayé.

signaler à un administrateur
Commentaire de zeb13 le 07/08/2004 18:22:52

Bersek,

Aloha, cherche un convertisseur hexa d'image, ça doit bien exister quelque part. C'est ton seul moyen.

signaler à un administrateur
Commentaire de Yoyo2B le 12/04/2005 17:08:49

salut à tous. Cette source est bien mais les comment sont encore mieux !! &&, mais en fait je cherche une source permettant de faire ... le contraire :
G besoin de pouvoir lire et exploiter (convertir groso modo) un Rtf, ou doc en html...
Si vous avez des infos, des url, etc ....


Happy coding ...

signaler à un administrateur
Commentaire de Warny le 14/04/2005 08:36:18

Salut,
tu utilises Word sur ton serveur (c'est pas recommandé pour deux ronds, mais ça marche)
tu charges ton fichier, et tu le sauves en html.

signaler à un administrateur
Commentaire de markito le 07/09/2005 10:10:35

Salut, tout ca c'est très bien mais quand l'utilisateur ouvre son document il tombe un vieu message pourri de word pour choisir le format rtf ou encodé... plutôt pénible.

Ca n'a géné personne ici ???

signaler à un administrateur
Commentaire de grossetruie le 07/09/2005 20:49:31

non non, tout est nikel quand tu ouvres ton fichier. Aucun souci d'interprêteur.

signaler à un administrateur
Commentaire de grossetruie le 07/09/2005 20:58:16

Cela dit, l'extension fichier lorsqu'il est créé par le FSO peut avaoir l'extension .doc ce n'est pas gênant et ça marche très bien.

signaler à un administrateur
Commentaire de Warny le 12/09/2005 14:12:35

Il est bien sûr devenu possible avec word 2003 d'utiliser le WordML pour générer le document.

signaler à un administrateur
Commentaire de lmu le 19/08/2006 09:32:34

Hello, j'utilises cette technique deuis quelques temps, mais il me reste un problème de fond.

Le document rtf s'ouvre dans Internet explorer avec des pseudos fonction de word et non directement dans word.

Est-ce que quelqu'un sait comment ouvrire le document dans l'application word?

signaler à un administrateur
Commentaire de vbmoh le 19/09/2006 12:03:38

merci c'est c'est un très bon exemple

signaler à un administrateur
Commentaire de Billyprog le 21/05/2007 16:02:39

Bonjour,
je cherche à produire un "Créateur automatique de livres de partitions(tablook).
Pour celà j'ai divisé mon travail en trois tâches:
1)Créer un répertoire de partitions
2)générer un RTF
3)Créer un document Word

Je souhaite effectuer ce travail sous Visual Studio.Net 2005.
Je pense utiliser des classes CFile ou CStudio File et utiliser une boîte de dialogue comme interface.
Seulement, je ne suis pas habitué à l'utilisation de fichiers textes. Si vous avez des idées, conseils ou autres choses à me proposer je suis preneur.
Merci d'avance ;)

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,655 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.