背景故事
我正在尝试使用 VBA 从 Excel 工作表 XML 文件中删除多个节点。这些节点对应于在工作簿中的工作表上完成的过滤,我正在尝试删除过滤。
我删除过滤的原因是由于一些与过滤相关的损坏。我可以在 Excel 修复后打开文件,但它以“已修复”模式打开文件,保存起来很麻烦。修复对话框显示以下内容:
删除的记录:从/xl/worksheets/sheet2.xml 部分排序
为什么它说“排序”我不确定。我很肯定腐败与工作表的过滤有关。然后我的想法是删除这些节点,以便 Excel 不必修复文件......
我试过的
我已经设法打开 XML 文件并删除了相应的节点。请参阅以下代码:
Public Sub DeleteXMLNodes()
Dim oXMLDoc As MSXML2.DOMDocument
Dim sFileName As String
Dim xlFolder As String
xlFolder = "C:\Users\Documents\ReadOnly Testing3\xl\worksheets\"
sFileName = "Sheet2.xml"
If Len(xlFolder) = 0 Then
GetXMLFromFile = ""
Else
Set oXMLDoc = New MSXML2.DOMDocument
oXMLDoc.Load xlFolder & sFileName
Dim nodeList As IXMLDOMNodeList
Dim node As MSXML2.IXMLDOMNode
Dim deleteMe As IXMLDOMNode
Dim oldChild As IXMLDOMNode
Dim i As Long
'Retrieve the node list by using an XPath query.
'Set nodeList = oXMLDoc.SelectNodes("/worksheet/sheetData/row/c")
Set nodeList = oXMLDoc.SelectNodes("/worksheet/autoFilter/filterColumn")
For i = 1 To nodeList.Length
Set deleteMe = oXMLDoc.SelectSingleNode( _
"/worksheet/autoFilter/filterColumn[" & i & "]")
Set oldChild = deleteMe.ParentNode.RemoveChild(deleteMe)
Next
oXMLDoc.Save (xlFolder & sFileName)
Set oXMLDoc = Nothing
End If
End Sub
问题
问题是,一旦我删除了节点,将文件压缩备份,并尝试将它们作为 .xlsm 文件打开,我会收到一条消息,指出文件已损坏并且 Excel 无法修复它。
其他 XML 文件中是否还有其他节点或数据也需要删除? Excel 发现什么会将该文件标记为已损坏?
在我保存损坏的 Excel 文件之前,我保存了一个好文件来比较损坏的文件。从我可以看到删除过滤器节点后它们是相同的......
有没有人这样做过并且知道我错过了什么?
最佳答案
您应该确保删除父部分 - 实际上它已被清空。
看看这个sample code
关于xml - 删除 XML 节点后损坏的 Excel 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24706941/