恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

WPS表格图片批量处理源码:Python自动化缩放、水印与单元格写入

  • 首页
  • 资讯中心
  • /
  • WPS表格图片批量处理源码:Python自动化缩放、水印与单元格写入

相关资讯

Claude-Code规则引擎配置避坑指南:YAML语法、AST匹配与沙箱脚本 2026/10/18 17:32:26
Hrcad平纵面设计模块实战:交点法、竖曲线与出图避坑指南 2026/10/18 17:27:25
知识工作插件化:构建可编程的认知协处理器 2026/10/18 17:27:25

最新资讯

Matlab圆柱齿轮参数化设计工具包:透明化强度校核与模块化调试
Streamlit 安装运行指南:从 pip 到浏览器,一条命令跑通数据应用
JDK 1.6.0_06安装配置全攻略:环境变量与老项目部署实战
VTK与CGAL双库混排:从数据互转到骨架提取的网格修复管线
Spring Boot+Vue智能仓储超市系统开发实战:从数据建模到部署上线
十年深耕一个模块:技术“扫地僧”为何让图灵奖得主坐地板?

今日推荐

基于GMM的语音识别系统原理与MATLAB实现详解
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

本周热门

基于GMM的语音识别系统原理与MATLAB实现详解
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

WPS表格图片批量处理源码:Python自动化缩放、水印与单元格写入

