Suite à un post dans le forum, Guillaume m'a sympathiquement envoyé ce script qui permet de créer un document MSWord depuis ASP. Le contenu est ici extrait d'une base MSAccess servant à une gestion de contacts/clients.
En lisant le script on pourra retenir les principes généraux :
Premier principe : avoir Word sur le serveur, mais ça, vous l'aviez sans doute deviné :-)) Si ce n'est pas le cas vous aurez une erreur sur la méthode CreateObject
Deuxième principe : pour pouvoir accéder à WORD en ASP, word doit avoir été utilisé sur le serveur par le compte utilisé lors de l'accès web. Dans word, il faut ouvrir l'éditeur VBA, puis refermer. Ca na l'air de rien, mais ça permet d'écrire un fichier par défaut, genre normal.dot, impossible à créer à distance. Si ce fichier est absent, vous aurez une erreur indiquant : "Impossible d'ouvrir la macro de stockage". Il peut être utilse de rebooter.
Création de l'objet Word Set WordApp = CreateObject("word.application")
Mise en mode invisible WordApp.Application.Visible = false
Création du document Set WordDoc = WordApp.Documents.Add()
Pour chaque paragraphe :
<% ' Ajout du paragraphe Set newpar = WordDoc.Paragraphs.Add set newrange = newpar.range ' Définition du style du paragraphe with newrange .Bold = False .Italic = false .Font.Name = "Verdana" .Font.size = "12" .ParagraphFormat.Alignment = 1 ' ou utilisation d'un style interne : .Style = "Titre 1" end with ' Insertion du contenu du paragraphe newrange.insertBefore("Mon texte dans ce paragraphe" & vbcrlf) ' ou d'un saut de page : newrange.insertBreak %>
Enregistrement du document WordDoc.SaveAs server.mapPath("doc/temp.doc")
Déconnexion de Word WordDoc.Close : WordApp.Quit
Le script complet :
access2word.asp
<% ' Export Word pour Access - Script de Guillaume
' Connexion à la base de données. ' Pensez à remplacer db_path par votre chemin + fichier
set db = Server.CreateObject("ADODB.Connection") db.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & db_path
set rs = Server.CreateObject("ADODB.Recordset") rs.Open "SELECT * from Table ", db, 1, 2
' déclaration de deux futurs objets dim WordApp, WordDoc
' Création de l'objet application word Set WordApp = CreateObject("word.application")
' Pas la peine de démarrer Word sur le serveur, on n'y est pas !!! WordApp.Application.Visible = false
' Création du document Word Set WordDoc = WordApp.Documents.Add()
' Parcours du recordset. Pour chaque Item, création de plusieurs paragraphes contenant ' les informations de la base. ' Puis saut de page. ' Attention, là c'est du VBA Word, qui peut parfois être un peu étrange ' Par exemple, l'opérateur := du VBA ne passe pas en ASP. Donc remplacer par ' des parenthèses. ' De même, les constantes VBA genre WdAlignCenter ne sont pas connues en ASP ' et retournent donc 0. Il faut donc utiliser leur valeur entière (0, 1, 2...)
Do while not rs.EOF
Set Mypar1 = WordDoc.Paragraphs.Add set MyRange1 = Mypar1.range MyRange1.InsertBefore(rs.fields.item("Client").value & vbcrlf) MyRange1.Style = "Titre 1" MyRange1.ParagraphFormat.Alignment = 1
Set newpar = WordDoc.Paragraphs.Add set newrange = newpar.range
with newrange .Bold = False .Italic = false .Font.Name = "Verdana" .Font.size = "12" end with