python_excel批量插入图片

devtools/2025/2/15 22:35:49/

提取excel的指定列的值的后4位(数值),在其它列名的单元格中,批量嵌入与该数值匹配的图片(未实现居中),每间隔4行处理一次(合并过单元格)。

python">import pandas as pd
from openpyxl import load_workbook
from openpyxl.drawing.image import Image
from openpyxl.utils import get_column_letter
import os# Excel文件路径
excel_file = r'E:\第二批400平台命名及台账信息_20250210_1.xlsx'
# 工作表名称
sheet_name = '电缆一班'
# 源数据列名(用于截取后四位的列)
source_column = '南网设备ID'# 图片文件夹路径
image_folder = r'E:\现场图片'
# 每隔多少行处理一次
interval = 4
# 图片插入时相对于单元格边缘的偏移量(可根据需要调整)
offset_x = 5
offset_y = 1# 读取Excel文件
df = pd.read_excel(excel_file, sheet_name=sheet_name)# 加载Excel工作簿和工作表
wb = load_workbook(excel_file)
ws = wb[sheet_name]# V/L-位置,W/M-编号
target_column_letter = 'V'# 获取工作表的默认行高和列宽(用于调整图片大小)
default_row_height = ws.row_dimensions[1].height  # 假设第一行的行高代表默认行高
default_col_width = ws.column_dimensions[target_column_letter].width  # 获取目标列的默认列宽# 由于openpyxl不支持直接获取图片的像素尺寸,我们需要假设一个图片尺寸或预先知道它
# 这里我们假设图片将被缩放到适合单元格的大小(可能需要根据实际情况调整)
image_width = default_col_width * 5  # 假设图片宽度是列宽的10倍(这个比例可能需要调整)
image_height = default_row_height * 4  # 假设图片高度是行高的8倍(这个比例也可能需要调整)# 遍历DataFrame,每隔interval行处理一次
for i in range(0, len(df), interval):# 获取当前行的数据row_data = df.iloc[i]# 截取源列值的后四位code = str(row_data[source_column])[-4:]# 构建图片文件名(假设图片文件名与截取的后四位代码匹配,扩展名为.jpg)# V/L-位置,需要加'-1',W/M-编号无需image_filename = f"{code}-1.jpg"image_path = os.path.join(image_folder, image_filename)# 检查图片是否存在if os.path.exists(image_path):# 计算图片插入的Excel行号(从1开始)excel_row = i + 2  # DataFrame索引从0开始,Excel行号从1开始,且第一行是标题行,所以要加2# 创建Image对象img = Image(image_path)# 设置图片大小img.width = image_widthimg.height = image_height# 计算图片的锚点(由于我们要让图片看起来像是嵌入在单元格中,所以锚点需要稍微偏移以适应单元格边框)# 注意:这里的偏移量可能需要根据你的Excel样式和图片大小进行调整# openpyxl的anchor属性接受一个字符串,格式为'{列号}{行号}+{x偏移}+{y偏移}',但openpyxl不直接支持这种带偏移的anchor格式# 因此,我们需要手动计算图片左上角的坐标,并使用add_image时指定top和left属性(但openpyxl的Image对象没有top和left属性,所以我们使用anchor的变通方法)# 不过,为了简化,这里我们仅使用anchor的基本功能,并将图片放置在单元格的左上角附近img.anchor = f'{target_column_letter}{excel_row}'# 由于openpyxl的Image对象不直接支持设置top和left属性,我们需要通过调整anchor字符串中的行号和列号来模拟偏移# 但这种方法并不精确,且依赖于单元格的大小和图片的缩放比例# 一种更精确的方法是使用Lxml库直接操作XML,但这超出了本示例的范围# 在这里,我们简单地将图片放置在单元格的左上角,并可能需要在Excel中手动调整图片位置以使其看起来像是嵌入的# 为了模拟嵌入效果,我们可以将图片插入到前一个单元格的右侧(或根据需要调整)# 但由于我们已经指定了目标列,这里我们直接插入到目标列# 插入图片到工作表中# 注意:由于anchor的限制和openpyxl的API,图片可能不会精确地放置在单元格内部# 你可能需要在Excel中手动调整图片的大小和位置ws.add_image(img)else:print(f"Image not found for code {code} in row {i + 2} (Excel row number).")# 保存修改后的Excel文件(注意:由于图片是作为对象附加的,而不是真正嵌入到单元格中,所以保存后可能需要在Excel中手动调整)
wb.save(excel_file)
print('done!')


