ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 解决VBA保存EXCEL里的图片不清晰,且按照指定名称保存

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-5-24 16:46 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 bluesky_0 于 2024-5-24 16:52 编辑

先说下背景:
       我有个需求在word,或者EXCEL里有很多图片,需要批量导出来,且按照指定名称命名;
解决问题第一次努力:
论坛有个大神,用word做的,在32位系统OK,在64位报错.我搞了好久也没有解决.
那个word VBA帖子地址:https://club.excelhome.net/thread-1412524-1-1.html
解决问题第二次努力:
我转向Python 解析WORD,借助狗屁通代码OK,但是遇到一个问题,就是word的图片如果出现重复的,无法准确的存出来
举例:Word文件里本来有图片20个,但是有3对是重复的,代码取出来的就是17个....我研究一个月没有搞定.具体代码,在下面:
解决问题第三次努力:
我研究EXCEL VBA ,经过几天终于搞定;源代码见附件
开始借助AI,GPT3.5,文心一言;都达不到我想要的.....还是靠我自己搞定的!
这里说下百度那个AI,智障一样......

我也在论坛搜了,没有找到我需要的,
但是发现很多人都遇到这个问题,所以我完全共享我的源代码
论坛有个朋友提到几个方法,我觉得都不好,地址在:https://club.excelhome.net/threa ... tml?_dsign=7154d8b6

打开EXCEL VBA文件以后,菜单自动创建MYTAB 菜单 ,目前只搞了二个功能,提取图片,删除图片,插入图片还在研究

mytab

mytab


附件:
Python 提取Word里表格见截图)的图片,且按照指定名称命名的代码:

Word的样式

Word的样式

  1. import os
  2. import zipfile
  3. from docx import Document
  4. from collections import defaultdict

  5. # 提供的Word文件路径
  6. word_file = 'D:\\202401\\202401.docx'
  7. # 指定存储图片的文件夹路径
  8. output_folder = 'D:\\202401'

  9. # 创建存储图片的文件夹
  10. if not os.path.exists(output_folder):
  11.     os.makedirs(output_folder)

  12. # 使用python-docx打开Word文档
  13. doc = Document(word_file)

  14. # 建立字典用于存储图片文件名和个数
  15. image_data_dict = defaultdict(list)

  16. # 从Word文件(ZIP包)中提取图片
  17. image_files = []
  18. with zipfile.ZipFile(word_file, 'r') as z:
  19.     image_files = [f for f in z.namelist() if f.startswith('word/media/')]

  20. for table in doc.tables:  # 添加表格遍历以获取文件名和图片数量
  21.     for row in table.rows:
  22.         cell_text = row.cells[0].text.strip()
  23.         image_count = 0
  24.         for paragraph in row.cells[1].paragraphs:
  25.             image_count += len(paragraph.runs)  # 计算每行中的图片数量

  26.         print(f"文件名: {cell_text}, 图片数量: {image_count}")

  27.         if image_count > 0:
  28.             image_files_per_cell = image_files[:image_count]  # 获取当前单元格对应的图片文件
  29.             image_files = image_files[image_count:]  # 更新剩余的图片文件列表

  30.             image_data_dict[cell_text].extend(image_files_per_cell)  # 存储对应关系

  31. # 按照图片原始名称排序顺序提取图片
  32. for key, value in image_data_dict.items():
  33.     with zipfile.ZipFile(word_file, 'r') as z:  # 重新打开 ZIP 文件
  34.         for index, image_file in enumerate(value):
  35.             image_data = z.read(image_file)  # 读取图片数据

  36.             image_name = f"{key}_image_{index+1}"  # 图片名称,按照图片原始名称排序
  37.             _, extension = os.path.splitext(image_file)  # 获取文件扩展名
  38.             image_path = os.path.join(output_folder, f"{image_name}{extension}")  # 构建图片路径

  39.             # 保存图片
  40.             with open(image_path, 'wb') as img_file:
  41.                 img_file.write(image_data)

  42. print("Images have been extracted and saved.")
复制代码








Export All PicturesV20240525OK.7z

1.28 MB, 下载次数: 64

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-5-24 19:14 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 perfect131 于 2024-5-24 19:51 编辑

从zip media 提取的 才是最清晰的 原图
word excel ppt导图代码基本都一样 从zip media复制出来
https://club.excelhome.net/threa ... tml?_dsign=7154d8b6

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-5-24 19:34 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-5-24 19:39 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-24 22:04 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

古人云,夏虫不可语冰,你就是那个夏虫

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-24 22:06 | 显示全部楼层
perfect131 发表于 2024-5-24 19:14
从zip media 提取的 才是最清晰的 原图
word excel ppt导图代码基本都一样 从zip media复制出来
...

你的方法其实很好的,但是人嘛,都是喜欢自己的作品.
EXCEL,word的压缩文件,我研究过,水平有限没有搞定

TA的精华主题

TA的得分主题

发表于 2024-5-25 08:41 | 显示全部楼层
增加一行数据和图片的话,还是只能提取前3张图片

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-25 10:38 | 显示全部楼层
啦啦比比 发表于 2024-5-25 08:41
增加一行数据和图片的话,还是只能提取前3张图片

自由增加但是不要断行.,前三行,我只是举例

TA的精华主题

TA的得分主题

发表于 2024-5-26 00:37 | 显示全部楼层
学习了楼主的杰作:楼主实现的关键在于EXCEL中的图片保持了原始尺寸,可缩放;但不知为何,我插入图片---->设置图片大小---->保存文档后,我插入的图片没有保持原始尺寸,但楼主原来插入的图片却还是保持缩放的,我是EXCEL2010,不知是否是软件版本的原因?
GIF 2024-05-26 00-28-59.gif

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-26 12:58 | 显示全部楼层
本帖最后由 bluesky_0 于 2024-5-26 18:40 编辑
zhumin1025 发表于 2024-5-26 00:37
学习了楼主的杰作:楼主实现的关键在于EXCEL中的图片保持了原始尺寸,可缩放;但不知为何,我插入图片----> ...

我用的是office 365 ,推测有些代码365支持的好,低版本支持不好,
我是业余的程序员,太专业的内容,我都是靠一个个试错,试出来的.

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

本版积分规则

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

GMT+8, 2024-11-19 13:15 , Processed in 0.041685 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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