2017-04-12 383 views
4

如何从使用VBA的Excel工作表中的形状图片中获取EXIF信息(如纬度,经度等)?是否可以在不从工作表中提取或复制图片或从压缩的Excel工作簿中获取图片?如何从使用VBA的Excel工作表中的图片获取EXIF信息

我可以使用下面的代码遍历压缩文件夹的内容。

Public Sub ReadZip() 
    Dim vZipFileName As Variant 
    vZipFileName = "C:\Users\erogrou\Desktop\Test.zip" 

    Dim objShell, objFolder 
    Set objShell = CreateObject("shell.application") 
    Set objFolder = objShell.Namespace(vZipFileName) 

    Dim vFilename As Variant 

    If (Not objFolder Is Nothing) Then 
     Debug.Print objFolder.self.Path 

     For Each vFilename In objFolder.items 
      Debug.Print vFilename 
     Next 

    End If 

    Set objFolder = Nothing 
    Set objShell = Nothing 

End Sub 

回答

3

幸运的是,澳大利亚中北部流域管理局的Andrew Phillips发现了一件美丽的作品of coding

所以我没有看过重新上榜这里

当前的代码可以从接入到Excel中导入它是作为一个类模块,在我来说,我需要从32更改功能64位像这样:

私人声明函数的VirtualAlloc库 “KERNEL32”(BYVAL地址等长,BYVAL尺寸长,BYVAL AllocationType长,BYVAL保护长),只要

本使用PntSafe

私人声明PTRSAFE功能的VirtualAlloc库 “KERNEL32”(BYVAL地址等长,BYVAL尺寸长,BYVAL AllocationType长,BYVAL保护长),只要

+0

感谢您的推荐和对64位Excel实施的洞察。 exif信息是解决方案的重要组成部分,我一定会追求这一点。至于我的问题的其他部分。在没有首先将文件导出到临时工作位置的情况下,是否可以读取,编辑或保存压缩文件的内容?我假设这是不可能的,因为该文件是压缩的,它似乎甚至不能像Windows那样工作。即使是一个简单的文本文件也会在临时位置打开,并且无法将其直接保存到您打开的压缩位置。 – RRR

2

Excel中的渲染图片通常嵌入在增强型图元文件(EMF)中。您需要将元文件作为EMF复制到剪贴板,然后枚举EMF的记录并提取JPG,然后从JPG信息中解析EXIF数据。

或者,如果Excel文件已保存且处于XLSX/XLSM格式,则可以从压缩的XLSX/XLSM容器中提取JPG,然后解析该图像以获取EXIF数据。

这两种方法都不是微不足道的,在这两种情况下,使用.NET都会更容易。

+0

感谢您的快速反应。我致力于在这个版本上使用Excel VBA,因为它补充了很多现有的VBA代码。因此,如果我只处理Excel中的xlsx/m工作簿,它们以OpenXML格式存储,我是否能够直接从存储的文件中读取EXIF信息,当然这些信息是带有EXIF的JPEG文件?我想开始我需要能够读取xlsm工作簿中的文件内容,并且我已经找到了一些这样的例子,但这些例子都是先导出文件,但我想直接读取它们。是否可以直接读取文件? – RRR

+0

看起来像@ brettdj的答案将提取EXIF数据,但您仍然需要提取文件并读取XML以查找图像。 .NET使解压缩变得相对容易,但对于纯粹的VBA解决方案,您需要使用类似于Ron de Bruin [示例]的代码将文件解压到临时位置(https://www.rondebruin.nl/win/s7 /win002.htm)。即使提取了文件,也需要能够解释描述文件关系,布局和内容的* multiple * xml文件,以便识别哪个图像是哪个。 – ThunderFrame

+0

您应该尝试将'xlsx'文件扩展名更改为'zip',并浏览该文件的内容,以确认图像实际上具有您需要的EXIF数据*。*之前*您花费太多时间追求此目的。 – ThunderFrame