You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python调整图片大小以适配Excel固定单元格?

如何根据Excel单元格尺寸适配图片大小

当然可以通过获取Excel的行列尺寸来计算图片的最佳缩放比例,替代固定比例缩放,让不同尺寸的图片都能完美适配固定单元格。下面是具体实现思路和代码修改方案:

核心原理

Excel的行列尺寸有特定单位,需要先转换成图片的像素单位,再计算缩放比例:

  • 列宽:默认以字符宽度为单位(比如你设置的ws.column_dimensions['C'].width = 32),在默认字体(Calibri 11号)下,1个列宽单位≈7.5像素
  • 行高:以**磅(pt)**为单位(你设置的ws.row_dimensions[rowappend].height = 230),1磅≈1.333像素(因为1英寸=72磅=96像素)

我们需要计算出目标单元格的像素宽高,然后取图片宽高与单元格宽高比例的最小值作为缩放比例,保证图片完整适配单元格且不变形。

代码修改

下面是针对你现有代码的修改版本,替换固定比例缩放为基于单元格尺寸的动态缩放:

def run():
    global rowappend
    
    numbers = number()
    # 先激活工作表,获取行列尺寸(提前移到前面,方便计算)
    wb.active = wb[radioselection.get()]
    ws = wb.active
    # 设置列宽(保持原有设置)
    ws.column_dimensions['F'].width = 15
    ws.column_dimensions['E'].width = 20
    ws.column_dimensions['D'].width = 32
    ws.column_dimensions['C'].width = 32
    ws.column_dimensions['B'].width = 10
    ws.column_dimensions['A'].width = 10
    rowappend = int(ws.max_row + 1)
    row_height = 230
    ws.row_dimensions[rowappend].height = row_height

    # 定义单元格尺寸转像素的函数
    def cell_to_pixel(col_width, row_pt):
        # 列宽转像素(默认Calibri 11下的系数)
        col_pixel = col_width * 7.5
        # 行高转像素:1pt = 96/72 像素
        row_pixel = row_pt * (96 / 72)
        return int(col_pixel), int(row_pixel)

    # 处理第一张图片(C列)
    img = Image.open(image_file_path).convert('RGB')
    orig_w, orig_h = img.size
    # 获取C列的宽高像素
    cell_w, cell_h = cell_to_pixel(ws.column_dimensions['C'].width, row_height)
    # 计算缩放比例,取最小比例避免超出单元格
    scale = min(cell_w / orig_w, cell_h / orig_h)
    # 计算新尺寸,取整
    new_w = int(orig_w * scale)
    new_h = int(orig_h * scale)
    img = img.resize((new_w, new_h))
    filenamevar = f'Kin image {numbers}.jpg'
    img.save(filenamevar)
    img2 = os.path.abspath(filenamevar)
    img = Image2(str(img2))

    # 处理第二张图片(D列)
    img3 = Image.open(image_file_path2).convert('RGB')
    orig_w3, orig_h3 = img3.size
    # 获取D列的宽高像素(D列宽和C列一样,这里也可以复用cell_w)
    cell_w3, cell_h3 = cell_to_pixel(ws.column_dimensions['D'].width, row_height)
    scale3 = min(cell_w3 / orig_w3, cell_h3 / orig_h3)
    new_w3 = int(orig_w3 * scale3)
    new_h3 = int(orig_h3 * scale3)
    img3 = img3.resize((new_w3, new_h3))
    filenamevar2 = f'Kin image {numbers + 1}.jpg'
    img3.save(filenamevar2)
    img4 = os.path.abspath(filenamevar2)
    img3 = Image2(str(img4))

    # 写入Excel内容(保持原有逻辑)
    ws[f'A{rowappend}'] = bodypart_var.get()
    ws[f'B{rowappend}'] = exercise_var.get()
    ws.add_image(img, f'C{rowappend}')
    ws.add_image(img3, f'D{rowappend}')
    ws[f'E{rowappend}'] = instructions_var.get()
    ws[f'F{rowappend}'] = setsandreps_var.get()

    confirmation = tk.Label(root, text="Ready to be imported!", bd=1, bg='SeaGreen1', 
    justify="right")
    confirmation.grid(row=18, column=0)

关键说明

  1. 提前获取工作表和行列尺寸:把激活工作表和设置行列宽高的代码移到图片处理前面,这样可以直接获取目标单元格的尺寸。
  2. 单位转换函数:cell_to_pixel把Excel的列宽(字符)和行高(磅)转换成图片的像素单位,适配默认字体的情况;如果你的Excel用了其他字体,可以调整7.5这个系数(比如测试1列宽对应多少像素后替换)。
  3. 动态缩放比例:通过min(cell_w/orig_w, cell_h/orig_h)保证图片按比例缩放后能完全放入单元格,不会超出边界。
  4. 适配不同列:如果C和D列宽不同,代码里也分别处理了,确保每列的图片都适配对应单元格。

这样修改后,不管原图片尺寸多大,都会自动缩放至适配单元格的最佳大小,解决固定比例适配效果不一致的问题。

内容的提问来源于stack exchange,提问作者slickspidey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:20:32