发布时间:2026/10/18 17:32:26
WPS表格图片批量处理源码:Python自动化缩放、水印与单元格写入 简介这份源码面向WPS表格用户与办公自动化开发者用JavaScript宏解决表格内图片难以批量管理的痛点覆盖图片清除、批量导入与批量导出三大场景适合人事档案照片归集、商品图库同步、教学资料整理等实际业务。资源包共3个文件以inscode工程配置、html页面与gitignore为主压缩包仅6KB轻量易加载可直接在WPS宏编辑器中运行无需外部环境或第三方插件。已有161人学习关注。代码基于WPS JS API实现通过CommandButton1_Click遍历Shapes集合精准删除图片对象避免误删文本框与图表CommandButton2_Click借助FileSystemObject读取本地路径用AddPicture将JPG、PNG等格式图片锚定到目标单元格并按行列尺寸等比缩放CommandButton3_Click则按“SheetName_RowColumn_序号”规则导出原图。源码注释详尽含路径校验、异常捕获与状态栏进度反馈并预留EXIF读取、水印、裁剪等扩展接口既是实用工具也是学习WPS宏对象模型与图形属性操控的典型范例。1. 从一堆截图到一份表格WPS图片批量处理源码能省掉哪些手工活如果你手头有一批商品图、学生作业截图或者巡检照片需要统一改尺寸、加文字水印、再按规则塞进 WPS 表格的指定单元格里手动操作大概率会让人崩溃。这份「WPS表格图片批量处理」源码包解决的就是这个场景用脚本把图片批量处理完再通过 WPS 表格的接口把图片按行列坐标写进表格省掉一张张拖拽、对齐、调大小的重复劳动。它适合经常做报表、台账、素材归档的从业者也适合想拿一个完整小项目练手 Python 自动化办公的新手。源码包本身不依赖 WPS 会员功能走的是本地脚本加表格对象操作的路线拿到手改几个路径参数就能跑。2. 拆开源码包目录结构、依赖和三个核心模块2.1 拿到源码先看什么目录树与入口文件源码包解压后常见做法是先扫一眼根目录确认入口文件、配置文件和资源目录的位置。一个结构清晰的图片批处理项目通常长这样wps-image-batch/ ├── main.py # 入口串起处理与写入流程 ├── config.yaml # 路径、尺寸、水印文字等参数 ├── requirements.txt # 依赖清单 ├── core/ │ ├── image_ops.py # 图片缩放、裁剪、水印 │ └── wps_writer.py # 调用 WPS 表格接口写图 ├── input_images/ # 待处理图片 └── output/ # 处理后的图片与生成的表格先看main.py的if __name__ __main__:部分确认它读的是哪个配置、输出到哪里。很多新手翻车是因为直接双击运行结果工作目录不对脚本找不到input_images。稳妥做法是在终端里cd到项目根目录再执行或者把配置里的路径全部写成绝对路径。2.2 依赖安装别急着 pip install -rrequirements.txt里一般会包含Pillow图片处理、openpyxl或pywin32表格写入、PyYAML读配置。安装前先确认 Python 版本Pillow 在 3.8 到 3.12 之间兼容性较好太老的 3.6 可能装不上最新版。# 建议先建虚拟环境避免污染全局包 python -m venv venv # Windows 激活 venv\Scripts\activate # macOS / Linux 激活 source venv/bin/activate # 再装依赖指定国内镜像会快很多 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple参数说明-i后面是镜像地址网络环境好的话可以不加。如果pywin32安装报错常见原因是缺少 Visual C 运行库装一下 Build Tools 即可。装完后用pip list确认Pillow和pywin32都在列表里再往下走。2.3 三个核心模块的分工image_ops.py负责图片本身的变换读图、按比例缩放、加文字水印、统一转成 PNG 或 JPG。wps_writer.py负责和 WPS 表格打交道打开工作簿、定位工作表、把图片插入到指定单元格并调整大小。main.py则是调度员遍历输入目录对每张图调用处理函数再把结果交给写入模块。这种拆分的好处是你只想改水印文字就动image_ops.py只想改表格里的插入位置就动wps_writer.py不用在一大坨代码里找。常见做法是先把image_ops.py单独跑通确认输出图片没问题再接表格写入这样排错范围小很多。3. 图片批处理核心缩放、水印与格式转换的参数怎么设3.1 等比缩放与强制拉伸的区别批量处理图片时最容易踩的坑是尺寸设错导致图片变形。源码里一般会提供两种模式等比缩放和强制拉伸。等比缩放会按长边或短边约束保持宽高比强制拉伸则直接改成目标宽高适合对尺寸有硬性要求、不在乎轻微变形的场景。from PIL import Image def resize_image(src_path, dst_path, target_size, keep_ratioTrue): src_path: 原图路径 dst_path: 输出路径 target_size: (宽, 高) 元组 keep_ratio: True 等比缩放False 强制拉伸 img Image.open(src_path) if keep_ratio: # thumbnail 会原地修改且只缩不放 img.thumbnail(target_size, Image.LANCZOS) else: img img.resize(target_size, Image.LANCZOS) img.save(dst_path)逻辑说明thumbnail方法保持宽高比但注意它只缩小不放大如果原图比目标尺寸小输出还是原尺寸。resize则严格按给定宽高可能变形。参数Image.LANCZOS是重采样算法适合缩小图片画质损失小如果是要放大图片可以换成Image.BICUBIC边缘更柔和。3.2 文字水印的位置与透明度水印参数通常包括文字内容、字号、颜色、透明度和位置。位置一般用相对坐标比如右下角、居中、平铺。透明度的实现方式是给文字图层加 alpha 通道。from PIL import Image, ImageDraw, ImageFont def add_watermark(img, text, font_path, font_size36, opacity128, positionbottom_right): opacity: 0-255越小越透明 position: bottom_right / center / tile watermark_layer Image.new(RGBA, img.size, (0, 0, 0, 0)) draw ImageDraw.Draw(watermark_layer) font ImageFont.truetype(font_path, font_size) bbox draw.textbbox((0, 0), text, fontfont) text_w, text_h bbox[2] - bbox[0], bbox[3] - bbox[1] if position bottom_right: x img.width - text_w - 20 y img.height - text_h - 20 elif position center: x (img.width - text_w) // 2 y (img.height - text_h) // 2 else: x, y 20, 20 draw.text((x, y), text, fontfont, fill(255, 255, 255, opacity)) return Image.alpha_composite(img.convert(RGBA), watermark_layer).convert(RGB)参数说明font_path要指向系统里真实存在的中文字体文件比如C:/Windows/Fonts/msyh.ttc否则中文会显示成方块。opacity设 128 大约是半透明设 200 以上接近不透明。position为tile时需要额外写循环平铺源码里如果没实现可以自己补一个双重 for 循环。3.3 格式转换与压缩质量批量处理经常要把 PNG 转 JPG 以减小体积或者把 JPG 转 PNG 以保留透明通道。转换时注意 JPG 不支持透明直接转会把透明区域填成黑色。def convert_format(src_path, dst_path, fmtJPEG, quality85): img Image.open(src_path) if fmt JPEG and img.mode in (RGBA, P): # 透明背景填白避免转 JPG 后变黑 background Image.new(RGB, img.size, (255, 255, 255)) background.paste(img, maskimg.split()[-1] if img.mode RGBA else None) img background img.save(dst_path, formatfmt, qualityquality)quality参数只对 JPG 有效范围 1 到 9585 左右是体积和画质的平衡点。PNG 没有这个参数但可以用optimizeTrue减小体积。转换前先判断原图模式是RGBA或P才需要填白底否则直接存。4. 写入 WPS 表格单元格定位、图片锚点与批量循环4.1 用 pywin32 操作 WPS 表格对象WPS 表格在 Windows 上兼容 COM 接口可以用pywin32调用。核心是拿到Application对象再逐层拿到Workbook、Worksheet、Range。import win32com.client def open_wps_workbook(file_path): # 常见做法是先用 Dispatch 启动 WPS 表格 app win32com.client.Dispatch(Ket.Application) app.Visible False # 后台运行不弹窗 wb app.Workbooks.Open(file_path) return app, wb参数说明Ket.Application是 WPS 表格的 COM 标识如果报错说找不到可以换成Excel.Application试试取决于本机注册的是哪个。Visible False让 WPS 在后台跑批量处理时不干扰操作。处理完记得wb.Close()和app.Quit()否则进程会残留。4.2 图片插入的锚点与尺寸控制往单元格里插图本质是往工作表上插一个浮动图片对象再设置它的Top、Left、Width、Height让它对齐到某个单元格。def insert_image_to_cell(ws, img_path, cell, width120, height90): ws: 工作表对象 cell: 单元格地址如 B2 width/height: 图片显示尺寸单位是磅 target ws.Range(cell) # 锚点设为单元格左上角 pic ws.Shapes.AddPicture( img_path, LinkToFileFalse, SaveWithDocumentTrue, Lefttarget.Left 2, Toptarget.Top 2, Widthwidth, Heightheight ) return pic逻辑说明AddPicture的Left和Top是相对于工作表左上角的坐标用target.Left和target.Top拿到单元格位置再加 2 磅留点边距。Width和Height是显示尺寸不是原图像素设成和单元格宽高接近的值图片就不会溢出。如果图片比例和单元格不一致可以只设宽度高度按原图比例算。4.3 批量循环从文件列表到表格行号批量写入的关键是建立「图片文件」和「表格行号」的映射。常见做法是按文件名排序然后从起始行开始逐行写入。import os def batch_insert(ws, img_dir, start_row2, colB): files sorted([f for f in os.listdir(img_dir) if f.lower().endswith((.png, .jpg, .jpeg))]) for idx, fname in enumerate(files): row start_row idx img_path os.path.join(img_dir, fname) # 在 A 列写文件名B 列插图 ws.Cells(row, 1).Value fname insert_image_to_cell(ws, img_path, f{col}{row}) return len(files)参数说明start_row是数据起始行一般第 1 行是表头所以从 2 开始。col是插图列文件名写在 A 列方便核对。sorted保证顺序稳定如果文件名是1.jpg、2.jpg、10.jpg默认排序会变成1, 10, 2需要改成按数字排序可以用keylambda x: int(x.split(.)[0])。5. 避坑与排查路径、字体、进程残留和图片变形5.1 现象脚本报「找不到文件」但文件明明在原因工作目录不是项目根目录或者配置里写的是相对路径脚本从别的地方启动就找不到了。解决在main.py开头加os.chdir(os.path.dirname(os.path.abspath(__file__)))强制把工作目录切到脚本所在目录。或者把所有路径改成绝对路径一劳永逸。5.2 现象水印中文显示成方块原因ImageFont.truetype加载的字体文件不支持中文或者路径写错加载了默认字体。解决确认字体路径指向中文字体Windows 常用msyh.ttc微软雅黑、simhei.ttf黑体macOS 用/System/Library/Fonts/PingFang.ttc。加载前用os.path.exists判断一下不存在就打印警告并回退到默认字体。5.3 现象跑完脚本后 WPS 进程还在后台原因app.Quit()没执行或者中间抛异常跳过了关闭逻辑。解决用try...finally包住处理流程finally里统一关闭工作簿和退出应用。如果已经残留了在任务管理器里结束wps.exe或et.exe进程。app None try: app, wb open_wps_workbook(output/result.xlsx) ws wb.Sheets(1) batch_insert(ws, output/images) wb.Save() finally: if wb: wb.Close() if app: app.Quit()5.4 现象插入表格的图片被拉伸变形原因AddPicture的Width和Height都写死了和原图比例不一致。解决只设WidthHeight按原图比例算或者先读原图尺寸算出等比缩放后的宽高再传入。如果单元格本身是合并单元格target.Left和target.Top取的是合并区域左上角插图位置是对的但尺寸要按合并后的区域调整。5.5 现象处理几百张图后内存暴涨原因Image.open打开的对象没有及时关闭或者所有图片对象都堆在内存里。解决每处理完一张图就img.close()或者用with Image.open(...) as img:上下文管理。批量写入时也不要一次性把所有图片路径读进列表再处理用生成器逐张读。6. 进阶技巧用配置文件驱动全流程与结果校验6.1 把参数抽到 YAML换项目不用改代码源码包里如果带了config.yaml优先改配置而不是改代码。一个典型的配置长这样input_dir: input_images output_dir: output target_size: [800, 600] keep_ratio: true watermark: text: 内部资料 font_path: C:/Windows/Fonts/msyh.ttc font_size: 36 opacity: 128 position: bottom_right table: output_file: output/result.xlsx start_row: 2 image_col: B image_width: 120 image_height: 90读取时用yaml.safe_load把字典里的值传给各个函数。这样换一个项目只改 YAML 就行代码一行不动。注意 YAML 里路径用正斜杠或双反斜杠单反斜杠会被当成转义字符。6.2 结果校验用表格反查图片是否写全批量写入最怕漏图或错位。一个简单的校验方法是写入完成后重新打开表格统计Shapes对象的数量和输入目录的图片数量对比。def verify_result(xlsx_path, expected_count): app win32com.client.Dispatch(Ket.Application) app.Visible False wb app.Workbooks.Open(xlsx_path) ws wb.Sheets(1) actual ws.Shapes.Count wb.Close() app.Quit() if actual ! expected_count: print(f数量不一致预期 {expected_count}实际 {actual}) else: print(校验通过)这个校验跑一遍只要几秒但能挡住大部分「以为写完了其实漏了」的情况。我一般会在批量任务结束后强制走一遍确认数量对得上再交付。6.3 一个容易忽略的细节图片文件名里的特殊字符如果文件名包含#、、空格等字符AddPicture有时会报错。稳妥做法是在写入前把文件名清洗一遍只保留中文、字母、数字、下划线和短横线。清洗函数可以这样写import re def clean_filename(name): # 去掉扩展名后清洗再拼回去 stem, dot, ext name.rpartition(.) stem re.sub(r[^\w\u4e00-\u9fa5-], _, stem) return f{stem}{dot}{ext}\w匹配字母数字下划线\u4e00-\u9fa5匹配常用中文其他字符统一替换成下划线。清洗后再写入表格既避免接口报错也让表格里的文件名更规整。从那以后我每次跑批量任务都会先把配置里的路径改成绝对路径再单独跑一遍图片处理、确认输出目录里的图没问题最后才接表格写入。这个习惯帮我省掉了至少三次「写到一半发现水印字体没加载」的返工。希望帮到你。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号