ASP を使用して RTF (Rich Text Format) ドキュメントを生成し、Microsoft Word にストリーム出力する方法

文書翻訳 文書翻訳
文書番号: 270906 - 対象製品
すべて展開する | すべて折りたたむ

概要

この資料では、ASP スクリプトを使用して RTF (Rich Text Format) ファイルを生成し、そのファイルを Microsoft Word にストリーム出力する方法について説明します。このテクニックは、Microsoft Word のサーバーサイドのオートメーションで実行時にドキュメント生成を行う方法の代わりに使用できます。

詳細

Word ドキュメントを ASP のサーバーサイド オートメーションで生成する場合、いくつかのデメリットがあります。
  • パフォーマンス。Microsoft Word は、アウト プロセスのオートメーション サーバーです。アウト プロセス呼び出しは、実行に時間がかかります。

  • スケーラビリティ。Word のリッチ オブジェクト モデルの利点を活かすには Winword.exe ファイルを最初に読み込む必要があるため、オートメーション サーバーとしては Microsoft Word はかなりのオーバーヘッドを伴います。
Word のオブジェクト モデルを使用せず、ドキュメントを最初から生成することで、ASP アプリケーションのスケーラビリティとパフォーマンスが向上します。このアプローチは、以下のサンプルで使用されています。以下のサンプルでは、サーバー側で FileSystemObject を使用して RTF ファイルを作成します。このファイルは、クライアント側ブラウザで Microsoft Word によって表示することができます。

最初のサンプルでは、ASP を使用して RTF ドキュメントを作成します。ここで作成する RTF ドキュメントには、ヘッダーとフッターおよび表が含まれ、ドキュメント全体で複数のフォント スタイルと文字色が使用されています。最初のサンプルでは、ADO を使用して、Access のノースウィンド サンプル データベースのデータにアクセスし、約 70 ページのドキュメントを作成します。

2 番目のサンプルでは、Word の差し込み印刷に似た方法で RTF ドキュメントを作成します。作成されるドキュメントには、ヘッダーとフッター、多様な段落書式と改ページが含まれ、ドキュメント全体で複数のフォントのスタイルや種類が使用されています。このサンプルでも、ADO を使用してノースウィンド サンプル データベースのデータにアクセスし、26 ページのドキュメントを作成します。

: RTF (Rich Text Format) は公開仕様で、これを使用して RTF 互換のテキスト ファイルを生成できます。この仕様に関するドキュメントは、次の MSDN (Microsoft Developer Network) の Web サイトから入手できます。このドキュメントは独自の RTF ファイルを作成する際に参考として使用できますが、この仕様は現状仕様をありのまま (as-is) で提供するものであり、マイクロソフト テクニカル サポートの対象とはなりません。RTF の最新仕様については、次の MSDN の Web サイトを参照してください。
Rich Text Format (RTF) Specification 1.6
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnrtfspec/html/rtfspec.asp

ASP サンプル 1

次の ASP では、集計値のレポートを含む約 70 ページの RTF ドキュメントを作成します。

: このサンプル コード中の変数 sConn には、ノースウィンド データベースへのパスが含まれています。使用している Office のインストール環境に合わせてこのパスを変更してください。また、ドキュメントを作成できるように、ASP の保存フォルダに対して書き込みのアクセス許可を指定する必要があります。このアクセス許可は、Windows NT ドメイン下の特定のユーザーに制限する必要がありますが、Everyone に対しては匿名アクセスの適用が可能です。
<%@ 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 サンプル 2

次の ASP では、差し込み印刷や定型書簡に似た方法を使用します。26 ページのドキュメントの各ページは、ADO レコードセットのレコードから作成されます。

: このサンプル コード中の変数 sConn には、ノースウィンド データベースへのパスが含まれています。使用している Office のインストール環境に合わせてこのパスを変更してください。また、ドキュメントを作成できるように、ASP の保存フォルダに対して書き込みのアクセス許可を指定する必要があります。このアクセス許可は、Windows NT ドメイン下の特定のユーザーに制限する必要がありますが、Everyone に対しては匿名アクセスの適用が可能です。
<%@ 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 & """>"

%> 
				

関連情報

関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
257757 Office のサーバーサイド オートメーションについて
193998 ASP でバイナリ データの読み取りと表示を行う方法
266263 [BUG] MIME の種類を使用してデータのストリーミングを行うと Word 2000 および Excel 2000 で ASP ソースが表示される
247318 [BUG] Response.Redirect を使用すると Word 2000 および Excel 2000 で正しくリダイレクトされない

プロパティ

文書番号: 270906 - 最終更新日: 2006年9月4日 - リビジョン: 7.0
この資料は以下の製品について記述したものです。
  • Microsoft Office Word 2003
  • Microsoft Word 2000 Standard Edition
  • Microsoft Word 97 Standard Edition
  • Microsoft Active Server Pages 4.0
キーワード:?
kbautomation kbfso kbhowto kbprogramming KB270906
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com