ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 949|回复: 6

[分享] 带位置信息的从xlsx解压图片

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-9-20 05:44 | 显示全部楼层 |阅读模式
就是busybox.exe打包了一个脚本,最好放到个只有xlsx的文件夹里,双击运行即可,会为每个xlsx创建文件夹,解压出来的图片命名为"xxx-yyyy-zzzz.后缀",其中xxx代表第几个sheet,yyyy代表图片左上角在sheet中第几行,zzzz代表图片左上角在第几列,文件里如果有重复引用的图片,导出来也会有重复的。

这几天发现busybox-w32可以很方便的打包自己写的脚本(相当于.sh脚本打包成.exe,只有600k,功能顶大半个linux系统),就想着写点什么。
查看脚本可以把xlimg.exe改名叫busybox.exe,然后命令行执行busybox.exe --show xlimg
大概意思是,unzip解压drawing1.xml等文件到管道(不产生临时文件),当成文本处理提取出需要的行列信息,再解压image1到对应的名称,脚本不熟写的不好请见谅,有啥bug我再改:XD

xlimg.7z

309.75 KB, 下载次数: 30

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-9-20 08:58 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
xlimg.exe改名叫busybox.exe,

想学习一下脚本,手机上不知道咋看
Screenshot_2022-09-20-08-57-58-629_com.aidlux.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-9-20 09:14 | 显示全部楼层
zpy2 发表于 2022-9-20 08:58
xlimg.exe改名叫busybox.exe,

想学习一下脚本,手机上不知道咋看

exe没法在linux下看,windows下有个--show参数可以看自己添加的脚本内容

脚本开头的方法是抄来的,bash处理xml的简单办法,大概就是把文件以"<"分标签,以">"分属性,之后逐个标签处理,其实现在想来,直接用正则处理xml可能更快,因为只取了简单的几个内容

rels文件里有Id和压缩包内图片路径的对应信息,xml里有图片在sheet里的位置信息,最后把每个a:blip标签里的信息替换成具体路径解压出来

  1. #!/bin/bash
  2. set -ueo pipefail

  3. readXmlDom () {
  4.     local IFS=\>
  5.     read -d \< ENTITY CONTENT
  6.     local ret=$?
  7.     TAG_NAME=${ENTITY%% *}
  8.     ATTRIBUTES=${ENTITY#* }
  9.     return $ret
  10. }

  11. for xl in *.xlsx
  12. do
  13.     mkdir -p "${xl%.*}"
  14.     for st in $(unzip -l "$xl" | sed -n -r 's/.*drawing([0-9]+).*xml$/\1/p')
  15.     do
  16.         (unzip -p "$xl" xl/drawings/_rels/drawing$st.xml.rels && unzip -p "$xl" xl/drawings/drawing$st.xml) | while readXmlDom; do
  17.             case $TAG_NAME in
  18.                 Relationship) ATTRIBUTES=${ATTRIBUTES/../xl}
  19.                     eval ${ATTRIBUTES%/*}
  20.                     eval $Id="$Target";;
  21.                 xdr:from) tmp=1;;
  22.                 /xdr:from) tmp=0;;
  23.                 xdr:row) if [[ $tmp == 1 ]]; then
  24.                         r=$CONTENT
  25.                     fi;;
  26.                 xdr:col) if [[ $tmp == 1 ]]; then
  27.                         c=$CONTENT
  28.                     fi;;
  29.                 a:blip) ATTRIBUTES=${ATTRIBUTES%"*}
  30.                     ATTRIBUTES=${ATTRIBUTES##*"}
  31.                     ATTRIBUTES=$(eval echo \$$ATTRIBUTES)
  32.                     eval $(printf "unzip -p "$xl" $ATTRIBUTES > "${xl%.*}/%03d-%04d-%04d.${ATTRIBUTES##*.}"\n" $st $(expr $r + 1) $(expr $c + 1));;
  33.             esac
  34.         done
  35.     done
  36. done
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-9-20 09:16 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-9-20 09:27 来自手机 | 显示全部楼层
好想让你跟我一起搞网络化,别折腾本地环境了

TA的精华主题

TA的得分主题

发表于 2022-9-20 09:43 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
wanghan519 发表于 2022-9-20 09:16
在审核

感谢老师分享

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-3-24 08:27 | 显示全部楼层
更新了:

*.xlsx改成了*.xls?,可以处理xlsm了,但xls还是需要先用脚本批量另存为xlsx才能解压
第31行获取属性的写法有缺陷,改成用sed取rIDx

动画.gif

xlimg.zip

353.1 KB, 下载次数: 14

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 05:42 , Processed in 0.034717 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表