当前位置: 首页 > news >正文

python_excel批量插入图片

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

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_width
        img.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!')

相关文章:

  • 数据结构——队列、哈希存储(2025.2.11)
  • 【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十二节】
  • Git 中的 author 和 committer 有什么区别
  • DeepSeek 从入门到精通学习指南,2025清华大学《DeepSeek从入门到精通》正式发布104页pdf版超全解析
  • 通过用户名和密码登录服务器有哪些方法
  • 基于语义语言的语义通信(SemCom)理论:语义编码、语义解码、CSED 及语言利用
  • 从 ClickHouse 到 Apache Doris:在网易云音乐日增万亿日志数据场景下的落地
  • 数据结构-二叉树经典OJ题
  • Dify报错model schema not found
  • 视频编解码标准中的 Profile 和 Level
  • 用大模型学大模型03-数学基础 概率论
  • JAVA EE初阶 - 预备知识(一)
  • 解锁ASP4644电源芯片RUN引脚的秘密
  • Easy系列PLC 线性变换功能块(模拟量相关功能块汇总)
  • 网络IP地址冲突故障,快速解决方案!
  • MySQL —— 事务
  • vi 是 Unix 和 Linux 系统中常用的文本编辑器
  • QML使用ChartView绘制箱线图
  • 【算法专场】哈希表
  • DeepSeek R1本地部署 DeepSeek Api接口调用 DeepSeek RAG知识库工作流详解
  • 庆祝上海总工会成立100周年暨市模范集体劳动模范和先进工作者表彰大会举行,陈吉宁寄予这些期待
  • 沃旭能源因成本上升放弃英国海上风电项目,或损失近40亿元
  • 央行最新报告:积极落地5月推出的一揽子金融政策,促进经济供需平衡、物价合理回升
  • 马克思主义理论研究教学名师系列访谈|董雅华:让学生感知马克思主义理论存在于社会生活中
  • 一热就出汗 VS 热死都不出汗的人,哪个更健康?
  • 水利部:山西、陕西等地旱情将持续