如何使用 XSL 轉換為伺服器端使用 Excel XML 試算表

文章翻譯 文章翻譯
文章編號: 278976 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

結論

Excel 2002 引入新的 XML 功能,讓開發人員從 XML 試算表 (XMLSS) 格式的工作表擷取已格式化的資料。Range 物件的 Value 屬性會傳回儲存格格式設定和內容中 XMLSS。XMLSS 格式是正確可由 Microsoft XML 剖析器,在執行階段的操作載入的 XML。這項功能的一個潛在的使用方式是將回傳給伺服器應用程式進行處理的 XML 資料。本文將說明一個這類範例的 Excel 活頁簿當做介面的動態伺服器網頁 (ASP) 指令碼會處理從活頁簿中的範圍中擷取的 XML 資料。

本文將引導您完成建立 Excel 活頁簿、 一個 ASP 指令碼和所有訂單處理系統為共同運作的樣式表。整個步驟已指定每個元件的說明和它如何促成整個方案。本文所述範例也使用下載 ; 下載指示,請參閱本文結尾下載 > 一節。

其他相關資訊

這個範例中數個不同的元件運作在一起作為順序處理器:
  • ASP 指令碼。伺服器端元件是採用新訂單的用戶端要求的 ASP 指令碼。指令碼所預期要在特定的 XML 格式的要求。指令碼會從 XML 資訊,它會接收,並將新的順序加入至北風貿易範例資料庫中,藉由使用 ActiveX 資料物件 (ADO)。
  • Excel 活頁簿。用戶端元件是 Excel 活頁簿包含訂單項目的工作表和互動 ASP 指令碼來處理使用者的新訂單的巨集。
  • XSL 樣式表。Excel XMLSS 自訂 ASP 指令碼需要的 XML 格式來轉換樣式表。Excel 巨集載入樣式表,並會轉換到自訂的 XML,以便在 Web 伺服器上發佈到 ASP 指令碼資料之前 XMLSS。

步驟 1: 建立 ASP 訂單處理指令碼

建立一個名為 OrderProc (預設根資料夾是 C:\Inetpub\Wwwroot) 您網頁伺服器的虛擬根資料夾中的新資料夾。OrderProc] 資料夾中建立 [新的檔案命名 OrderEntry.asp 用下面的指令碼]。指令碼會使用範例北風 Access 資料庫,您可能需要修改連接字串 (sConn) 以符合您的 Office 安裝中 Northwind.mdb 至路徑。
<%@ Language="vbscript" CodePage="65001"%>

<%
    Response.Buffer = True
    Response.ContentType = "text/xml"
  
    Dim oDataXML                    'Custom Data XML passed in by caller.
    Dim oConn                       'ADO Connection to Northwind database.
    Dim oOrdersRS, oDetailsRS       'ADO Recordsets for the Orders table and Order Details Table.
    Dim oItems                      'Collection of nodes meeting the match. "Order/Items/Item"
    Dim oItem                       'Single node in oItems.
    Dim sCustID                     'Customer ID for the new order.
    Dim sOrderID                    'Order ID of the newly created record. in Orders table
    Dim sStatus                     'Status of order processing.
    Dim bContinue                   'Flag that indicates whether or not to continue processing the order.

    Const sConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\program files\microsoft office\office10\samples\northwind.mdb"
    On Error Resume Next

    'Load the XML passed into the request.
    Set oDataXML = Server.CreateObject("Microsoft.XMLDOM")
    oDataXML.Load Request
    bContinue = True

    'Obtain the Customer ID. If no customer id is provided, report an error.
    sCustID = oDataXML.selectSingleNode("Order/CustomerID").Text
    If sCustID="" Then
       sStatus = "There is no customer specified for the order"
       bContinue = False
    End If

    'Obtain collection of "items" for this order. If the item count = 0, report an error.
    If bContinue Then
       Set oItems = oDataXML.SelectNodes("Order/Items/Item")
       if oItems.length = 0 Then
          sStatus = "There are no items to process for this order"
          bContinue = False
       End If
    End If

    'Open a connection to the Northwind database.
    If bContinue Then
       Set oConn = CreateObject("ADODB.Connection")
       oConn.Open sConn
       if err.Number <> 0 Then
          sStatus = err.Description
          bContinue = False
       end if

    End If

    'Open the Orders and Order Details tables and add the new records.
    If bContinue Then

       Set oOrdersRS = CreateObject("ADODB.Recordset")
       oOrdersRS.Open "SELECT * FROM Orders", oConn, 2, 3
       Set oDetailsRS = CreateObject("ADODB.Recordset")
       oDetailsRS.Open "SELECT * FROM [Order Details]", oConn, 2, 3

       'Add a new entry in the Orders table.
       oOrdersRS.AddNew
       oOrdersRS.Fields("CustomerID").Value = sCustID
       oOrdersRS.Fields("OrderDate").Value = CDate(Now)
       oOrdersRS.Update
       sOrderID = oOrdersRS.Fields("OrderID").Value
        
       'And a new record for each item in the order XML to the Order Details table.
       If err.number = 0 Then
          For Each oItem In oItems
              oDetailsRS.AddNew
              oDetailsRS.Fields("OrderID").Value = sOrderID
              oDetailsRS.Fields("ProductID").Value = oItem.childnodes(0).Text
              oDetailsRS.Fields("Quantity").Value = CLng(oItem.childnodes(1).Text)
              oDetailsRS.Fields("UnitPrice").Value = CLng(oItem.childnodes(2).Text)
              oDetailsRS.Fields("Discount").Value = 0
              oDetailsRS.Update
          Next
       End If

       if err.Number <> 0 Then
          sStatus = err.Description
       else
          sStatus = "Success"
       end if

       'Close the recordsets and connection.
       oDetailsRS.Close
       oOrdersRS.Close
       oConn.Close

    End If
  
    'Return the resulting XML (the Order status).
    Dim sResult
    sResult = "<?xml version=""1.0""?>"
    sResult = sResult & "<OrderProcessed>" 
    sResult = sResult & "<Status>" & sStatus & "</Status>"
    sResult = sResult & "<OrderID>" & sOrderID & "</OrderID>"
    sResult = sResult & "</OrderProcessed>"
    Response.Write sResult
    Response.End
 
