AHK脚本(16)——带信息导出原图
创作者俱乐部成员
今天用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列信息重命名图片,且重复的图片会保留下来
创作者俱乐部成员
创作者俱乐部成员