Excel vba xml解析性能

2023-12-03

我正在努力在 Excel 中获取一些输入数据,将其解析为 xml 并使用它来运行 SQL 存储过程,但我遇到了 xml 解析的性能问题。输入表看起来像这样:

Dates_|_Name1_Name2_Name3_..._NameX
Date1 |
Date2 |
. . . |
Date1Y|

我有一些代码可以循环遍历每个单元格并将数据解析为 xml 字符串,但即使对于大约 300 x 300 的网格,执行也需要大约五分钟的时间,我希望使用可以的数据集长达数千列。我尝试了一些方法来帮助加快速度,例如将数据读入 Variant,然后进行迭代或排除 DoEvents,但我无法提高速度。这是问题所在的代码:

Dim lastRow As Long
lRows = (oWorkSheet.Cells(Rows.Count, 1).End(xlUp).Row)
Dim lastColumn As Long
lCols = (oWorkSheet.Cells(1, Columns.Count).End(xlToLeft).Column)
Dim sheet As Variant
With Sheets(sName)
  sheet = .Range(.Cells(1, 1), .Cells(lRows, lCols))
End With
ReDim nameCols(lCols) As String

...

resultxml = "<DataSet>"
For i = 2 To rows
    resultxml = resultxml & "<DateRow>"

    For j = 1 To cols
        If Trim(sheet(i, j)) <> "" Then
            lResult = "<" & nameCols(j) & ">"
            rResult = "</" & nameCols(j) & ">"
            tmpValue = Trim(sheet(i, j))
            If IsDate(tmpValue) And Not IsNumeric(tmpValue) Then
                If Len(tmpValue) >= 8 Then
                    tmpValue = Format(tmpValue, "yyyy-mm-dd")
                End If
            End If
            resultxml = resultxml & lResult & tmpValue & rResult
            DoEvents
        End If
    Next j
    resultxml = resultxml & "</DateRow>"
Next i

resultxml = resultxml & "</DataSet>"

任何有关缩短运行时间的建议将不胜感激。


考虑使用MSXML,一个符合 W3C 的 XML API 综合库,您可以使用它通过 DOM 方法构建 XML(createElement, appendChild, setAttribute) 而不是连接文本字符串。 XML 不完全是文本文件,而是具有编码和树结构的标记文件。 Excel 通过引用或后期绑定配备了 MSXML COM 对象,并且可以从 Excel 数据迭代构建树,如下所示。

下面有 300 行 x 12 列的随机日期,甚至不需要一分钟(实际上是单击宏后几秒钟),它甚至使用嵌入式 XSLT 样式表漂亮地打印带有换行符和缩进的原始输出(如果您不漂亮地打印, MSXML 将文档输出为一长的连续行)。

Input

Name Date Spreadsheet

VBA (当然与实际数据一致)

Sub xmlExport()
On Error GoTo ErrHandle
    ' VBA REFERENCE MSXML, v6.0 '
    Dim doc As New MSXML2.DOMDocument60, xslDoc As New MSXML2.DOMDocument60, newDoc As New MSXML2.DOMDocument60
    Dim root As IXMLDOMElement, dataNode As IXMLDOMElement, datesNode As IXMLDOMElement, namesNode As IXMLDOMElement
    Dim i As Long, j As Long
    Dim tmpValue As Variant

    ' DECLARE XML DOC OBJECT '
    Set root = doc.createElement("DataSet")
    doc.appendChild root

    ' ITERATE THROUGH ROWS '
    For i = 2 To Sheets(1).UsedRange.Rows.Count

        ' DATA ROW NODE '
        Set dataNode = doc.createElement("DataRow")
        root.appendChild dataNode

        ' DATES NODE '
        Set datesNode = doc.createElement("Dates")
        datesNode.Text = Sheets(1).Range("A" & i)
        dataNode.appendChild datesNode

        ' NAMES NODE '
        For j = 1 To 12
            tmpValue = Sheets(1).Cells(i, j + 1)
            If IsDate(tmpValue) And Not IsNumeric(tmpValue) Then
                Set namesNode = doc.createElement("Name" & j)
                namesNode.Text = Format(tmpValue, "yyyy-mm-dd")
                dataNode.appendChild namesNode
            End If
        Next j

    Next i

    ' PRETTY PRINT RAW OUTPUT '
    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:stylesheet>"

    xslDoc.async = False
    doc.transformNodeToObject xslDoc, newDoc
    newDoc.Save ActiveWorkbook.Path & "\Output.xml"

    MsgBox "Successfully exported Excel data to XML!", vbInformation
    Exit Sub