%> 
				
順利處理訂單要求,這個 ASP 指令碼所預期 XML 資料結構如下:

<?xml version="1.0"?>
<Order>
    <CustomerID>BOTTM</CustomerID>
    <Items>
        <Item>
            <ProductID>4</ProductID>
            <Quantity>11</Quantity>
            <Price>20.25</Price>
        </Item>
        <Item>
            <ProductID>18</ProductID>
            <Quantity>2</Quantity>
            <Price>63.7</Price>
        </Item>
    </Items>
</Order>
					
此 XML 將指定的 ID 的 BOTTM"客戶的訂單。順序包含兩個項目: 11 單位的產品識別碼是 4 和 2 單位產品 18 的識別碼。

ASP 指令碼會執行某些錯誤處理,以確保用戶端有提供它的有效順序資訊。用戶端必須提供客戶編號] 和 [至少一個項目 ; 如果不符合這些準則 ASP 指令碼並不處理順序,並傳回錯誤。

ASP 指令碼會傳回 XML 資料所做的順序要求的用戶端。此 XML 指示成功或失敗的訂單處理和也提供 [成功] 的 [訂單編號:

<?xml version="1.0"?>
<OrderProcessed>
    <Status>Success</Status>
    <OrderID>11078</OrderID>
</OrderProcessed>
					

步驟 2: 建立訂單項目在活頁簿介面

  1. 在 Excel,開始新的活頁簿。
  2. 在儲存格 A1、 A3、 B3 和 C3 輸入標籤如下:
    A1:   Customer ID    B1:                C1:
    A2:                  B2:                C2:
    A3:   Product ID     B3:   Quantity     C3:   Price
    					
  3. 選取儲存格 A1:B1。在 [插入] 功能表上指向 [名稱],然後按一下 [建立]。在 [建立名稱] 對話方塊選取 左欄,然後按一下 [確定]。這會建立儲存格 B1 的已定義之名稱 Customer_ID
  4. 選取儲存格 A3:C8。在 [插入] 功能表上指向 [名稱],然後按一下 [建立]。在 [建立名稱] 對話方塊選取 [頂端列],然後按一下 [確定]。這會建立已定義的名稱 Product_ID]、 [數量] 和 [價格 的儲存格 A4:A8、 B4:B8,和 C4:C8 分別。
  5. 按下 ALT + F11 即可啟動 [Visual Basic 編輯器]。
  6. 在 Visual Basic 編輯器,在 [插入] 功能表上按一下 [模組]。程式碼模組中加入下列的巨集:
    Sub ProcessOrder()
    
        Const sFolder = "http://YourWebServer/OrdrProc/"
    
        'Load a new DOMDocument based on the XMLSS of the range A1:C8.
        Dim oRangeXML
        Set oRangeXML = CreateObject("Microsoft.XMLDOM")
        oRangeXML.LoadXML Range("A1:C8").Value(xlRangeValueXMLSpreadsheet)
            
        'Transform the XMLSS to custom XML that the ASP can
        'interpret as a new "order".
        Dim oXSL, oOrderXML
        Set oXSL = CreateObject("Microsoft.XMLDOM")
        oXSL.Load ThisWorkbook.Path & "\OrderEntry.xsl"
        Set oOrderXML = CreateObject("Microsoft.XMLDOM")
        oRangeXML.transformNodeToObject oXSL, oOrderXML
        
        'Submit the XMLSS to the ASP page for processing.
        Set oXMLHTTP = CreateObject("Microsoft.XMLHTTP")
        oXMLHTTP.Open "Post", sFolder  & "/OrderEntry.asp", False
        oXMLHTTP.setRequestHeader "Content-Type", "text/xml; charset=""UTF-8"""
        oXMLHTTP.send oOrderXML
        
        'Retrieve the results of the processing by the ASP page.
        Dim oResult
        Set oResult = CreateObject("Microsoft.XMLDOM")
        oResult.Load oXMLHTTP.responseXML
    
        'Check the returned XML -- if the Status is "Success", fill in the
        'Order # and display a message. If the Status is not "Success",
        'report the error.
        Dim sStatus As String
        sStatus = oResult.selectsinglenode("OrderProcessed/Status").Text
        If sStatus = "Success" Then
            MsgBox "Thank you. Your order number is " & _
                oResult.selectsinglenode("OrderProcessed/OrderID").Text
        Else
            MsgBox sStatus
        End If
    
    End Sub
    					
    注意: 變更 YourWebServer sFolder 常數,您的 Web 伺服器的名稱中。

  7. 關閉 Visual Basic 編輯器],並回到 Excel。
  8. 您先前建立為 Invoice1.xls OrdrProc 資料夾中儲存活頁簿。
"訂單表單 」 是基本上是儲存格 A1:C8。巨集擷取 XMLSS 的訂購表單,並將它載入至新的 DOMDocument 物件。然後將 「 可延伸樣式表語言 (XSL) 樣式表載入至另一個 DOMDocument,並會在 XMLSS 轉換成 ASP 可解譯為新的訂單 「 XML 結構。巨集使用 XMLHTTP 物件來張貼到 ASP 指令碼順序 XML Web 伺服器上。ASP 指令碼處理順序,然後傳回多個 XML 給訂單狀態資訊之巨集。

注意: 設計選擇為轉換至自訂順序 XML XMLSS 的任務指定給用戶端巨集程式碼。也可以張貼到 ASP 指令碼 XMLSS 並讓 ASP 為您執行轉換。

步驟 3: 建立樣式表

OrdrProc] 資料夾中建立名為 OrderEntry.xsl 新檔案],然後貼上下列 XSL 程式碼:
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

  <xsl:template match="/">
    <xsl:pi name="xml">version="1.0"</xsl:pi>

    <Order>
      <CustomerID><xsl:value-of select="Workbook/Worksheet/Table/Row/Cell[NamedCell[@ss:Name='Customer_ID'] $and$ Data[@ss:Type!='Error']]"/></CustomerID>
      <Items>
        <xsl:for-each select="Workbook/Worksheet/Table/Row[Cell[NamedCell[@ss:Name='Product_ID'] $and$ Data[@ss:Type!='Error']]]">
          <Item>
            <xsl:apply-templates/>
          </Item>
        </xsl:for-each>
      </Items>
    </Order>

  </xsl:template>

  <xsl:template match="Cell[NamedCell[@ss:Name='Product_ID']]">
    <ProductID><xsl:value-of select="Data"/></ProductID>
  </xsl:template>

  <xsl:template match="Cell[NamedCell[@ss:Name='Quantity']]">
    <Quantity><xsl:value-of select="Data"/></Quantity>
  </xsl:template>

  <xsl:template match="Cell[NamedCell[@ss:Name='Price']]">
    <Price><xsl:value-of select="Data"/></Price>
  </xsl:template>

