抱歉,我没有资格对您的问题发表评论以进行澄清。
我制作了一个测试文件,在该评论中插入了评论和图像,然后提取了基础文件。然后我检查了它们的原始文件名。我还找到了嵌入的 JPEG 并将其解码以获取元数据。正如您所指出的,原始文件名存储在 xl\drawings\vmlDrawing1.vml 中(一旦您通过将 .zip 附加到文件名然后在其上运行解压缩实用程序从 excel 文件中提取了 xml 文件)。我确实找到了文件名,但没有找到路径或文件类型,所以我相当确定路径和文件类型没有被保留。
如果只是文件名对您来说就足够了,那么该文件包含您拥有的每张图纸的信息,并且这些信息将包括单元格位置,尽管它们是基于 0 的,因此您必须添加一个才能获得实际的行和列。我的问题分为两部分:
1) 仅文件名就足够了,还是您需要整个路径?如果您需要整个路径,我认为您很不走运,因为这些路径位于另一台计算机上,如果您提取文件名,您甚至无法搜索它们。
2) 如果这就是您所需要的,那么解决方案是否必须是 VBA?过去,我以编程方式解压缩并操作了 xml 基础文件,但这有点棘手。由于您只需要读出数据,因此简化了它,所以这是一个加号。我之前在 .net 中做过,但我敢肯定,如果它必须是 VBA,它可以做到,但如果您对解决方案类型持开放态度,它会更简单。
告诉我,我很乐意为您提供帮助。
================================================ ======================================
试试这个:制作电子表格的副本,附加 .zip (test.xlsm.zip),然后手动提取文件。将 vmlPath 更改为 xl\drawings\vmlDrawing1.vml 文件的位置。然后运行这个。我确实做了一些假设,例如,我假设节点和属性的顺序总是相同的,所以我使用硬编码索引(shp.attributes(0) 等)而不是使用逻辑来确保我有正确的节点或属性,但您似乎了解 VBA 的方式,所以我将编写一个准系统代码。这需要引用 Microsoft XML 6.0。
Sub vmlParse()
Dim vmlPath As String: vmlPath = "C:\Users\Lenovo\Desktop\test - Copy.xlsm\xl\drawings\vmlDrawing1.vml"
Dim this As Worksheet: Set this = ActiveSheet
Dim doc As New DOMDocument, shps As IXMLDOMNodeList
Dim shp As IXMLDOMNode, n As IXMLDOMNode, a As IXMLDOMAttribute
Dim fileName As String, productID As String
Dim rng As Range, r As Long, c As Long
doc.Load vmlPath
Set shps = doc.getElementsByTagName("x:ClientData")
For Each shp In shps
If shp.Attributes(0).nodeValue = "Note" Then
r = 0: c = 0
For Each a In shp.ParentNode.FirstChild.Attributes
If a.nodeName = "o:title" Then
fileName = a.nodeValue
Exit For
End If
Next
For Each n In shp.childNodes
If n.nodeName = "x:Row" Then r = n.text
If n.nodeName = "x:Column" Then c = n.text
Next
Set rng = this.Cells(r + 1, c + 1)
productID = rng.Value
'now you have the productID, the fileName, and the cell location
End If
Next
End Sub
让我知道你的效果如何。