ErrHandle:
    MsgBox Err.Number & " - " & Err.Description, vbCritical
    Exit Sub

End Sub

Output

<?xml version="1.0" encoding="UTF-8"?>
<DataSet>
    <DataRow>
        <Dates>Date1</Dates>
        <Name1>2016-04-23</Name1>
        <Name2>2016-09-22</Name2>
        <Name3>2016-09-23</Name3>
        <Name4>2016-09-24</Name4>
        <Name5>2016-10-31</Name5>
        <Name6>2016-09-26</Name6>
        <Name7>2016-09-27</Name7>
        <Name8>2016-09-28</Name8>
        <Name9>2016-09-29</Name9>
        <Name10>2016-09-30</Name10>
        <Name11>2016-10-01</Name11>
        <Name12>2016-10-02</Name12>
    </DataRow>
    <DataRow>
        <Dates>Date2</Dates>
        <Name1>2016-06-27</Name1>
        <Name2>2016-08-14</Name2>
        <Name3>2016-07-08</Name3>
        <Name4>2016-08-22</Name4>
        <Name5>2016-11-03</Name5>
        <Name6>2016-07-28</Name6>
        <Name7>2016-08-23</Name7>
        <Name8>2016-11-01</Name8>
        <Name9>2016-11-01</Name9>
        <Name10>2016-08-11</Name10>
        <Name11>2016-08-18</Name11>
        <Name12>2016-09-23</Name12>
    </DataRow>
    ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Excel vba xml解析性能 的相关文章

