Použití technologie ASP.NET nebo Visual Basic .NET k transformaci souboru XML do formátu RTF aplikace Microsoft Word 2002

Souhrn

Použijte tento podrobný návod ke generování RTF (RICH Text Format) pomocí jazyka Visual Basic .NET z jazyka XML (Extensible Markup).


Formát RTF je textový formát, který kóduje formátovaný text, rozložení dokumentu a grafiku. Se běžně používá aplikaci Microsoft Word. Protože RTF je textový, jej lze snadno generovat pomocí kódu. Pokud máte data XML, která chcete zobrazit jako katalog nebo seznam nebo typ dokumentu hromadné korespondence v aplikaci Word, pak transformace dat XML do proud ve formátu RTF může být ideálním řešením pro vás. A ve skutečnosti, pokud vyvíjíte řešení kde Generovat dokumenty na webový server, potom generování těchto dokumentů pomocí textový formát, například HTML nebo RTF, je upřednostňována před použití straně serveru automatizace aplikace Word.

Tento článek obsahuje ukázkový kód s podrobnými pokyny k transformaci souboru XML do formátu RTF pro zobrazení v aplikaci Word pomocí několika způsoby:
  • Uložit do souboru RTF a otevřete ji v aplikaci Word.
  • Přeneste formátu RTF do aplikace Word pomocí schránky systému Windows.
  • Proud ve formátu RTF do aplikace Word v aplikaci Microsoft Internet Explorer z webové aplikace technologie ASP.NET.

Specifikace formátu RTF

Specifikace RTF (RICH Text Format) je veřejné specifikace pro generování textové soubory ve formátu RTF kompatibilní. Dokumentace můžete použít pro specifikaci na následujícím webu Microsoft Developer Network (MSDN) jako prostředek pro tvorbu souborů ve formátu RTF. Specifikace je však poskytována "jako-je", a žádná podpora je poskytována odborná pomoc společnosti Microsoft pro specifikaci. Specifikace formátu RTF získáte klepnutím na následující odkazy:

Transformaci XML do formátu RTF

Můžete vzít z libovolného zdroje platný kód XML a transformaci do formátu RTF. Následující postup ukazuje, jak můžete transformovat vlastní data XML do formátu RTF uložen do souboru nebo do schránky zkopírován.
  1. Vytvoření nové Aplikace WindowsVisual Basic .NET. Je pro vás vytvořen formulář Form1.
  2. Přidáte dvě tlačítka řídí Form1.
  3. V nabídce Zobrazit klepněte na kód.
  4. V horní části okna kód před implementaci třídy Form1 vložte následující:
    Imports System.XmlImports System.Xml.Xsl
    Imports System.IO
  5. Implementace třídy Form1 (před Konce třídy) přidejte následující kód:
        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 file.
    Dim TWrtr As New XmlTextWriter(sPath & "\Dictionary.RTF", System.Text.Encoding.Default)
    xslDoc.Transform(xmlDoc, Nothing, TWrtr, Nothing)
    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, Nothing)
    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. Přidáte soubor XML do projektu:
    1. V nabídce projekt klepněte na příkaz Přidat novou položku.
    2. Ze seznamu šablon klepněte na tlačítko Soubor XML.
    3. Zadejte název Dictionary.xml a klepněte na tlačítko Otevřít.
    4. Chcete-li obsah Dictionary.xml připojte následující:
      <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>
  7. Do projektu přidáte soubor XSLT:
    1. V nabídce projekt klepněte na příkaz Přidat novou položku.
    2. Ze seznamu šablon klepněte na tlačítko Soubor XSLT.
    3. Zadejte název Dictionary.xslt a klepněte na tlačítko Otevřít.
    4. Nahradíte obsah Dictionary.xslt se následující:
       <?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>
  8. Stisknutím klávesy F5 sestavit a spustit program.
  9. Klepněte Na soubor k uložení transformovaný XML do souboru (Dictionary.rtf). Můžete otevřít soubor ve formátu RTF v aplikaci Word zkoumat výsledky transformace.
  10. Klepněte Do schránky zkopírovat transformovaný XML do schránky systému Windows. Potom můžete vložit obsah schránky do nového nebo existujícího dokumentu aplikace Word zobrazit výsledky.

Objekt DataSet transformaci do formátu RTF

