In diesem Artikel wird beschrieben, wie Sie RTF-Dateien mit einem ASP-Skript erstellen und diese Dateien dann an Microsoft Word übertragen können. Diese Technik stellt eine Alternative zur serverseitigen Automatisierung von Microsoft Word für die Dokumenterstellung zur Laufzeit dar.
Hinweis: In diesem Artikel wird vorausgesetzt, dass Sie eine Kopie der Beispieldatenbank "Nordwind.mdb" aus Microsoft Access 2000, Microsoft Access 2002 oder Microsoft Office Access 2003 installiert haben.
Das Erstellen von Word-Dokumenten über die serverseitige Automatisierung über ASP-Seiten hat Nachteile:
- Leistung: Microsoft Word ist ein Out-of-Process-Automatisierungsserver. Die Ausführung von Out-of-Process-Aufrufen dauert länger.
- Skalierbarkeit: Als Automatisierungsserver ist Microsoft Word stark beansprucht, da die Datei "Winword.exe" geladen werden muss, damit Sie die Vorteile des umfassenden Objektmodells von Word nutzen können.
Durch komplett neues Erstellen von Dokumenten ohne Verwendung des Word-Objektmodells, können Sie Ihre ASP-Anwendung skalierbarer machen und auch die Leistung steigern. Dieser Ansatz wird in den folgenden Beispielen verwendet, um die Verwendung von
FileSystemObject zur Erstellung einer RTF-Datei zu veranschaulichen, die in Microsoft Word auf Browserclients interpretiert werden kann.
Das erste Beispiel zeigt, wie ASP zur Erstellung eines RTF-Dokuments verwendet wird, das Kopf- und Fußzeilen sowie eine Tabelle enthält und verschiedene Schriftstile und Farben für Text in dem Dokument verwendet. Im ersten Beispiel wird ADO verwendet, um auf Daten aus der Access-Beispieldatenbank "Nordwind" zur Erstellung eines Dokuments mit über 90 Seiten zuzugreifen.
Im zweiten Beispiel wird veranschaulicht, wie ein RTF-Dokument ähnlich wie bei einem Word-Seriendruck erstellt wird. Das daraus entstehende Dokument enthält Kopf- und Fußzeilen, verschiedene Absatzformatierungen und Seitenumbrüche und verwendet unterschiedliche Schriftstile und -typen in dem Dokument. In diesem Beispiel wird ebenfalls ADO verwendet, um auf die Nordwind-Datenbank zur Erstellung eines Dokuments mit über 170 Seiten zuzugreifen.
Hinweis: Die Rich Text Format-(RTF-)Spezifikation ist eine öffentliche Spezifikation zur Erstellung von RTF-kompatiblen Textdateien. Sie können die Dokumentation für die Spezifikation auf der folgenden MSDN-Website (Microsoft Developer Network) als Ressource zum Erstellen eigener RTF-Dateien verwenden. Die Spezifikation wird jedoch "wie besehen" bereitgestellt und wird nicht vom technischen Support von Microsoft unterstützt. Die aktuelle Version der RTF-Spezifikation finden Sie auf der folgenden MSDN-Website:
ASP-Beispiel 1
Das folgende ASP-Beispiel zeigt die Erstellung eines RTF-Dokuments mit über 90 Seiten, das einen Bericht über berechnete Zahlen enthält.
Hinweis: Die Variable
sConn in diesem Code enthält den Pfad zu der Nordwind-Datenbank. Vergewissern Sie sich, dass der bereitgestellte Pfad für Ihre Installation von Office korrekt ist. Sie müssen dem Ordner mit dem ASP-Code außerdem
Schreib-Zugriff gewähren, damit das Dokument erstellt werden kann. Dieser Zugriff sollte auf bestimmte Benutzer einer Windows NT-Domäne begrenzt bleiben, kann jedoch für anonymen Zugriff auf
Jeder angewendet werden.
<%@ Language=VBScript %>
<%
Dim sRTF, sFileName, sConn
sConn = "c:\program files\microsoft office\office\samples\northwind.mdb"
Response.Buffer = True
'Create the file for the RTF
Dim fso, MyFile
Set fso = CreateObject("Scripting.FileSystemObject")
sFileName = "sample1.doc"
Set MyFile = fso.CreateTextFile(Server.MapPath(".") & "\" & _
sFileName, True)
MyFile.WriteLine("{\rtf1")
'Write the color table (for use in background and foreground colors)
sRTF = "{\colortbl;\red0\green0\blue0;\red0\green0\blue255;" & _
"\red0\green255\blue255;\red0\green255\blue0;" & _
"\red255\green0\blue255;\red255\green0\blue0;" & _
"\red255\green255\blue0;\red255\green255\blue255;}"
MyFile.WriteLine(sRTF)
'Write the title and author for the document properties
MyFile.WriteLine("{\info{\title Sample RTF Document}" & _
"{\author Microsoft Developer Support}}")
'Write the page header and footer
MyFile.WriteLine("{\header\pard\qc{\fs50 " & _
"ASP-Generated RTF\par}{\fs18\chdate\par}\par\par}")
MyFile.WriteLine("{\footer\pard\qc\brdrt\brdrs\brdrw10\brsp100" & _
"\fs18 Page " & _
"{\field{\*\fldinst PAGE}{\fldrslt 1}} of " & _
"{\field{\*\fldinst NUMPAGES}{\fldrslt 1}} \par}")
'Write a sentence in the first paragraph of the document
MyFile.WriteLine("\par\fs24\cf2 This is a sample \b RTF \b0 " & _
"document created with ASP.\cf0")
'Connect to the database in read-only mode
Dim conn, rs
Set conn = Server.CreateObject("ADODB.Connection")
conn.Provider = "Microsoft.Jet.OLEDB.4.0"
conn.Mode = 1 'adModeRead=1
conn.Open sConn
'Execute a query that returns ID, Product name and amount of sale
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "SELECT [Order Details].OrderID AS ID, " & _
"Products.ProductName AS Name, " & _
"[Order Details].[UnitPrice]*[Quantity] AS Amount " & _
"FROM Products INNER JOIN [Order Details] ON " & _
"Products.ProductID = [Order Details].ProductID " & _
"ORDER BY [Order Details].OrderID", conn, 3 'adOpenStatic = 3
MyFile.WriteLine("{") 'Start table
MyFile.WriteLine("\par\par\fs24")
'Write the table header row (appears at top of table on each page)
sRTF = "\trowd\trhdr\trgaph30\trleft0\trrh262" & _
"\cellx2000\cellx7000\cellx9000" & _
"\pard\intbl\qc\b\i\ul Order ID \ul0\i0\b0\par\cell" & _
"\pard\intbl\ql\b\i\ul Product \ul0\i0\b0\par\cell" & _
"\pard\intbl\qr\ul\b\i Amount \ul0\i0\b0\par\cell" & _
"\pard\intbl\row"
MyFile.WriteLine(sRTF)
dim LastID
dim CurID
dim CurTotal
dim bFirstRow
bFirstRow=true
do while not (rs.eof)
if LastID<>rs("ID").Value and not(bFirstRow) Then
'Starting on a row for a different id, so add the last total and
'then a blank row
sRTF = "\trowd\trgaph30\trleft0\trrh262" & _
"\cellx2000\cellx7000\clbrdrb\brdrdb\cellx9000" & _
"\pard\intbl\cell\pard\intbl\cell\pard\intbl\qr\b " & _
FormatCurrency(CurTotal, 0, False, False, True) & _
"\b0\cell\pard\intbl\row" & _
"\trowd\trgaph30\trleft0\trrh262" & _
"\cellx2000\cellx7000\cellx9000" & _
"\pard\intbl\cell\pard\intbl\cell\pard\intbl\cell" & _
"\pard\intbl\row"
MyFile.WriteLine(sRTF)
CurID = rs("ID").Value
CurTotal = 0
elseif bFirstRow then
CurID = rs("ID").Value
else
CurID = ""
end if
'Add a new row with the ID, the Product name and the amount
'Note: Amounts over 1000 are formatted with red.
sRTF = "\trowd\trgaph30\trleft0\trrh262" & _
"\cellx2000\cellx7000\cellx9000" & _
"\pard\intbl\qc " & CurID & "\cell" & _
"\pard\intbl\ql " & rs("Name").Value & "\cell"
If rs("Amount").Value >1000 Then
sRTF = sRTF & "\pard\intbl\qr\cf6 " & _
FormatNumber(rs("Amount").Value, 0, False, False, True) & _
"\cf0\cell\pard\intbl\row"
else
sRTF = sRTF & "\pard\intbl\qr " & _
FormatNumber(rs("Amount").Value, 0, False, False, True) & _
"\cell\pard\intbl\row"
end if
MyFile.WriteLine(sRTF)
LastID = rs("ID").Value
CurTotal = CurTotal + rs("Amount").Value
rs.MoveNext
bFirstRow=false
loop
MyFile.WriteLine("}") 'End Table
'Add a page break and then a new paragraph
MyFile.WriteLine("\par \page")
MyFile.WriteLine("\pard\fs18\cf2\qc " & _
"This sample provided by Microsoft Developer Support.")
'Close the recordset and database
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
'close the RTF string and file
MyFile.WriteLine("}")
MyFile.Close
Response.Write _
"<META HTTP-EQUIV=""REFRESH"" Content=""0;URL=" & sFileName & """>"
%>
ASP-Beispiel 2
Der folgende ASP-Code stellt eine Simulation eines Word-Seriendrucks oder Serienbriefs dar. Jede Seite des 170-seitigen Dokuments wird aus einem Datensatz in einem ADO-Recordset erstellt.
Hinweis: Die Variable
sConn in diesem Codebeispiel enthält den Pfad zu der Nordwind-Datenbank. Vergewissern Sie sich, dass der bereitgestellte Pfad für Ihre Installation von Office korrekt ist. Sie müssen dem Ordner mit dem ASP-Code außerdem
Schreib-Zugriff gewähren, damit das Dokument erstellt werden kann. Dieser Zugriff sollte auf bestimmte Benutzer einer Windows NT-Domäne begrenzt bleiben, kann jedoch für anonymen Zugriff auf
Jeder angewendet werden.
<%@ Language=VBScript %>
<%
Dim sRTF, sConn
sConn = "c:\program files\microsoft office\office\samples\northwind.mdb"
Response.Buffer = True
'Create the file for the RTF
Dim fso, MyFile, sFileName
Set fso = CreateObject("Scripting.FileSystemObject")
sFileName = "sample2.doc"
Set MyFile = fso.CreateTextFile(Server.MapPath(".") & "\" & _
sFileName, True)
MyFile.WriteLine("{\rtf1")
'Write the font table
sRTF = "{\fonttbl {\f0\froman\fcharset0 Times New Roman;}" & _
"{\f1\fswiss\fcharset0 Arial;}" & _
"{\f2\fmodern\fcharset0 Courier New;}}"
MyFile.WriteLine sRTF
'Write the title and author for the document properties
MyFile.WriteLine("{\info{\title Sample RTF Document}" & _
"{\author Microsoft Developer Support}}")
'Write the document header and footer
MyFile.WriteLine("{\header\pard\qc\brdrb\brdrs\brdrw10\brsp100" & _
"{\fs50 Northwind Traders} \par}")
MyFile.WriteLine("{\footer\pard\qc\brdrt\brdrs\brdrw10\brsp100" & _
"{\fs18 Questions?\par Call (111)-222-3333, " & _
" Monday-Friday between 8:00 am and 5:00 pm} \par}")
'Connect to the database in read-only mode
Dim conn, rs
Set conn = Server.CreateObject("ADODB.Connection")
conn.Provider = "Microsoft.Jet.OLEDB.4.0"
conn.Mode = 1 'adModeRead=1
conn.Open sConn
'Execute a query that returns ID, Product name and amount of sale
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "SELECT Orders.ShippedDate, Orders.ShipVia, " & _
"Orders.OrderDate, Orders.OrderID, " & _
"Customers.ContactName FROM Customers INNER JOIN Orders ON " & _
"Customers.CustomerID = " & _
"Orders.CustomerID WHERE (((Orders.ShippedDate) Between " & _
"#1/1/1998# And #3/31/98#))",conn,3 'adOpenStatic = 3
Do While Not (rs.eof)
'Write the "body" of the form letter
MyFile.WriteLine "\fs26\f1" 'Default font
MyFile.WriteLine "\pard"
MyFile.WriteLine "\par\par\par\par"
MyFile.WriteLine "\par RE: Order #" & rs.Fields("OrderID").Value
MyFile.WriteLine "\par"
MyFile.WriteLine "\par"
MyFile.WriteLine "\par " & rs.Fields("ContactName").Value & ", "
MyFile.WriteLine "\par"
MyFile.WriteLine "\par Thank you for your order on " & _
rs.Fields("ShippedDate").Value & _
". Your order has been shipped: "
MyFile.WriteLine "\par"
MyFile.WriteLine "\par"
MyFile.WriteLine "\pard \li720 {\f2"
MyFile.WriteLine "\par \b Order Number \b0 \tab " & _
rs.Fields("OrderID").Value
MyFile.WriteLine "\par \b Shipped By \b0 \tab " & _
rs.Fields("ShipVia").Value
MyFile.WriteLine "\par \b Shipped On \b0 \tab " & _
rs.Fields("ShippedDate").Value
MyFile.WriteLine "\par}"
MyFile.WriteLine "\pard"
MyFile.WriteLine "\par"
MyFile.WriteLine "\par Northwind Traders is committed to " & _
"bringing you products of the " & _
"highest quality from all over the world. If " & _
"at any time you are not completely satisfied " & _
"with any of our products, you may " & _
"return them to us for a full refund."
MyFile.WriteLine "\par"
MyFile.WriteLine "\pard {\fs18 \qc \i"
MyFile.WriteLine "\par Thank you for choosing Northwind Traders!"
MyFile.WriteLine "\par}"
rs.MoveNext
'Add a page break and then a new paragraph
If Not(rs.eof) Then MyFile.WriteLine("\pard \page")
Loop
'Close the recordset and database
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
'close the RTF string and file
MyFile.WriteLine("}")
MyFile.Close
Response.Write _
"<META HTTP-EQUIV=""REFRESH"" Content=""0;URL=" & sFileName & """>"
%>
Weitere Informationen finden Sie in den folgenden Artikeln der Microsoft Knowledge Base:
257757
(http://support.microsoft.com/kb/257757/DE/
)
Was bei der serverseitigen Automatisierung von Office zu beachten ist
193998
(http://support.microsoft.com/kb/193998/DE/
)
Welche zu lesende und Binäre Daten anzeigen in ASP Verfahrensweise
266263
(http://support.microsoft.com/kb/266263/DE/
)
BUG: Word 2000 und Excel 2000 Display ASP Source When, das Mime-Typen auf Stromdaten verwendet
247318
(http://support.microsoft.com/kb/247318/DE/
)
BUG: Word 2000 und Excel 2000 leiten nicht korrekt um, wenn Word 2000 und Excel 2000 Response.Redirect verwenden
Artikel-ID: 270906 - Geändert am: Montag, 25. Juni 2007 - Version: 8.0
Die Informationen in diesem Artikel beziehen sich auf:
- Microsoft Office Word 2007
- Microsoft Office Word 2003
- Microsoft Word 2000 Standard Edition
- Microsoft Word 97 Standard Edition
- Microsoft Active Server Pages 4.0
| kbexpertiseinter kbautomation kbfso kbhowto kbprogramming KB270906 |
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.