Преобразование XML-данных в формат RTF для отображения в Word, с помощью ASP.NET и Visual Basic .NET

Автор:
  • Фрэнк Райс (Frank Rice), Корпорация Майкрософт

Опубликовано: июль 2004 года

В статье описываются различные способы преобразования XML-данных в формат RTF. Формат XML является удобным способом организации и представления данных. Текстовый формат RTF обеспечивает хранение форматированного текста, графики и структуры документа. Преобразование XML-данных в формат RTF позволяет быстро и без труда создавать документы на основе разнообразных источников данных.


 Оригинал статьи (EN)

Введение

В статье описывается, как можно генерировать данные в формате RTF (Rich Text Format) из XML (Extensible Markup Language) с помощью Microsoft Visual Basic .NET. Текстовый формат RTF обеспечивает хранение форматированного текста, графики и структуры документа. Он широко используется в текстовых процессорах, в том числе и Microsoft Office Word 2003. Поскольку RTF — текстовый формат, его довольно просто генерировать с помощью программного кода. Если имеются XML-данные , которые необходимо показать в Word (например, каталог, список или документ для слияния), то преобразование XML-данных в поток RTF может оказаться идеальным решением. К тому же, при разработке решений, генерирующих документы на стороне веб-сервера, применение текстовых форматов HTML или RTF является предпочтительным по сравнению с использованием серверного программирования объектов Word (automation).

В настоящей статье приведен код и пошаговые инструкции, описывающие несколько методов преобразования XML-данных в формат RTF для последующего показа в Word:

  • сохранение данных RTF в файл и открытие этого файла в Word;
  • передача данных RTF в Word с помощью буфера обмена Windows;
  • потоковая передача данных RTF из веб-приложения ASP.NET с использованием простого, а затем более сложного преобразования в приложение Word, которое работает в обозревателе Microsoft Internet Explorer.
Спецификация RTF, обсуждаемая в настоящей статье, является распространенным методом создания документов в Microsoft Office 2002 и более поздних версиях. Теме не менее для создания документов Word из XML-данных в выпусках Microsoft Office 2003 рекомендуется использовать Microsoft WordML в сочетании с XSLT.

Дополнительную информацию можно найти в следующих статьях:

 Office 2003 XML Reference Schemas (Эталонные схемы XML для Office 2003) (EN)
 Новые XML-функции в объектной модели Microsoft Office Word 2003 (EN)
 Работа с XML в системе Microsoft Office System (EN)
 Редактирование данных XML с помощью Microsoft Office Word 2003 и Microsoft Office Excel 2003 (EN)
 Поддержка XML в объектной модели Microsoft Office Word 2003 — обзор (EN)

Спецификация формата RTF

Спецификация RTF — это открытая спецификация для генерирования RTF-совместимых текстовых файлов. Документ Word 2002 Tool: Rich Text Format Specification (Средство для Word 2002: спецификация RTF) (EN) можно использовать в качестве ресурса для создания собственных RTF-файлов.

Преобразование XML-данных в формат RTF

Корректные XML-данные из любого источника можно преобразовать в формат RTF. Следующая процедура иллюстрирует преобразование пользовательских XML-данных, с копированием результата в файл или в буфер обмена.

