如何使用 ASP.NET 或 Visual Basic .NET 将 XML 转换为 Microsoft Word 2002 的 RTF 格式

文章翻译 文章翻译
文章编号: 311461 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

按照此分步指南执行操作,可使用 Visual Basic .NET 从可扩展标记语言 (XML) 生成 RTF 格式。

RTF 格式是一类基于文本的格式,用于对格式化文本、文档布局和图形进行编码。此格式通常与 Microsoft Word 一起使用。由于 RTF 格式是基于文本的,因此可使用代码轻松生成此格式。如果您希望将 XML 数据在 Word 中作为目录/列表或邮件合并类型文档显示,那么对您来说,将 XML 数据转换为 RTF 流可能会是一个理想的解决方案。实际上,如果您开发的解决方案是在 Web 服务器上生成文档,则使用基于文本的格式(如 HTML 或 RTF)生成这些文档比使用服务器端 Word 自动化生成文档更可取。

本文提供了示例代码和分步说明,以便通过以下几种方法将 XML 转换为 RTF 以在 Word 中显示:
  • 将 RTF 保存到一个文件中,然后在 Word 中打开此文件。
  • 使用 Windows 剪贴板将 RTF 传输到 Word。
  • 将 RTF 从 ASP.NET Web 应用程序中流式传输到 Microsoft Internet Explorer 中承载的 Word。

RTF 规范

RTF 规范是生成 RTF 兼容的文本文件的公用规范。可以使用下面 Microsoft Developer Network (MSDN) 网站的文档规范作为资源,来帮助您创建自己的 RTF 文件。不过,该规范按“原样”提供,并且 Microsoft 技术支持部门不会对其提供任何支持。单击以下 RTF 规范链接:
RTF 规范,版本 1.6

RTF 规范,版本 1.7

将 XML 转换为 RTF

可以从任何源中获取有效的 XML,并将其转换为 RTF。以下过程阐释如何将自定义 XML 转换为 RTF(保存到一个文件中或复制到剪贴板)。
  1. 创建一个新的 Visual Basic .NET Windows 应用程序。此时已为您创建 Form1。
  2. 向 Form1 中添加两个按钮控件。
  3. 在“视图”菜单上,单击“代码”。
  4. 在代码窗口的顶部,在 Form1 类实现之前插入以下内容:
    Imports System.Xml
    Imports System.Xml.Xsl
    Imports System.IO
  5. 在 Form1 类实现中添加以下代码(在 End Class 之前):
        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. 向项目中添加 XML 文件:
    1. 在“项目”菜单上,单击“添加新项”。
    2. 在模板列表中,单击“XML 文件”。
    3. 键入名称 Dictionary.xml,然后单击“打开”。
    4. 在 Dictionary.xml 的内容之后追加以下内容:
      <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. 向项目中添加 XSLT 文件:
    1. 在“项目”菜单上,单击“添加新项”。
    2. 在模板列表中,单击“XSLT 文件”。
    3. 键入名称 Dictionary.xslt,然后单击“打开”。
    4. 用下列内容替换 Dictionary.xslt 的内容:
       
      <?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. 按 F5 生成并运行程序。
  9. 单击“到文件”以将转换后的 XML 保存到一个文件 (Dictionary.rtf)。可以在 Word 中打开此 RTF 文件以检查转换结果。
  10. 单击“到剪贴板”以将转换后的 XML 复制到 Windows 剪贴板。然后可以将剪贴板中的内容粘贴到新的或现有的 Word 文档中以查看结果。

将 DataSet 转换为 RTF

