【问题标题】:How to read excel xml spreadsheet data in Classic ASP如何在经典 ASP 中读取 excel xml 电子表格数据
【发布时间】:2017-07-28 10:15:01
【问题描述】:

我认为这将是一个简单的 xml 加载和循环,但由于某种原因,我无法从 Excel XML 电子表格中读取任何内容。

Excel 电子表格的内容,看起来是标准化的输出,如下所示:

<?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>

等等等等

读到 byTagName 不是最好的方法,我首先尝试了以下单节点代码:

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

但绝对没有任何反应。

所以我回到了久经考验的信任 byTagName 并尝试了以下方法:

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

oRows.length 反馈为零

我似乎无法进入 DOM,即使它是标准的 Excel XML 电子表格格式。

如果有人能解释我如何读取行并提取必要的数据值,我将不胜感激。

问候

汤姆

【问题讨论】:

  • Tom - 您可能希望将其加载为文本,将其包装在 ... 之类的内容中,然后尝试将其作为 XML 加载到 MSXML 中。它可能会与两个顶级节点混淆。
  • 嗨 VWombat - 发现问题完全与命名空间有关。这部分在网络上的记录似乎真的很差
  • Tom - 那么为什么不为你自己的问题写一个答案呢。也许这将有助于增加文档库?
  • 会的。仍在掌握 Stack 的工作原理 :)

标签: xml excel asp-classic spreadsheet


【解决方案1】:

设法发现这一切都与命名空间有关。

通过添加以下行:

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'"

然后我可以如下引用 xml 中的标签:

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

然后就可以开始 XML 解析了!! :0)

问候

汤姆

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多