Чтобы преобразовать пользовательские XML-данные в формат RTF и копировать результаты в файл или в буфер обмена, выполните следующие действия

  1. В Visual Basic .NET создайте Windows-приложение. Форма Form1 будет создана автоматически.
  2. Поместите на форму Form1 два элемента управления типа «кнопка».
  3. В меню View («Вид») выберите Code («Код»).
  4. Введите следующий код в верхней части окна перед реализацией класса Form1.

    Листинг 1.

    				
    Imports System.Xml
    Imports System.Xml.Xsl
    Imports System.IO
    				
    			
  5. Добавьте следующий код к реализации класса Form1 (перед оператором End Class):

    Листинг 2.

    					
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As 
            System.EventArgs) Handles MyBase.Load
            Button1.Text = "To File"
            Button2.Text = "To Clipboard"
        End Sub
     
        Private Sub ButtonsClick(ByVal sender As System.Object, ByVal e 
            As System.EventArgs) _
            Handles Button1.Click, Button2.Click
     
            Dim sPath As String = Directory.GetParent
                (Directory.GetCurrentDirectory()).ToString
            ' Open the XML file.
            Dim xmlDoc As New XmlDocument()
            xmlDoc.Load(sPath & "\Dictionary.xml")
            ' Open the XSL file.
            Dim xslDoc As New XslTransform()
            xslDoc.Load(sPath & "\Dictionary.xslt")
     
            Select Case sender.name
                Case "Button1"
                    ' Transform the XSL and save it to a file.
                    Dim TWrtr As New XmlTextWriter(sPath & 
                       "\Dictionary.RTF", System.Text.Encoding.Default)
                    xslDoc.Transform(xmlDoc, Nothing, TWrtr)
                    TWrtr.Close()
                    MsgBox("Transformed RTF saved to " & sPath 
                       & "\Dictionary.RTF")
                Case "Button2"
                    ' Transform the XSL and copy it to the clipboard.
                    Dim SWrtr As New StringWriter()
                    xslDoc.Transform(xmlDoc, Nothing, SWrtr)
                    Dim datObj As New DataObject(DataFormats.Rtf, SWrtr)
                    Clipboard.SetDataObject(datObj)
                    SWrtr.Close()
                    MsgBox("Transformed RTF copied to the clipboard.")
            End Select
     
        End Sub
    					
    				
  6. Добавьте в проект XML-файл, выполнив следующие действия.
  7. — В меню Project («Проект») выберите Add New Item («Добавить новый элемент»).
  8. — В списке шаблонов выберите XML File («XML-файл»).
  9. — Введите имя Dictionary.xml и нажмите кнопку Open («Открыть»).
  10. — Добавьте следующий код к содержимому файла Dictionary.xml:

    Листинг 3.

    							<Dictionary>
      <Entries>
        <Entry>
          <Word Type="1">Energetic</Word>
          <Definition>Having, exerting, or displaying 
              energy</Definition>
        </Entry>
        <Entry>
          <Word Type="1">Happy</Word>
          <Definition>Enjoying, displaying, or characterized by 
              pleasure or joy</Definition>
        </Entry>
        <Entry>
          <Word Type="2">Emotion</Word>
          <Definition>A complex, strong subjective response</Definition>
        </Entry>
      </Entries>
    </Dictionary> 
    					
    				
  11. Добавьте в проект файл XSLT, выполнив следующие действия.
  12. — В меню Project («Проект») выберите Add New Item («Добавить новый элемент»).
  13. — В списке шаблонов выберите XSLT File (Файл XSLT).
  14. — Введите имя Dictionary.xslt и нажмите кнопку Open («Открыть»).
  15. — Замените содержимое файла Dictionary.xslt следующим кодом.

    Листинг 4.

    					
    <?xml version="1.0" encoding="UTF-8" ?>
    <xsl:stylesheet version="1.0" xmlns:xsl=
        "http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="/">
    <xsl:text>{\rtf1</xsl:text>
    <xsl:for-each select="Dictionary/Entries/Entry">
    <xsl:text>\par\b </xsl:text>
    <xsl:value-of select="Word"/>
    <xsl:text>\b0\i  </xsl:text> 
    <xsl:if test="Word[@Type='1']">adj.</xsl:if>
    <xsl:if test="Word[@Type='2']">n.</xsl:if>
    <xsl:text>\i0\par </xsl:text>
    <xsl:value-of select="Definition"/>
    <xsl:text>\par</xsl:text>
    </xsl:for-each>
    <xsl:text>}</xsl:text>
    </xsl:template>
    </xsl:stylesheet>
    					
    				
  16. Нажмите клавишу F5 для построения и выполнения программы.
  17. Щелкните To File («В файл»), чтобы сохранить преобразованные данные XML в файл (Dictionary.rtf). Можно открыть полученный RTF-файл в приложении Word, чтобы проверить результаты преобразования.
  18. Щелкните To Clipboard («В буфер обмена»), чтобы скопировать преобразованные XML-данные в буфер обмена Windows. Затем можно скопировать содержимое буфера обмена в новый или существующий документ Word и посмотреть результаты. Например, запустите Word, щелкните в поле документа, чтобы появился курсор, затем откройте меню «Правка» и выберите «Вставить».