</xsl:stylesheet>
				
「 XSL 轉換至自訂順序 XML (如 [步驟 1] 所示),如下所示 XMLSS:
  • XSL 尋找客戶編號由周遊節點階層架構,直到遇到 <cell>節點包含 <namedcell>和 <data>子節點。它會檢查 <namedcell>有 ss:Name 屬性等於 'Customer_ID',而且該 <data>有不等於 '錯誤' 的 ss:Type 屬性。
  • 找不到順序的項目,XSL 會尋找所有與 <cell>節點包含帶有 ss:Name 屬性的 'Product_ID' <namedcell>子節點和具有 ss:Type 屬性不是 '錯誤' <data>子節點的 <row>節點。
  • 對於每個 <row>XSL 決定是項目為訂單 XSL 會使用範本來比對有 ss:Name 屬性的 'Product_ID'、 '數量' 和 '價格' <namedcell>節點。

步驟 4: 執行範例程式碼來處理新的訂單

  1. 回到 Invoice1.xls 在 Excel 中。
  2. 若要模擬順序項目,更新 Sheet1 客戶和產品資訊如下所示:
    A1:   Customer ID    B1:   BOTTM        C1:
    A2:                  B2:                C2:
    A3:   Product ID     B3:   Quantity     C3:   Price
    A4:   4              B4:   11           C4:   20.25
    A5:   18             B5:   2            C5:   63.70
    					
    注意: 如這個範例中,您必須輸入的有效客戶和產品識別碼 ASP 指令碼順利處理順序。

  3. 在 [工具] 功能表上指向 [巨集],然後按一下 [巨集]。在清單中選取 ProcessOrder 巨集],按一下 [執行]。
  4. 如果 ASP 指令碼順利處理順序,您會收到訊息,以新的順序編號。啟動 Microsoft Access 然後開啟北風貿易範例資料庫。您應該會看到新的項目,[訂貨主檔] 資料表中含有傳回從 ASP 的訂單編號。您也會看到 [訂單明細] 資料表中的兩個新項目相同的訂單 ID。結束 Access 並返回 Invoice1.xls 在 Excel 中。
  5. 清除儲存格 B1 中的 [客戶編號,然後再次執行該巨集。這次伺服器是無法處理順序,且會傳回錯誤指出已經提供了沒有客戶編號。

下載

ExcelXML.exe 包含這份文件,以及 Invoice1.xls 的增強的版所述的範例。Invoice2.xls 會使用相同的 ASP 指令碼和 XSL 樣式表作為 Invoice1.xls。不過,Invoice2.xls 示範如保護工作表、 資料驗證及以提供更好用的訂購表單可以使用 VLOOKUP 公式的其他 Excel 功能。

下列檔案是可以從 Microsoft 下載中心 」 下載:
Excelxml.exe
發行日期: 2001 2001年 4 月 3日,

如需有關如何下載 Microsoft 支援檔案的詳細資訊,按一下 [下列面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
119591如何從線上服務取得 Microsoft 支援檔案
Microsoft 已掃描這個檔案有無病毒。Microsoft 使用已張貼檔案的日期中的 [可用的最新病毒偵測軟體。檔案儲存在安全性強化的伺服器上,以避免任何未經授權的更改至檔案。

?考

如需有關如何使用 XML 和 ASP 來建置伺服器端解決方案的詳細資訊,請參閱下列 Microsoft 開發 o 人 h 員 ? 工 u 具 ? 網路 (MSDN) 網站]:
XML 的簡介
http://www.microsoft.com/learning/en/us/syllabi/2500AFinal.mspx

XML 教學課程
http://msdn.microsoft.com/en-us/library/ms950712.aspx

XSL 開發人員手冊 》
http://msdn.microsoft.com/en-us/library/ms862738.aspx

用戶端和伺服器之間傳送 XML
http://msdn.microsoft.com/en-us/library/ms763733.aspx

如需詳細資訊按一下面的文件編號,檢視 「 Microsoft 知識庫 」 中 「 文件:
288215資訊: Excel 2002 和 XML
285891如何使用 Visual Basic 或 ASP 建立 XML 試算表的 Excel 2002
288130如何使用 ASP 來進行用戶端顯示建置試算表 XML
(保留所有的權限 c) Microsoft Corporation 2001。Lori B.Turner,Microsoft 公司所佔的比重。

屬性

文章編號: 278976 - 上次校閱: 2007年1月29日 - 版次: 4.8
這篇文章中的資訊適用於:
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Excel 2002 Standard Edition
關鍵字:?
kbmt kbdownload kbdownload kbfile kbhowto KB278976 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:278976
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