如何使用Python批量替换Word、Excel文档中的旧logo图片?
批量替换Office文档中旧商标图片的实现方案
你现有的文本替换代码无法直接用于图片替换,原因是Word、Excel文件并非纯文本格式,直接用open读写会直接损坏文件结构,也无法识别到嵌入的图片资源。
实现思路
- 现在主流的docx(Word)、xlsx(Excel)本质是压缩包格式,解压后嵌入的图片都存放在固定的media目录下,我们可以通过专门的Office处理库定位、替换对应图片
- 优先统一处理docx/xlsx格式文件,若还有老旧的doc/xls文件,建议先批量转成新格式再操作
- 操作前必须备份所有原始文档,避免脚本异常导致文件损坏
所需依赖
安装需要的第三方库:
pip install python-docx openpyxl
示例代码(Word版本)
可匹配所有docx文件中和旧商标哈希一致的图片,批量替换为新商标:
import os import hashlib from docx import Document # 配置参数 OLD_IMG_PATH = "旧商标本地路径.png" NEW_IMG_PATH = "新商标本地路径.png" DOCX_DIR = "/Users/存放待处理Word文档的目录" # 计算旧商标的MD5值作为匹配依据 def get_img_md5(img_bytes): md5 = hashlib.md5() md5.update(img_bytes) return md5.hexdigest() with open(OLD_IMG_PATH, "rb") as f: OLD_IMG_HASH = get_img_md5(f.read()) # 遍历所有docx文件处理 for filename in os.listdir(DOCX_DIR): if not filename.endswith(".docx") or "~$" in filename: continue file_path = os.path.join(DOCX_DIR, filename) doc = Document(file_path) # 遍历文档所有嵌入资源,匹配图片替换 for part in doc.part.package.parts: if part.content_type.startswith("image/"): current_img_md5 = get_img_md5(part.blob) if current_img_md5 == OLD_IMG_HASH: with open(NEW_IMG_PATH, "rb") as new_f: part._blob = new_f.read() doc.save(file_path) print(f"已处理文件:{filename}")
示例代码(Excel版本)
可匹配所有xlsx文件中的旧商标,按原位置替换为新商标:
import os import hashlib from openpyxl import load_workbook from openpyxl.drawing.image import Image # 配置参数 OLD_IMG_PATH = "旧商标本地路径.png" NEW_IMG_PATH = "新商标本地路径.png" EXCEL_DIR = "/Users/存放待处理Excel文档的目录" def get_img_md5(img_bytes): md5 = hashlib.md5() md5.update(img_bytes) return md5.hexdigest() with open(OLD_IMG_PATH, "rb") as f: OLD_IMG_HASH = get_img_md5(f.read()) # 遍历所有xlsx文件处理 for filename in os.listdir(EXCEL_DIR): if not filename.endswith(".xlsx") or "~$" in filename: continue file_path = os.path.join(EXCEL_DIR, filename) wb = load_workbook(file_path) for ws in wb.worksheets: replace_idx_list = [] # 先匹配所有需要替换的旧图片 for idx, img in enumerate(ws._images): current_img_md5 = get_img_md5(img._data()) if current_img_md5 == OLD_IMG_HASH: replace_idx_list.append((idx, img.anchor)) # 倒序删除旧图片、插入新图片 for idx, old_anchor in sorted(replace_idx_list, reverse=True): ws._images.pop(idx) new_img = Image(NEW_IMG_PATH) new_img.anchor = old_anchor ws.add_image(new_img) wb.save(file_path) print(f"已处理文件:{filename}")
注意事项
- 脚本仅支持docx、xlsx格式,老旧的doc、xls格式需要先转换格式再处理
- 建议先拿3-5份测试文件验证逻辑没问题后,再批量处理所有文档
- 所有文档处理前必须提前备份,避免不可逆的文件损坏
内容的提问来源于stack exchange,提问作者Jess Crow
相关产品推荐
相关产品推荐