Преобразование объекта DataSet в формат RTF

В Visual Basic .NET можно преобразовывать и объекты DataSet. Обычно объекты DataSet содержат подмножество из некоторого источника данных и похожи на реляционную базу данных в оперативной памяти.

Следующая процедура демонстрирует извлечение реляционных данных из модельной базы данных Northwind (в локализованном варианте ­ «Борей») и преобразование их в формат RTF. Демонстрируются два варианта преобразования: простой RTF-документ с контактными данными заказчиков, и более сложный, содержащий сведения о заказах покупателей в формате слияния.

Чтобы преобразовать объект DataSet в формат RTF, выполните следующие действия

  1. Создайте веб-приложение Visual Basic ASP.NET и сохраните его по адресу http://localhost/RTFDemo. Форма WebForm1 будет создана автоматически.
  2. Поместите на форму WebForm1 два элемента управления типа «кнопка».
  3. В меню View «Вид») выберите Code («Код»).
  4. Добавьте следующий код в функцию Page_Load:

    Листинг 5.

    					
    Button1.Text = "View Contact Information"
    Button2.Text = "View Customer Orders"
    					
    				
  5. Добавьте следующую функцию в класс WebForm1.
    В следующем коде указано, что сервер Microsoft SQL Server установлен на локальном узле. Если необходимо использовать другой компьютер, соответствующим образом измените в строке подключения член Data Source.

    Листинг 6.

    					Private Sub ButtonsClick(ByVal sender As System.Object, ByVal e As System.EventArgs) _
                Handles Button1.Click, Button2.Click
     
            ' Connect to the data source.
            Dim nwindConn As SqlConnection = New SqlConnection( _
                "Data Source=localhost;Initial Catalog=Northwind;
                    Integrated Security=SSPI")
            nwindConn.Open()
     
            ' Build a dataset based on whether you requested to view 
            ' a list of orders or a list of contacts.
            Dim ds As DataSet
            Dim sXSL As String
            Select Case (sender.id)
     
                Case "Button1"
                    ds = New DataSet("Contacts")
                    Dim ContactsDA As SqlDataAdapter = New SqlDataAdapter
                        ("SELECT * FROM Customers", nwindConn)
                    ContactsDA.Fill(ds, "Customers")
                    ' XSLT to use for transforming this dataset.
                    sXSL = "Contacts.xslt"  
     
                Case "Button2"
                    ds = New DataSet("CustomerOrders")
                    Dim custDA As SqlDataAdapter = New SqlDataAdapter
                        ("SELECT CustomerID, CompanyName, " & _
                        "Address, City, Region, PostalCode, Country 
                            FROM Customers", nwindConn)
                    custDA.Fill(ds, "Customers")
                    Dim ordersDA As SqlDataAdapter = New SqlDataAdapter
                       ("SELECT OrderID, CustomerID, Freight " & _
                        "FROM Orders", nwindConn)
                    ordersDA.Fill(ds, "Orders")
                    Dim ordersdetailDA As SqlDataAdapter = 
                       New SqlDataAdapter( _
                        "SELECT [Order Details].OrderID, 
                            Products.ProductName,
                             [Order Details].Quantity, " & _
                        "[Order Details].[UnitPrice]*[Quantity]*
                            (1-[Discount]) AS ItemTotal " &21.10.2004 _
                        "FROM Products INNER JOIN [Order Details] 
                           ON Products.ProductID = [Order 
                              Details].ProductID " _
                        , nwindConn)
     
                    ordersdetailDA.Fill(ds, "OrderDetails")
                    nwindConn.Close()
                    ds.Relations.Add("CustOrders", _
                    ds.Tables("Customers").Columns("CustomerID"), _
                    ds.Tables("Orders").Columns("CustomerID"))
                        .Nested = True
     
                    ds.Relations.Add("OrdersToOrdersDetail", _
                    ds.Tables("Orders").Columns("OrderID"), _
                    ds.Tables("OrderDetails").Columns("OrderID"))
                        .Nested = True
                    ' XSLT to use for transforming this dataset.
                    sXSL = "CustOrders.xslt" 
            End Select
     
            ' Close the connection to the data source.
            nwindConn.Close()
            ' Transform the dataset by using the appropriate stylesheet.
            Dim xmlDoc As XmlDataDocument = New XmlDataDocument(ds)
            Dim xslTran As XslTransform = New XslTransform()
            xslTran.Load(Server.MapPath(sXSL))
     
            ' Stream the results of the transformation to Word.
            Response.ContentType = "application/msword"
            Response.Charset = ""
            Response.ContentEncoding = System.Text.Encoding.Default
            xslTran.Transform(xmlDoc, Nothing, Response.Output)
     
        End Sub
    					
    				
  6. Добавьте следующие строки кода в начало WebForm1.aspx.vb, перед реализацией класса WebForm1.

    Листинг 7.

    					
    Imports System.Data.SqlClient
    Imports System.Xml
    Imports System.Xml.Xsl
    					
    				
  7. В меню Project («Проект») выберите Add New Item («Добавить новый элемент»).
  8. В списке шаблонов выберите XSLT File («XSLT-файл»), присвойте файлу имя Contacts.xslt, а затем нажмите кнопку Open («Открыть»).
  9. Замените содержимое файла Contacts.xslt следующим кодом.

    Листинг 8.

    					
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user=
        "urn:my-scripts" >   
    <xsl:output method="text"/>
    <xsl:template match="/">
    <xsl:text>{\rtf1</xsl:text>
    <xsl:text>{\fonttbl{\f0\froman\fcharset0\fprq2 Times 
        New Roman;}{\f1\fswiss\fcharset0\fprq2 Arial;}}</xsl:text>
    <xsl:text>{\header\pard\fs50 My Customer Contacts}</xsl:text>
    <xsl:text>{\footer\pard\fs18 Page {\field{\*\fldinst PAGE}</xsl:text>
    <xsl:text>{\fldrslt }} of {\field{\*\fldinst NUMPAGES}{\fldrslt 1}} 
         \par}</xsl:text>
    <xsl:text>\f1\fs20</xsl:text>
        <xsl:for-each select="Contacts/Customers">
    <xsl:text>\par\b </xsl:text><xsl:value-of 
       select="CustomerID"/><xsl:text>\b0</xsl:text>
    <xsl:text>\par </xsl:text><xsl:value-of select="CompanyName"/>
    <xsl:text>\par </xsl:text><xsl:value-of select="ContactName"/>
    <xsl:text>\par </xsl:text><xsl:value-of select="Phone"/>
    <xsl:text>\par</xsl:text>
        </xsl:for-each>
    <xsl:text>}</xsl:text>
    </xsl:template>
    <xsl:template match="Customers">
        <xsl:text>\par\b </xsl:text><xsl:value-of select="CustomerID"/><xsl:text>\b0</xsl:text>
        <xsl:text>\par </xsl:text><xsl:value-of select="CompanyName"/>
        <xsl:text>\par </xsl:text><xsl:value-of select="ContactName"/>
        <xsl:text>\par </xsl:text><xsl:value-of select="Phone"/>
        <xsl:text>\par</xsl:text>
    </xsl:template>
    </xsl:stylesheet>
    					
    				
  10. В меню Project («Проект») выберите Add New Item («Добавить новый элемент»). В списке шаблонов выберите XSLT, присвойте файлу имя CustOrders.xslt, а затем нажмите кнопку Open («Открыть»).
  11. Замените содержимое файла CustOrders.xslt следующим кодом.

    Листинг 9.

    					
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user=
        "urn:my-scripts" >   
    <xsl:output method="text"/>
    <msxsl:script language="VB" implements-prefix="user">
        Dim CustomerTotal as Double = 0
        Dim OrderSubtotal as Double = 0
        Function AddToOrderSubtotal(amt)
            amt.MoveNext
            OrderSubtotal = OrderSubtotal + 
              System.Convert.ToDouble(amt.Current.Value)
        End Function
        Function GetOrderSubtotal
    GetOrderSubtotal = OrderSubtotal
        End Function
        Function GetCustomerTotal
            GetCustomerTotal = CustomerTotal
            CustomerTotal = 0
        End Function
        Function GetOrderTotal(freight)
           freight.MoveNext
           nFreight = System.Convert.ToDouble(freight.Current.Value)
           GetOrderTotal = nFreight + OrderSubtotal
           CustomerTotal = nFreight + OrderSubtotal + CustomerTotal
           OrderSubtotal = 0  
        End Function
            
    </msxsl:script>
    <xsl:template match="CustomerOrders">
    <xsl:text>{\rtf1</xsl:text>
    <xsl:text>{\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;\red221\green221\blue221;}</xsl:text>
    <xsl:text>{\info{\title Sample RTF Document}{\author Microsoft 
        Developer Support}}</xsl:text>
    <xsl:text>{\header\pard\qc{\fs50 ASP-Generated 
        RTF\par}{\fs18\chdate\par}\par\par}</xsl:text>
    <xsl:text>{\footer\pard\qc\brdrt\brdrs\brdrw10\brsp100\fs18 
        Page {\field{\*\fldinst PAGE}</xsl:text>
    <xsl:text>{\fldrslt }} of {\field{\*\fldinst NUMPAGES}
        {\fldrslt 1}} \par}</xsl:text>
    <xsl:apply-templates select="Customers"/>
    <xsl:text>}</xsl:text>
    </xsl:template>
    <xsl:template match="Customers">
        <xsl:text>\par\pard\fs20\cf2\qr\b </xsl:text><xsl:value-of 
             select="CustomerID"/><xsl:text>\cf0\b0</xsl:text>
        <xsl:text>\par\pard </xsl:text><xsl:value-of select="CompanyName"/>
        <xsl:text>\par </xsl:text><xsl:value-of select="Address"/>
        <xsl:text>\par </xsl:text><xsl:value-of select="City"/>
        <xsl:text>, </xsl:text><xsl:value-of select="Region"/>
        <xsl:text> </xsl:text><xsl:value-of select="PostalCode"/>
        <xsl:text>\par </xsl:text><xsl:value-of select="Country"/>
        <xsl:text>\par\par</xsl:text>
    <xsl:apply-templates select="Orders"/>
    <xsl:text>\trowd\cellx7000\cellx9000\pard\intbl\ql\b\cbpat1 </xsl:text>
    <xsl:text>Order Total for the Current Period:\cell </xsl:text>
    <xsl:text>\qr</xsl:text>
    <xsl:variable name="CustTtl" select="user:GetCustomerTotal()"/>
    <xsl:value-of select="format-number($CustTtl,'$###0.00')"/>
    <xsl:text>\cell</xsl:text>
    <xsl:text>\pard\intbl\row</xsl:text>
    <xsl:text>\pard\par\pard</xsl:text>
    <xsl:text>\pard\plain\fs18\cf6\qc</xsl:text>
    <xsl:choose>
    <xsl:when test="$CustTtl = 0">
             <xsl:text>\b We've missed hearing from you!\b0 </xsl:text>
             <xsl:text> At your convenience, please call your personal 
                sales representative </xsl:text>
             <xsl:text>so that we may discuss our specials for new 
                 and returning customers!</xsl:text>
          </xsl:when>
          <xsl:when test="$CustTtl > 2000">
             <xsl:text>\b Congratulations!\b0  Your purchases for this 
                period qualify you for a \b 20%\b0 </xsl:text>
             <xsl:text> discount on one of your next orders. To take 
                 advantage of this offer, provide </xsl:text>
             <xsl:text>the coupon code ABC123XYZ when placing your 
                order.</xsl:text>
          </xsl:when>
          <xsl:otherwise>
             <xsl:text> We value your patronage with Northwind Traders 
                 and would love to hear from you. </xsl:text>
             <xsl:text>If you have any questions about our upcoming line 
                of products or if you want </xsl:text>
             <xsl:text>a catalog for the coming season, call 
                1-888-000-000.</xsl:text>
          </xsl:otherwise>
        </xsl:choose>
    <xsl:text>\par\pard</xsl:text>
    <xsl:text>\par \page</xsl:text>
    </xsl:template>
    <xsl:template match="Orders">
    <xsl:text>\trowd\cellx9000\pard\intbl\cbpat9</xsl:text>
    <xsl:text>\ql\b </xsl:text><xsl:value-of 
        select="OrderID"/><xsl:text>\b0\cell </xsl:text>
    <xsl:text>\pard\intbl\row</xsl:text>
    <xsl:apply-templates select="OrderDetails"/>
    <xsl:text>\trowd\cellx7000\cellx9000\pard\intbl</xsl:text>
    <xsl:text>\qr Subtotal:\cell </xsl:text>
    <xsl:value-of select="format-number
        (user:GetOrderSubtotal(),'$###0.00')"/><xsl:text>\cell</xsl:text>   
    <xsl:text>\pard\intbl\row</xsl:text>
    <xsl:text>\trowd\cellx7000\cellx9000\pard\intbl</xsl:text>
    <xsl:text>\qr Freight:\cell </xsl:text>
    <xsl:value-of select="format-number
        (Freight,'$###0.00')"/><xsl:text>\cell</xsl:text>   
    <xsl:text>\pard\intbl\row</xsl:text>
    <xsl:text>\trowd\cellx7000\cellx9000\pard\intbl</xsl:text>
    <xsl:text>\qr Total:\cell </xsl:text>
    <xsl:value-of select="format-number(user:GetOrderTotal(Freight), 
        '$###0.00')"/><xsl:text>\cell</xsl:text>   
    <xsl:text>\pard\intbl\row</xsl:text>
    <xsl:text>\trowd\cellx9000\pard\intbl \cell\pard\intbl\row</xsl:text>
    </xsl:template>
    <xsl:template match="OrderDetails">
    <xsl:text>\trowd\cellx5000\cellx7000\cellx9000\pard\intbl\
        ql </xsl:text>
    <xsl:value-of select="ProductName"/><xsl:text>\cell </xsl:text>
    <xsl:text>\qc </xsl:text><xsl:value-of 
        select="Quantity"/><xsl:text>\cell </xsl:text>
    <xsl:text>\qr </xsl:text>
    <xsl:value-of select="format-number
        (ItemTotal,'$###0.00')"/><xsl:text>\cell</xsl:text>
    <xsl:variable name="RunTotal" 
        select="user:AddToOrderSubtotal(ItemTotal)"/>
    <xsl:text>\pard\intbl\row</xsl:text>
    </xsl:template>
    </xsl:stylesheet>
    					
    				
  12. В меню Build («Построить») выберите Build Solution («Построить решение»).
  13. Запустите Internet Explorer и откройте страницу http://localhost/RTFDemo/Webform1.aspx.
  14. Выберите View Contact Information («Просмотр контактной информации»), чтобы отобразить в приложении Word первый вариант преобразования XML в RTF.
  15. Нажмите кнопку «Назад» в Internet Explorer.
  16. Выберите View Customer Orders («Просмотр заказов покупателей»), чтобы отобразить в приложении Word второй вариант преобразования XML в RTF.

Разрешение вопросов при работе с форматом RTF

Выводится сообщение типа Login failed for user "MachineName\ASPNET" (Нет доступа для пользователя "имя_компьютера\ASPNET")

Если при нажатии одной из кнопок появилось сообщение «Login failed for user ««MachineName\ASPNET», то, вернее всего, учетная запись \ASPNET не имеет необходимых разрешений в SQL Server и поэтому не может получить доступ к базе данных. Чтобы устранить проблему, выполните следующие действия:

  1. Запустите диспетчер SQL Server Enterprise Manager.
  2. Разворачивайте уровни дерева, пока не откроется узел (local) (Windows NT).
  3. Разверните папку Security («Безопасность»).
  4. Выберите значок Logins («Подключения»), щелкните его правой кнопкой мыши и выберите New Login («Новое подключение»).
  5. В поле Name («Имя») введите aspnet. Убедитесь в том, что выбран параметр Windows Authentication («Проверка подлинности средствами Windows»).
  6. В раскрывающемся списке Domain («Домен») выберите локальный домен компьютера. Оставьте заданный по умолчанию параметр безопасности Grant access («Предоставить доступ»).
  7. В группе Defaults («Значения по умолчанию») откройте раскрывающийся список Database («База данных») и выберите Northwind. Оставьте в качестве языка по умолчанию English.
  8. Нажмите кнопку ОК.
  9. Повторно нажмите одну из кнопок.

Сохранение RTF-данных в файле и перенаправление на сохраненный файл

Пример кода, приведенный в разделе Преобразование объекта DataSet в формат RTF, передает данные RTF непосредственно в обозреватель. Однако можно сохранить их в файл и выполнить перенаправление на сохраненный файл. Для этого необходимо заменить в примере следующие строки кода:

Листинг 10.

			
Response.ContentType = "application/msword"
Response.ContentEncoding = System.Text.Encoding.Default
Response.Charset = ""
xslTran.Transform(xmlDoc, Nothing, Response.Output)
			
		

на другие:

Листинг 11.

			
Dim writer As XmlTextWriter = New XmlTextWriter( _
        Server.MapPath("Results.doc"), System.Text.Encoding.Default)
xslTran.Transform(xmlDoc, Nothing, writer)
writer.Close()
Response.Redirect("Results.doc")
			
		

Сохранив таким образом RTF-данные в файле, можно изучить их структуру с помощью текстового редактора, например «Блокнота». Это может быть удобно в тех случаях, когда преобразование XSL не дает ожидаемых результатов.

Обратите внимание на представление пробелов и возвратов каретки

Выполняя преобразование в формат RTF, обратите внимание на представление пробелов и возвратов каретки в таблице стилей, поскольку это может повлиять на то, как Word интерпретирует RTF-данные. В обоих примерах кода в этом разделе используется элемент <xsl:text>, поскольку он обеспечивает сохранение всех пробелов.

Убедитесь в том, что данные XML преобразовываются в текст

Используйте элемент <xsl:output method="text"> в таблице стилей, чтобы обеспечить преобразование данных XML в текст (а не в XML — формат вывода по умолчанию). Если не указать text как формат вывода, в файл могут быть добавлены инструкции по обработке XML. В результате Word может не опознать текст как RTF.

Заключение

В настоящей статье были рассмотрены различные способы преобразования XML-данных в формат RTF. В частности, мы описали, как преобразовать пользовательские XML-данные в формат RTF, копируя результаты в файл или в буфер обмена. Мы также рассмотрели простой способ преобразования наборов данных с помощью Visual Basic .NET. Поскольку RTF — это текстовый формат, RTF-данные легко создать в программном коде. Кроме того, сегодня XML де-факто является стандартом представления данных. По этой причине описанные методы вполне могут пригодиться разработчикам для создания RTF-документов в собственных приложениях.

Дополнительная информация

Дополнительные сведения по использованию RTF в собственных решениях можно найти в следующих статьях:

 Статья Microsoft Knowledge Base — 270906: HOWTO: Use ASP to Generate a Rich Text Format (RTF) Document to Stream to Microsoft Word (Генерирование документа RTF с помощью ASP для передачи в Microsoft Word) (EN)
 Статья Microsoft Knowledge Base -258513: HOWTO: Paste Rich Text Formatted String into Word with Visual Basic Automation (Вставка строки RTF в Word с помощью Visual Basic Automation) (EN)

Дополнительные сведения по преобразованию XML с помощью Visual Basic .NET можно найти в следующих статьях:

 Статья Microsoft Knowledge Base -300934: HOW TO: Apply an XSL Transformation to XML for Streaming by Using Visual Basic .NET (Применение XSLT к XML для потоковой передачи с использованием Visual Basic .NET) (EN)
 Статья Microsoft Knowledge Base -300929: HOW TO: Apply an XSL Transformation from an XML Document to an XML Document Using Visual Basic .NET (Применение XSLT для преобразования одного документа XML в другой с использованием Visual Basic .NET)
Показ: