如何用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)
关键说明
- 提前获取工作表和行列尺寸:把激活工作表和设置行列宽高的代码移到图片处理前面,这样可以直接获取目标单元格的尺寸。
- 单位转换函数:
cell_to_pixel把Excel的列宽(字符)和行高(磅)转换成图片的像素单位,适配默认字体的情况;如果你的Excel用了其他字体,可以调整7.5这个系数(比如测试1列宽对应多少像素后替换)。 - 动态缩放比例:通过
min(cell_w/orig_w, cell_h/orig_h)保证图片按比例缩放后能完全放入单元格,不会超出边界。 - 适配不同列:如果C和D列宽不同,代码里也分别处理了,确保每列的图片都适配对应单元格。
这样修改后,不管原图片尺寸多大,都会自动缩放至适配单元格的最佳大小,解决固定比例适配效果不一致的问题。
内容的提问来源于stack exchange,提问作者slickspidey
相关产品推荐
相关产品推荐