http://www.ppmy.cn/devtools/159164.html

相关文章

【大模型】阿里云百炼平台对接DeepSeek-R1大模型使用详解

目录 一、前言 二、DeepSeek简介 2.1 DeepSeek 是什么 2.2 DeepSeek R1特点 2.2.1 DeepSeek-R1创新点 2.3 DeepSeek R1应用场景 2.4 与其他大模型对比 三、阿里云百炼大平台介绍 3.1 阿里云百炼大平台是什么 3.2 阿里云百炼平台主要功能 3.2.1 应用场景 3.3 为什么选…

基于vue3实现的课堂点名程序

设计思路 采用vue3实现的课堂点名程序&#xff0c;模拟课堂座位布局&#xff0c;点击开始点名按钮后&#xff0c;一朵鲜花在座位间传递&#xff0c;直到点击结束点名按钮&#xff0c;鲜花停留的座位被点名。 课堂点名 座位组件 seat.vue <script setup>//组合式APIimpo…

在 PyCharm 中接入deepseek的API的各种方法

在 PyCharm 中接入 DeepSeek 的 API&#xff0c;通常需要以下步骤&#xff1a; 1. 获取 DeepSeek API 密钥 首先&#xff0c;确保你已经在 DeepSeek 平台上注册并获取了 API 密钥&#xff08;API Key&#xff09;。如果没有&#xff0c;请访问 DeepSeek 的官方网站注册并申请 …

Kali linux搭建wifi绵羊墙

复现了获取SSID&#xff0c;但手机连不上来获取主机名&#xff0c;可能是因为手机保存的热点是有密码的。 设置网卡 网卡支持的情况下&#xff0c;kali下直接运行 ifconfig wlan0 up airmon-ng check kill airmon-ng start wlan0 airbase-ng -P -C 30 -v wlan0mon | tee noh…

2025年02月12日Github流行趋势

项目名称&#xff1a;data-formulator 项目地址url&#xff1a;https://github.com/microsoft/data-formulator 项目语言&#xff1a;TypeScript 历史star数&#xff1a;4427 今日star数&#xff1a;729 项目维护者&#xff1a;danmarshall, Chenglong-MS, apps/dependabot, mi…

vue 文件下载(导出)excel的方法

目前有一个到处功能的需求&#xff0c;这是我用过DeepSeek生成的导出&#xff08;下载&#xff09;excel的一个方法。 1.excel的文件名是后端生成的&#xff0c;放在了响应头那里。 2.这里也可以自己制定文件名。 3.axios用的是原生的axios&#xff0c;不要用处理过的&#xff…

【Azure 架构师学习笔记】- Azure Databricks (11) -- UC搭建

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (10) – UC 使用 前言 由于ADB 的更新速度很快&#xff0c;在几个月之后重新搭建ADB 时发现UC 已经更新了很多&#xff0c;为了后续做ADB 的功…

PostgreSQL 数据库压力测试指南

一、为什么需要压力测试&#xff1f; 数据库需要进行压力测试的原因主要包括以下几个方面&#xff1a; 性能评估&#xff1a;通过压力测试&#xff0c;可以了解数据库在高负载情况下的性能表现&#xff0c;包括响应时间、吞吐量和资源利用率等。这有助于确定系统的性能瓶颈。 …