Artikel - Detailansicht

Icon Aktuelles Ausgabe in MS-Word

Das man mit dem cfobject-Tag in Verbindung mit COM-Objekten unter Windows einige nette Dinge anstellen kann, wurde nun ja schön öfters demonstriert. Aber noch nicht genug, deshalb ist heute einmal MS Word drann, das Microsoft-Flaggschiff.

Die Ansteuerung erfolgt mittels OLE-Automatisation über das "word.application"-Objekt. Damit erlangen wir volle Kontrolle über Word und können es komplett fernsteuern, dynamisch Worddokumente erzeugen und speichern. Und da wir Webapplikationen entwickeln wollen, werden wir das Dokument mit ColdFusion dann zum Browser schicken.
Word muss natürlich auf dem ColdFusion-Server installiert sein.

Die Schritte zur Erzeugen eines Worddokumentes sind dabei im einzelnen:

  • Word-Instanz erzeugen
  • Dokument erzeugen
  • Dokument beschreiben/Formatierungen setzen
  • Dokument als Worddatei auf dem Server speichern
  • gescheicherte Worddatei zum Browser übertragen
  • Worddatei löschen
Das Instanziieren von Word erledigen wir wieder mit dem cfobject-Tag

<CFTRY>
  <cfobject type="COM"
            name="word"
            class="Word.Application"
            action="CREATE">
  <cfset word.Visible="true"> <!--- kann entfallen----->
  <CFCATCH>
    <cfabort showerror="Word nicht installiert!">
  </CFCATCH>
</CFTRY>

Die CATCH-Klausel dient zum Abfangen von Exceptions beim instanziiren.
In der ColdFusion-Variable word speichern wir die Referenz auf die erzeugte Wordinstanz. Nach dem erfolgreichen Start von Word kann man mit der Eigenschaft Visible bestimmen, ob die Word-Applikation sichbar laufen soll. Dabei ist Word defaultmässig nach dem Erzeugen unsichtbar. Aber gerade für die Entwicklung einer CF-Seite ist es ganz praktisch, Word sichtbar zu halten.

Dann erzeugen wir ein neuen leeres Worddokument und speichern div. Wordelement-Referenzen zur späteren Benutzung.

<cfset document=word.documents>
<cfset myDocument=document.Add()>

<cfset selection=word.selection>
<cfset font=selection.font>
<cfset format=selection.paragraphFormat>
<cfset activeWindow=word.activeWindow>
<cfset activePane=activeWindow.activePane>
<cfset view=activePane.view>

Wir legen den aktuellen Ausgabebereich für die Eingaben fest. Durch Setzen der Eigenschaft SeekView kann man die Eingaben z.B. speziell in den Header- oder Footer-Bereich lenken.

<cfset view.SeekView="9">
<cfset font.name="Tahoma">
<cfset font.size="12">
<cfset font.underline="true">
<cfset format.alignment="2">
<cfset dummy=selection.TypeText("erzeugt am: #stamp#!")>
<cfset dummy=selection.TypeParagraph()>
<cfset font.underline="false">

Vor der Textausgabe können wir diverse Formatierungen wie Font oder Schriftgrösse festlegen. Mit der Methode TypeParagraph() lassen sich Absätze setzen. Mit TypeText() können wir dann endlich Text in das Worddokument schreiben.

Da ColdFusion keine Funktionsaufrufe ohne Rückgabeparameter kennt müssen Methoden ohne Rückgabeparameter wie z.B. TypeText() aufgerufen werden wie Funktionen mit Rückgabewerten. Das Ergebnis wird einfach einer Variable zugewiesen ohne dass das Ergbnis weiterbenutzt wird.

Am Schluss müssen wir das Dokument nur noch speichern und zum Client schicken:

<cflock name="wordlock" timeout="10">
  <cfset dummy=myDocument.SaveAs(pfad)>
  <cfset dummy=myDocument.close()>

  <!--- word-applikation beenden --->
  <cfset dummy=word.Quit() >

  <!--- document zum browser übertragen und loeschen --->
  <cfcontent file="#pfad#"
            deletefile="Yes"
            type="application/msword"
</cflock>

