当前位置: 首页 > 知识库问答 >
问题:

Excel XML导入为NULL值创建名为NULL的额外列

徐翔
2023-03-14

我使用Excel 2010/VBA/XML和DOMDocument60解析器在Oracle中生成数据报告。我对nulls有问题。Oracle在xsql查询中支持null indicator=“yes”,以确保返回的记录集中包含null字段。如果字段有一个值,则XML如下所示:<代码>

我的代码调用Web服务进行查询:

Dim XML_HTTP As New MSXML2.XMLHTTP60: Call XML_HTTP.Open("POST", QUERY_URL, False): Call XML_HTTP.send

并检索XML结果:

Dim XML_OUTPUT As DOMDocument60: Set XML_OUTPUT = XML_HTTP.responseXML

它保存文件:

XML_OUTPUT.Save (FILE_PATH) 

然后从保存的文件中加载电子表格:

Call DestinationWorksheet.Parent.XmlImport(FILE_PATH, Nothing, True, DestinationWorksheet.Range("A1"))

它用XML数据填充Excel电子表格。

如果像<代码>

我尝试使用xsql设置null indicator=“no”,这消除了null列,但它有一个不同的,不可接受的问题:动态构建的列顺序,这样,如果第一条XML记录表示具有null的Oracle记录,则null字段将从XML中排除,并且仅在遇到包含这些字段的记录时才添加到Excel列列表中,在这种情况下,这些字段将添加到列列表的末尾。

我也尝试过更换

有人知道如何让Oracle使用语法吗


共有1个答案

姚新霁
2023-03-14

考虑使用XSLT(根据最终使用需要重新构造XML文件的声明性编程语言)来删除NULL属性。VBA可以将XSLT处理器用于Microsoft XML对象。所需的XSLT非常简单明了,其中包括身份转换以原样复制所有内容(节点和属性),然后在NULL上运行空模板匹配以删除文档中出现的任何属性。

XSLT(嵌入以下VBA字符串)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" />

  <!-- Identity transform -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@NULL">    
  </xsl:template>

</xsl:stylesheet>

VBA(作为子程序或函数合并到您的项目中,甚至将Oracle XML文件路径作为参数传递)

Sub TransformXML()

    Dim xmlDoc As Object, xslDoc As Object, newDoc As Object

    Set xmlDoc = CreateObject("MSXML2.DOMDocument")
    Set xslDoc = CreateObject("MSXML2.DOMDocument")
    Set newDoc = CreateObject("MSXML2.DOMDocument")

    xmlDoc.Load "Original.xml"
    xmlDoc.async = False            

    ' EMBEDDED XSLT ' 
    xslDoc.LoadXML "<?xml version=" & Chr(34) & "1.0" & Chr(34) & "?>" _
            & "<xsl:stylesheet version=" & Chr(34) & "1.0" & Chr(34) _
            & "                xmlns:xsl=" & Chr(34) & "http://www.w3.org/1999/XSL/Transform" & Chr(34) & ">" _
            & "<xsl:strip-space elements=" & Chr(34) & "*" & Chr(34) & " />" _
            & "<xsl:output method=" & Chr(34) & "xml" & Chr(34) & " indent=" & Chr(34) & "yes" & Chr(34) & "" _
            & "            encoding=" & Chr(34) & "UTF-8" & Chr(34) & "/>" _
            & " <xsl:template match=" & Chr(34) & "node() | @*" & Chr(34) & ">" _
            & "  <xsl:copy>" _
            & "   <xsl:apply-templates select=" & Chr(34) & "node() | @*" & Chr(34) & " />" _
            & "  </xsl:copy>" _
            & " </xsl:template>" _
            & "<xsl:template match=" & Chr(34) & "@NULL" & Chr(34) & ">" _
            & "</xsl:template>" _
            & "</xsl:stylesheet>"

    xslDoc.async = False
    xmlDoc.transformNodeToObject xslDoc, newDoc
    newDoc.Save "OutputXML.xml"    ' READY FOR FINAL IMPORT '        

    MsgBox "Successfully transformed XML!", vbInformation

    Set xmlDoc = Nothing
    Set xslDoc = Nothing
    Set newDoc = Nothing

End Sub
 类似资料:
  • 问题内容: 我有一个表,其中有一个带有默认值的列: 有一个存储过程插入到: 您可以看到,我必须有条件地分支以便我的插入使用默认值(如果为null)。仅一列就可以了,但是请考虑是否有更多列-语法可能很笨拙。 我是否可以使用一种语法来指定插入值应该返回默认值(如果为null)?我尝试了以下操作,但可以理解的是语法错误: 问题答案:

  • 我正在尝试测试我的应用程序,我已经尝试解决它三天了,我寻找stackoverflow,但仍然无法解决它。我的问题是,Autowired始终为空,即使我将所有建议导入为空 或者 始终为null并给出此错误

  • 我试图使用Sqoop import-free-form查询将Oracle DB数据导入HDFS,方法是使用Oozie调度器使用“-as avrodatafile”连接两个表。以下是我的工作流程的内容。xml: Oozie作业成功运行,并在HDFS上的目录 /apps/hive/warehouse/loc_avro_import下创建Avro文件以及_SUCCESS标志。然后我使用以下Hive脚本在

  • 问题内容: 我有一个动态编写的查询(通过Joomla的OO PHP)将一些值插入MySQL数据库。用户填写的表单上有一个用于美元金额的字段,如果他们将该字段留空,我希望输入系统的值为NULL。我已经在查询运行时将查询写到了错误日志中。这是查询的样子: 但是,当我查看数据库表时,尽管ActivatedDT正确设置为NULL,但BalanceInit和BalanceCurrent均为0.00。Acti

  • 我正在创建一个spring cloud Kafka流应用程序。我有一个输入主题和一个输出主题,我试图使用KStream.map函数对输入主题应用KStream键值转换操作 问题如果转换后的值为null,该函数将抛出IllegalArgumentException 我的问题是: 1:异常的原因?尽管文档中说:“忽略具有空键或空值的输入记录” 2:处理无状态/有状态操作中异常的最佳实践?一个try/c

  • 问题内容: 之间有什么区别 和 为何后者不起作用? 问题答案: 在SQL中,之间的比较值,任何其他值(包括另一种使用比较操作符(如),,,等)将导致,这被认为是一个where子句的目的(严格来说,它的“不true”,而不是“false”,但效果相同)。 原因是a的意思是“未知”,因此与a进行任何比较的结果也都是“未知”。因此,通过编码您不会对行造成任何影响。 SQL提供了一种特殊的语法来测试列是否