2017-07-28 1 views
0

Je pensais que ce serait une simple opération de chargement et de bouclage XML, mais pour une raison inconnue, je ne peux rien lire dans une feuille de calcul Excel Excel.Comment lire les données de feuille de calcul Excel xml dans ASP Classic

Le contenu de la feuille de calcul Excel, qui semble être une sortie normalisée, est la suivante:

<?mso-application progid="Excel.Sheet"?> 
<Workbook 
    xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
    xmlns:o="urn:schemas-microsoft-com:office:office" 
    xmlns:x="urn:schemas-microsoft-com:office:excel" 
    xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
    xmlns:html="http://www.w3.org/TR/REC-html40" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    xmlns:user="urn:my-scripts"> 
    <DocumentProperties 
     xmlns="urn:schemas-microsoft-com:office:office">... 
    </DocumentProperties> 
    <OfficeDocumentSettings 
     xmlns="urn:schemas-microsoft-com:office:office">... 
    </OfficeDocumentSettings> 
    <ExcelWorkbook 
     xmlns="urn:schemas-microsoft-com:office:excel">... 
    </ExcelWorkbook> 
    <Styles>...</Styles> 
    <Worksheet ss:Name="Sheet1" ss:Protected="1"> 
     <Names> 
      <NamedRange ss:Name="Print_Titles" ss:RefersTo="=Sheet1!C2,Sheet1!R7"/> 
     </Names> 
     <Table ss:ExpandedColumnCount="34" ss:ExpandedRowCount="32" x:FullColumns="1" x:FullRows="1" ss:DefaultRowHeight="13.2"> 
      <Column ss:Hidden="1" ss:Width="175.2"/> 
      <Column ss:Width="250.20000000000002"/> 
      <Column ss:Width="60" ss:Span="31"/> 
      <Row ss:AutoFitHeight="0" ss:Height="150" ss:StyleID="s67">...</Row> 
      <Row ss:Height="15"> 
       <Cell ss:StyleID="s69"> 
        <Data ss:Type="String">W89231</Data> 
       </Cell> 
       <Cell ss:StyleID="s70"> 
        <Data ss:Type="String">Tom Brown</Data> 
        <NamedCell ss:Name="Print_Titles"/> 
       </Cell> 
       <Cell ss:StyleID="s69"> 
        <Data ss:Type="String">1E+</Data> 
       </Cell> 
       <Cell ss:StyleID="s69"> 
        <Data ss:Type="String">1m</Data> 
       </Cell> 

etc etc

Après avoir lu que byTagName est pas la meilleure méthode que j'essayé ce qui suit code singlenode d'abord:

strFilename = "1B.xml" 
Set oXMLDoc = Server.CreateObject("MSXML2.DOMDocument.6.0") 
oXMLDoc.async = False 
oXMLDoc.Load (Server.MapPath(strFilename)) 
Set NodeList = oXMLDoc.documentElement.selectNodes("Workbook/Worksheet") 
For Each Node In NodeList 
Response.Write Node.selectSingleNode("row/cell/data/text()") 
Next 

Mais absolument rien ne se passe.

Je suis donc retourné à la byTagName éprouvée et essayé les suivantes:

strFilename = "1B.xml" 
Set oXMLDoc = Server.CreateObject("MSXML2.DOMDocument.6.0") 
oXMLDoc.async = False 
oXMLDoc.Load (Server.MapPath(strFilename)) 
Set oRows = oXMLDoc.documentElement.getElementsByTagName("Row") 
Response.Write oRows.length 

Les commentaires de oRows.length est égal à zéro

Je ne peux pas sembler entrer dans les DOM, même si c'est un format de feuille de calcul Excel standard XML.

Je serais très reconnaissant si quelqu'un pouvait expliquer comment je peux lire les lignes et extraire les valeurs de données nécessaires.

Cordialement

Tom

+0

Tom - vous pouvez le charger en tant que texte, envelopper que quelque chose comme ... et essayez de charger que XML dans MSXML. Il est peut-être confondu avec les deux nœuds de niveau supérieur. –

+1

Salut VWombat - trouvé le problème était tout à faire avec les espaces de noms. Cette partie semble vraiment mal documentée sur le web –

+1

Tom - pourquoi ne pas écrire une réponse à votre propre question alors. Peut-être que cela aidera à augmenter le pool de documentation? –

Répondre

1

Réussi à savoir que tout est sur les espaces de noms.

En ajoutant les lignes ci-dessous:

Set oXMLDoc = Server.CreateObject("MSXML2.DOMDocument.6.0") 
oXMLDoc.setProperty "SelectionLanguage", "XPath" 
oXMLDoc.setProperty "SelectionNamespaces", "xmlns:myns='urn:schemas-microsoft-com:office:spreadsheet' xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:x='urn:schemas-microsoft-com:office:excel' xmlns:ss='urn:schemas-microsoft-com:office:spreadsheet' xmlns:html='http://www.w3.org/TR/REC-html40' xmlns:msxsl='urn:schemas-microsoft-com:xslt' xmlns:user='urn:my-scripts'" 

Je pourrais alors référencer les balises dans le code XML comme suit:

Set oXMLRows = oXMLDoc.selectNodes("/myns:Workbook/myns:Worksheet/myns:Table/myns:Row") 

et l'analyse syntaxique XML peut alors commencer !! : 0)

Cordialement

Tom