Um Resourcekonflikte zu vermeiden, setzten wir die Anweisungen in CFLOCK-Tags, denn es kann natürlich nur eine ColdFusion-Template zur einer Zeit die Worddatei anlegen.
mit der SaveAs()-Methode des Document-Objekts speichern wir das Worddokument auf dem Server. Dabei ist der komplette Pfad und Dateiname anzugeben. Dann können wir das Dokument und die Wordapplikation schliessen.
Mit dem CFCONTENT-Tag von ColdFusiuon übertragen wir die erzeugte Worddatei (die ja noch auf dem Server liegt). Dabei muss man als Contenttype "application/msword" angeben. Mit dem DELETEFILE-Attribut können wir die Worddatei automatisch nach erfolgreicher Übertragung löschen lassen.

Im Browser sollte dann im allgemeinen Word nach einer vorherigen Frage geöffnet werden. Wer mehr mit dieser Technologie machen will, sollte sich aber ausführlich mit den OLE-Möglichkeiten von Word beschäftigen, vor allem braucht er Kenntnisse der Objektstruktur von Word.

Hier nochmal der vollständige kommentierte Code:

<!---pfad der lokalen worddatei auf server--->
<cfset pfad="c:\test.doc">

<!---wird in den header des worddokumentes geschrieben--->
<cfset stamp=DateFormat(now(),"DD.MM.YYYY") & " " &
            TimeFormat(now(),"HH:MM")>

<CFTRY>
  <!---word starten--->
  <cfobject type="COM" name="word" class="Word.Application" action="CREATE">
  <CFCATCH>
    <cfabort showerror="Word nicht installiert!">
  </CFCATCH>
</CFTRY>  

<!--- neues document erzeugen --->
<cfset document=word.documents>
<cfset myDocument=document.Add()>

<!--- objektreferenzen speichern  --->
<cfset selection=word.selection>
<cfset font=selection.font>
<cfset format=selection.paragraphFormat>
<cfset activeWindow=word.activeWindow>
<cfset activePane=activeWindow.activePane>
<cfset view=activePane.view>
  
<!--- kopfzeile im dokument erzeugen--->
<cfset view.SeekView="9">               <!---=header--->
<cfset font.name="Tahoma">
<cfset font.size="12">
<cfset font.underline="true">
<cfset format.alignment="2">            <!---2=rechtsbuendig--->
<cfset dummy=selection.TypeText("erzeugt am: #stamp#!")>
<!---text ausgeben--->
<cfset dummy=selection.TypeParagraph()> <!---neuer absatz--->
<cfset font.underline="false">
    
<!--- Fusszeile erzeugen --->
<cfset view.SeekView="10">            <!---=footer--->
<cfset font.name="Verdana">
<cfset font.size="10">
<cfset font.bold="false">             <!--- fett ausschalten --->
<cfset format.alignment="0">          <!--- linksbuendig --->

<!---browser im footer ausgeben--->
<cfset dummy=selection.TypeText("Browser: #CGI.HTTP_USER_AGENT# / ")>
<cfset font.bold="true">         <!--- IP wird fett geschrieben --->

<!---remote-ip im footer ausgeben--->
<cfset dummy=selection.TypeText("#CGI.REMOTE_ADDR#")>

<!--- normalen texte erzeugen --->
<cfset view.SeekView="0">
<cfset font.name="Arial">
<cfset font.size="20">
<cfset font.bold="true">
<cfset format.alignment="1">                <!---zentriert--->
<cfset dummy=selection.TypeParagraph()>
<cfset dummy=selection.TypeParagraph()>
<cfset dummy=selection.TypeText("Dieses Dokument wurde mit ")>
<cfset dummy=selection.TypeText("ColdFusion & Word erzeugt")>
      
<cflock name="wordlock" timeout="10">
  <!---  speichern --->
  <cfset dummy=myDocument.SaveAs(pfad)>   
  
  <!--- dokument schliessen --->
  <cfset dummy=myDocument.close()>   

  <!--- word-applikation beenden --->
  <cfset dummy=word.Quit()>    

  <!--- temporaeres document zum browser übertragen und loeschen --->
  <cfcontent file="#pfad#" deletefile="Yes" type="application/msword">
</cflock>


Steffen Goldfuss steffen@goldfuss.de - 12.12.1999

Zurück


Das deutsche ColdFusion-Forum cfml.de ist das Portal für Einsteiger und Experten zum Thema ColdFusion und der ColdFusion Markup Language (CFML).

© 2017 Webdesign & Hosting: CHC ONLINE Kassel | SOLVA Content-Management-System CMS
Urlaub-Angebote.de - Urlaub mit Bestpreis-Garantie buchen