随机推荐

  • 如何在Python中实现异或链表?

    鉴于Python对象只是对实际内存对象的引用并且 无法检索对象的内存地址 是否可以在Python中实现XOR链表 如果是的话怎么办 您无法在 Python 中构建 XOR 链表 因为 Python 不允许您弄乱指针中的位 无论如何你都不想实
  • 检查数组 VBA 的值

    我试图确保我构建的数组具有我期望的值 Cards 数组应该填充 Shoe 数组 当我计算数组的值时 我得到了预期的 104 但是当我将这些值粘贴到 Excel 工作表中时 只填充了 13 个单元格 有没有一种简单的方法来检查数组的内容 Su
  • 更新 JPA 或 Hibernate 中的多对多关系

    我有两个Entity就像下面 Entity Table name USER public class User Id private Long id private String name ManyToMany fetch FetchTyp
  • 在ggplot2中的条形图顶部添加不带标签的刻度

    正如标题所说 我想在 ggplot2 条形图的顶部添加刻度 输出看起来像这样 由于机密信息隐藏了实际情节 ggplot2 中有一个函数可以做到这一点吗 我已经在链接中调整了巴蒂斯特的解决方案分面时显示每个子图的 y 轴 想法 我认为 是提取
  • 这是在 JavaScript 中检查有效日期的好方法吗?

    请纠正或解释我的过度简化是错误的 因为我不是 JavaScript 专家 但我只需要知道一个对象是否是有效日期 这仅来自用户输入 即文本框 var is valid date function date try var d new Date
  • 如何从 python 更改 Linux 用户密码

    我在从 python 更改 Linux 用户密码时遇到问题 我已经尝试了很多方法 但无法解决问题 这是我已经尝试过的示例 sudo password是sudo的密码 sudo command是我希望系统运行的命令 user 是从列表中获取的
  • 什么是跳表?

    有人可以解释一下跳转表的机制以及为什么嵌入式系统需要它吗 跳转表可以是函数指针数组 也可以是机器代码跳转指令数组 如果您有一组相对静态的函数 例如系统调用或类的虚拟函数 那么您可以创建此表一次并使用数组的简单索引来调用函数 这意味着检索指针
  • R 中的分桶数据

    我正在尝试创建一个函数 根据给定的向量确定某个值进入哪个存储桶 所以我的函数有两个输入 一个确定存储桶断点的向量 例如 如果向量是 1 4 5 10 则桶将 我现在的做法是首先检查输入数字是否大于向量的最大元素或小于向量的最小元素 如果没有
  • 如何在拖动开始之前缓存整个图层并在拖动结束时将其恢复回来?

    我目前正在尝试稍微加快我的移动设备网络应用程序的速度 但现在我陷入了最重要的部分 缓存 如何在用户开始拖动之前缓存整个图层 并在拖动操作停止时将其恢复为可用的 Kinetic Nodes 现在我开始缓存 stage on mousedown
  • 图像分割结果中的噪声

    我正在做一个基于深度卷积神经网络的图像分割任务 网络结构来自这张纸 其结构如图所示 FCN在图像分割中的应用 该网络的设计基于全卷积网络 and DCAN 该数据集为腺体分割挑战赛公开基准数据集2015年米卡展会 也称为 Warwick Q
  • 为什么结构体中的双精度成员未在 8 字节边界上对齐?

    这是关于内存对齐的 在下面的代码中 我预计结构内 b 的偏移量为 8 32 位机器 看here 从而 使b总是发生在缓存行内 然而 事实并非如此 会员b在全局对象中struct test1似乎是对齐的 我不确定这是偶然的还是编译器故意这样做
  • 从 byte[] 返回文件下载

    这段代码 string xml XmlHelper ToXml queryTemplate byte xmlb StringHelper GetBytes xml var cd new System Net Mime ContentDisp
  • 如何在不使用 JSF 中隐藏标签的情况下将 javascript 内的值传递给托管 bean 属性?

    我们想知道是否可以在 Facelets 中的 javascript 方法内获取托管 bean 属性值 或者将 javascript 值传递给托管 bean 属性但不使用隐藏标记 当我们搜索它们时 我们看到的都是关于使用html隐藏标签或隐藏
  • 实体框架多对多查询:未生成导航属性

    我有两张桌子User and UserRole它们是使用链接表连接的UserInRole 当我生成实体模型时 由于某种原因 实体UserInRole没有生成 从图中可以看出 实体框架理解之间存在多对多关系User and UserRole
  • 如何细分/细化 xarray 数据集中的维度?

    Summary 我有一个数据集 其收集方式使得维度最初不可用 我想获取本质上是一大块无差别的数据 并为其添加维度 以便可以对其进行查询 子集化等 这是以下问题的核心 这是我拥有的 xarray 数据集
  • 如何将 Activator.CreateInstance 返回的对象转换为它转换的类型?

    在下面的代码中 是否可以将 x 转换为您要传递的类型Activator CreateInstance提前不知道是什么 我尝试传入typeof 但这行不通 var testClasses AppDomain CurrentDomain Get
  • 使用java识别文件扩展名

    我在数据库中有不同格式的文件 我想复制到我的本地机器 我如何识别文件格式 doc xls 等 问候 克里希纳 谢谢 您提供建议 根据您的建议 我编写了代码并且已经完成 请查看我的博客 我在这里发布了代码 http muralie39 wor
  • 在 Win32 上,如何使用 Perl、Python 或 Ruby(或 C)检测是否按下了 Left Shift 或 Right ALT?

    在 Win32 上 我想知道如何使用 Perl Python 或 Ruby 甚至在 C 中 检测是否按下了 Left Shift 或 Right ALT 不仅仅是当前窗口 而是整个全局环境 示例 当我输入文档时 我可以按右 ALT 启动用
  • 在没有 root 访问权限的服务器上安装 Docker 二进制文件

    我有一个由提供商提供的服务器 没有任何根访问权限 无法在 etc 或 var lib docker 中编写脚本 Docker 未安装 我的想法是在目录中安装并运行 docker 二进制文件 我将使用 shell 脚本安装 docker 该脚
  • Excel vba xml解析性能

    我正在努力在 Excel 中获取一些输入数据 将其解析为 xml 并使用它来运行 SQL 存储过程 但我遇到了 xml 解析的性能问题 输入表看起来像这样 Dates Name1 Name2 Name3 NameX Date1 Date2