ASP를 사용하여 RTF(서식 있는 텍스트 형식) 문서를 생성하여 Microsoft Word에 스트리밍하는 방법

기술 자료 번역 기술 자료 번역
기술 자료: 270906 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

요약

이 문서에서는 ASP 스크립트를 사용하여 RTF(서식 있는 텍스트 형식) 파일을 생성한 다음 이러한 파일을 Microsoft Word에 스트리밍하는 방법을 설명합니다. 이 기법은 런타임 문서 생성을 위한 Microsoft Word의 서버쪽 자동화에 대한 대안을 제공합니다.

추가 정보

ASP 서버쪽 자동화를 사용하여 Word 문서를 생성하는 데는 단점이 있습니다.
  • 성능 - Microsoft Word는 Out-of-Process(독립 프로세스) 자동화 서버이며 독립 프로세스 호출은 실행하는 데 오래 걸립니다.

  • 확장성 - 자동화 서버로서 Word의 풍부한 개체 모델의 이점을 활용하려면 Winword.exe 파일을 로드해야 하므로 Microsoft Word에는 상당한 오버헤드가 있습니다.
Word 개체 모델을 사용하지 않고 문서를 처음부터 생성하여 ASP 응용 프로그램을 더욱 확장성 있게 만들고 성능도 향상시킬 수 있습니다. 이 방법은 FileSystemObject를 사용하여 브라우저 클라이언트의 Microsoft Word에서 해석할 수 있는 RTF 파일을 만드는 방법을 보여 주는 다음 예제에 사용됩니다.

첫 번째 예제에서는 ASP를 사용하여 머리글과 바닥글 및 표가 있는 RTF 문서를 만들고 문서 전체의 텍스트에 다양한 글꼴과 색상을 사용하는 방법을 보여 줍니다. 이 예제에서는 ADO를 사용하여 예제 Northwind Access 데이터베이스의 데이터에 액세스하여 90페이지 이상의 문서를 만듭니다.

두 번째 예제에서는 Word 편지 병합에서와 비슷한 RTF 문서를 만드는 방법을 보여 줍니다. 생성되는 문서는 머리글과 바닥글, 다양한 단락 서식과 페이지 나누기를 포함하며 문서 전체에 다양한 글꼴 스타일과 글꼴 종류를 사용합니다. 이 예제에서는 ADO를 사용하여 Northwind 데이터베이스의 데이터에 액세스하여 170페이지 이상의 문서를 만듭니다.

참고 RTF(서식 있는 텍스트) 사양은 RTF 호환 텍스트 파일을 생성하는 공용 사양합니다. 다음 MSDN(Microsoft Developer Network) 웹 사이트에서 사양에 대한 설명서를 RTF 파일을 만드는 데 리소스로 사용할 수 있습니다. 그러나 사양은 "있는 그대로" 제공되며 Microsoft 기술지원부에서는 지원하지 않습니다. RTF 사양의 최신 버전은 다음 MSDN 웹 사이트를 참조하십시오.
RTF(서식 있는 텍스트) 사양 1.6
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnrtfspec/html/rtfspec.asp(영문)

ASP 예제 1

다음 ASP에서는 계산된 수치로 구성된 보고서를 포함하는 90페이지 이상의 RTF 문서를 만드는 방법을 보여 줍니다.

참고 이 코드 예제에서 변수 sConn에는 Northwind 데이터베이스에 대한 경로가 포함되어 있습니다. 제공되는 경로가 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에서는 Word 편지 병합 또는 편지 양식의 시뮬레이션을 보여 줍니다. 170페이지 이상 되는 문서의 모든 페이지는 ADO 레코드 집합에 있는 레코드에서 생성됩니다.

참고 이 코드 예제에서 변수 sConn에는 Northwind 데이터베이스에 대한 경로가 포함되어 있습니다. 제공되는 경로가 Office 설치에 적합한지 확인합니다. 문서를 만들 수 있도록 ASP가 속한 폴더에 대해 쓰기 권한을 제공해야 합니다. 이 액세스는 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 기술 자료의 다음 문서를 참조하십시오.
257757 Office의 서버쪽 자동화에 대한 고려 사항
193998 HOWTO: ASP에서 이진 데이터 읽기 및 표시
266263 BUG: Word 2000과 Excel 2000에서 MIME 유형을 사용하여 데이터 스트림을 전송할 경우 ASP 소스가 표시된다
247318 BUG: Response.Redirect를 사용할 때 Word 2000 및 Excel 2000이 제대로 리디렉션되지 않는다




Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹에 참여하시기 바랍니다.

속성

기술 자료: 270906 - 마지막 검토: 2006년 9월 13일 수요일 - 수정: 7.0
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Office Word 2003
  • Microsoft Word 2000 Standard Edition
  • Microsoft Word 97 Standard Edition
  • Microsoft Active Server Pages 4.0
키워드:?
kbhowto kbprogramming kbautomation kbfso KB270906

피드백 보내기

 

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