利用 Visual Basic .NET,可以轻松对数据集执行转换操作。此过程为您演示如何从示例 Northwind 数据库中获取相关数据并将其转换为 RTF。演示了两种不同的转换:一个是简单的 RTF 文档,该文档列出客户联系信息;另一个是稍微复杂点的 RTF 文档,该文档以邮件合并类型格式显示客户的订单信息。
  1. 启动新的 Visual Basic ASP.NET Web 应用程序,并将其保存到 http://localhost/RTFDemo

    此时已为您创建 WebForm1
  2. 向 WebForm1 中添加两个按钮控件。
  3. 在“视图”菜单上,单击“代码”。
  4. Page_Load 函数添加以下代码:
            Button1.Text = "View Contact Information"
            Button2.Text = "View Customer Orders"
  5. WebForm1 类添加以下函数。

    注意:下列代码假定您已在 localhost 上安装 SQL Server。如果您必须使用另一台计算机,请相应地更改连接字符串的数据源成员。
        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. 在 WebForm1.aspx.vb 的顶部,在 WebForm1 类实现之前添加以下代码行:
    Imports System.Data.SqlClient
    Imports System.Xml
    Imports System.Xml.Xsl
  7. 在“项目”菜单上,单击“添加新项”。在模板列表中,单击“XSLT 文件”,将此文件命名为 Contacts.xslt,然后单击“打开”。
  8. 用下列内容替换 Contacts.xslt 的内容:
    <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. 在“项目”菜单上,单击“添加新项”。在模板列表中,单击“XSLT 文件”,将此文件命名为 CustOrders.xslt,然后单击“打开”。
  10. 用下列内容替换 CustOrders.xslt 的内容:
    <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. 在“生成”菜单上,单击“生成解决方案”。
  12. 启动 Internet Explorer,然后浏览到 http://localhost/RTFDemo/Webform1.aspx。
  13. 单击“View Contact Information”(查看联系人信息)以在 Word 中查看从 XML 到 RTF 的第一次转换。
  14. 在 Internet Explorer 中单击“后退”。
  15. 单击“View Customer Orders”(查看客户订单)以在 Word 中查看从 XML 到 RTF 的第二次转换。

RTF 疑难解答提示

  • 将 DataSet 转换为 RTF 部分中编写的示例代码将 RTF 直接流式传输到浏览器。或者,可以将 RTF 保存到一个文件中,然后重定向到保存的文件。为此,请将示例中的以下代码行
    Response.ContentType = "application/msword"
    Response.ContentEncoding = System.Text.Encoding.Default
    Response.Charset = ""
    xslTran.Transform(xmlDoc, Nothing, Response.Output)
    替换为:
    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 存储到一个文件中后,可以使用任何文本编辑器(如“记事本”)轻松检查该文件中 RTF 的结构。当 XSL 转换没有生成预期结果时,将 RTF 存储到一个文件中有助于进行疑难解答。
  • 当转换为 RTF 时,注意样式表中显示空白和回车的方式,因为这会影响 Word 解释 RTF 的方式。本文中的两个代码示例使用的都是 <xsl:text> 元素,因为该元素可以强制保留其内部的任何空白信息。
  • 在样式表中使用 <xsl:output method="text">,可确保将 XML 转换为文本(而不是 XML,这是默认输出方法)。如果不指定 text 作为输出方法,则可能会在文件中添加 XML 处理指令。这会阻止 Word 将文本正确地解释为 RTF。

参考

有关服务器端 Microsoft Word 和其他 Office 应用程序的自动化的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
257757 服务器端 Office 自动化注意事项
有关在解决方案中使用 RTF 的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
270906 如何使用 ASP 生成 RTF 文档以将数据流传送到 Microsoft Word
258513 如何使用 Visual Basic 自动化将 RichText 格式的字符串粘贴到 Word 中
有关使用 Visual Basic .NET 来转换 XML 的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
300934 如何使用 Visual Basic .NET 将 XSL 转换应用于 XML 以进行流式处理
300929 如何使用 Visual Basic .NET 将 XSL 转换从一个 XML 文档应用到另一个 XML 文档

属性

文章编号: 311461 - 最后修改: 2008年5月23日 - 修订: 6.2
这篇文章中的信息适用于:
  • Microsoft Office Word 2007
  • Microsoft Office Word 2003
  • Microsoft Visual .NET 2002 标准版
  • Microsoft ASP.NET 1.0
  • Microsoft Word 2002 标准版
  • Microsoft .NET Framework Class Libraries 1.0
  • Microsoft Visual Basic .NET 2003 标准版
  • Microsoft ASP.NET 1.1
关键字:?
kbhowto KB311461
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

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