【发布时间】:2017-04-20 13:30:22
【问题描述】:
我正在处理在 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>"
任何关于缩短运行时间的建议将不胜感激。
【问题讨论】:
-
为什么
DoEvents在你的j循环中?你能试着把它拿出来吗? -
只是为了不让excel在方法运行的时候挂掉,我确实试过把它拿出来,但没看出有什么区别。
-
excel中的某些输入数据是否具有完全相同或相似的数据类型?
-
通过在一个循环中将片段连接在一起来构建大字符串可能会很慢。尝试(例如)codereview.stackexchange.com/questions/67596/… 构建您的字符串。
-
您的数据是否总是以第一列的日期开头,然后是其他类型的数据?就像学生考勤表一样?
标签: sql-server xml vba excel