AHK脚本(16)——带信息导出原图

wils
wils

创作者俱乐部成员

今天用AHK导出xlsx里的图片,目的是要保持原图,且根据表格里的信息重命名图片,且不丢失重复图片。

  • wps可以导出xlsx文件里的图片,但是,一方面导出的不是原图,有可能损失分辨率;另一方面没法方便的结合表格里的其他信息,给图片重命名(也可能是我不会用😂

  • 如果用JS宏通过shape对象导出,可以根据表格信息重命名图片,但仍然不是原图

  • 如果通过解压缩xlsx文件,或另存为html文件,可以获取media文件夹里的原图,却不方便根据表格信息重命名图片,且丢失重复的图片

🔔

#Requires AutoHotkey v2.0

sh := ComObject("shell.application")

xml := ComObject("MSXML2.DOMDocument")

et := ComObject("Ket.Application")

wb := et.Workbooks.Open(A_ScriptDir "\a.xlsx")

m := Map()

DirCreate("tmp")

d := "a.xlsx.zip"

FileCopy("a.xlsx", d, 1)

sh.NameSpace(A_ScriptDir "\tmp").CopyHere(sh.NameSpace(d).Items)

xml.load("tmp\xl\drawings\_rels\drawing1.xml.rels")

for i in xml.selectNodes("//Relationship") {

m[i.getAttribute("Id")] := i.getAttribute("Target")

}

xml.load("tmp\xl\drawings\drawing1.xml")

for i in xml.selectNodes("//a:blip") {

id := i.getAttribute("r:embed")

e := StrSplit(m[id], ".")[-1]

r := i.parentNode.parentNode.parentNode.selectSingleNode(".//xdr:from/xdr:row").text

c := i.parentNode.parentNode.parentNode.selectSingleNode(".//xdr:from/xdr:col").text

v := wb.ActiveSheet.Range("A" Integer(r + 1)).Value2

FileCopy RegExReplace(m[id], "^\.\.", "tmp\xl"), v "." e

}

wb.Close()

et.Quit()

et := ""

FileDelete(d)

DirDelete("tmp", 1)

大概原理是:

  • 解压xlsx文件,然后解析xml

  • 去xl\drawings\_rels\drawing1.xml.rels里找到原图对应的id,将对应关系存入字典m

  • 去xl\drawings\drawing1.xml里找到嵌入表格的图片信息,这里包括图片id,以及图片左上角所在单元格的行列号

  • 循环每张图片,通过id在字典m里,找到原图所在位置,再通过行号找到A列里,相同行的姓名,从原图位置复制图片,并重命名为姓名

最后,获取了原图,且根据表格里A列信息重命名图片,且重复的图片会保留下来

海南省
浏览 517
收藏
7
分享
7 +1
4
+1
全部评论 4
 
8237477087
您好,请问这个脚本,怎么操作啊, 没太看懂 是直接复制到txt里面然后改成ahk格式吗
· 重庆
回复
wils
wils

创作者俱乐部成员

这个只是演示ahk可以这样做,并不太方便 弄了个批处理例子,一样的原理 链接: https://pan.baidu.com/s/17Pb1jC2I66kt1Rw1vRqpPQ?pwd=8fyp 提取码: 8fyp
· 广东省
回复
 
子皓     
请问这个是什么问题?
· 广东省
回复
wils
wils

创作者俱乐部成员

请问是什么系统,ahk和xlsx文件放在哪 由于文件名是写死的,可能需要修改 我还没没试出这个问题,真不知道怎么回事
· 广东省
回复