Visual Basic .NET umožňuje snadno provádět transformace objektů DataSet. Tento postup ukazuje, jak převzít související data z ukázkové databáze Northwind a transformaci do formátu RTF. Se prokáže, že dvě různé transformace: jednoduchý dokument ve formátu RTF, který obsahuje informace o zákazníkovi a poněkud složitější dokument ve formátu RTF, který zobrazuje informace o objednávce pro zákazníky ve formátu typ hromadné korespondence.
  1. Spuštění nové Webové aplikace technologie ASP.NET jazyka Visual Basic a uložte jej na http://localhost/RTFDemo.

    Formulář WebForm1 je vytvořen.
  2. Přidejte dvě tlačítko ovládací prvky na formulář WebForm1.
  3. V nabídce Zobrazit klepněte na kód.
  4. Přidejte následující kód Page_Load funkce:
            Button1.Text = "View Contact Information"        Button2.Text = "View Customer Orders"
  5. Přidáte následující funkce třídy formulář WebForm1 .

    Poznámka: následující kód předpokládá, že máte SQL Server nainstalovaný na počítači na localhost. Pokud potřebujete použít jiný počítač, měnit zdroj dat, který je členem připojovací řetězec.
        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 " & _
    "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. V horní části souboru WebForm1.aspx.vb, před provedením třídě formulář WebForm1 přidejte následující řádky kódu:
    Imports System.Data.SqlClientImports System.Xml
    Imports System.Xml.Xsl
  7. V nabídce projekt klepněte na příkaz Přidat novou položku. Ze seznamu šablon klepněte na tlačítko Soubor XSLT, pojmenujte soubor Contacts.xslta klepněte na tlačítko Otevřít.
  8. Nahradíte obsah Contacts.xslt následující:
    <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>
  9. V nabídce projekt klepněte na příkaz Přidat novou položku. Ze seznamu šablon klepněte na tlačítko Soubor XSLT, pojmenujte soubor CustOrders.xslta klepněte na tlačítko Otevřít.
  10. Nahradíte obsah CustOrders.xslt následující:
    <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>
  11. V nabídce sestavení klepněte na tlačítko Sestavit řešení.
  12. Spusťte aplikaci Internet Explorer a procházet http://localhost/RTFDemo/Webform1.aspx.
  13. Klepněte na tlačítko Zobrazení informací o kontaktu Chcete-li zobrazit první transformace XML do formátu RTF v aplikaci Word.
  14. Klepněte na tlačítko zpět v aplikaci Internet Explorer.
  15. Klepněte na položku Zobrazit objednávky zákazníka zobrazíte druhé transformace XML do formátu RTF v aplikaci Word.

Poradce při potížích ve formátu RTF

  • Jak je napsána, ukázkový kód
    Oddíl Transform objektu DataSet do RTFformátu RTF proudů přímo do prohlížeče. Alternativně můžete uložit do souboru RTF a přesměrovat na uložený soubor. Chcete-li to provést, nahraďte tyto řádky kódu ve vzorku
    Response.ContentType = "application/msword"Response.ContentEncoding = System.Text.Encoding.Default
    Response.Charset = ""
    xslTran.Transform(xmlDoc, Nothing, Response.Output)
    s:
    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")
    Ukládání ve formátu RTF do souboru tímto způsobem můžete snadno prozkoumat strukturu formátu RTF v souboru pomocí libovolného textového editoru, například programu Poznámkový blok. Ukládání ve formátu RTF do souboru může být užitečné technika řešení potíží, pokud transformace XSL nepřinese očekávané výsledky.
  • Při transformaci do formátu RTF, uvědomte si prezentaci mezery a konce řádků v šablon stylů protože, které mohou ovlivnit interpretace do formátu RTF aplikace Word. Obě ukázky kódu v tomto článku pomocí prvku < xsl:text > , protože nutí všechny prázdné místo informace je zachován.
  • Použití < metoda elementu xsl: Output = "text" > v šablon stylů a ujistěte se, že vaše XML transformaci textu (spíše než XML, což je výchozí výstupní metody). Pokud nezadáte text jako způsob výstupu, pokyny pro zpracování XML může přidán do souboru. Slovo to může zabránit správně interpeting text ve formátu RTF.

Odkazy

Další informace o straně serveru automatizace aplikace Microsoft Word a dalších aplikacích sady Office klepněte na následující číslo článku znalostní báze Microsoft Knowledge Base:
257757 INFO: důležité informace pro automatizaci na straně serveru Office
Další informace o použití formátu RTF v řešeních získáte v následujících článcích znalostní báze společnosti Microsoft:
270906 postupy: použití ASP ke generování dokumentu RTF Formát (RTF) do datového proudu do aplikace Microsoft Word
258513 postupy: hodnotu RichText vložit formátovaný řetězec do aplikace Word s automatizace aplikace Visual Basic
Další informace o transformace XML pomocí Visual Basic .NET klepněte na následující číslo článku znalostní báze Microsoft Knowledge Base:
300934 jak: použít transformaci XSL XML pro datové proudy pomocí Visual Basic .NET
300929 jak: použít transformaci XSL z dokumentu XML dokument XML pomocí jazyka Visual Basic .NET
Vlastnosti

ID článku: 311461 - Poslední kontrola: 20. 1. 2017 - Revize: 1

Váš názor