如何使用Python无需指定行列在Excel中动态定位多张图片
实现思路
- xlsxwriter的
insert_image()方法本身支持0索引的行号、列号作为位置参数,替代'A1'类字符串坐标,非常适合自动化计算 - 你可以维护两个变量记录当前插入位置的行、列索引,插入每张图片后,结合图片占用的行列数+你预设的间距,自动更新下一张的插入坐标即可
- 垂直排列只需要更新行坐标,横向排列更新列坐标,网格布局同时更新两个坐标即可
可直接复用的代码示例
动态适配图片尺寸版本(自动计算图片占用行数)
需要先安装pillow库读取图片尺寸:pip install pillow
import xlsxwriter from PIL import Image # 自定义配置 START_ROW = 1 # 起始行,0索引对应Excel第1行,1对应第2行 START_COL = 1 # 起始列,0索引对应A列,1对应B列 PADDING_ROWS = 2 # 两张图片之间的空行数量 EXCEL_PX_PER_ROW = 20 # 行高像素换算值,可根据自己设置的行高调整 # 初始化工作簿 workbook = xlsxwriter.Workbook('image_output.xlsx') worksheet = workbook.add_worksheet() # 待插入的图片路径列表 image_paths = ['python.png', 'chart1.png', 'photo.jpg'] current_row, current_col = START_ROW, START_COL for img_path in image_paths: # 读取图片像素尺寸 with Image.open(img_path) as img: _, height_px = img.size # 计算当前图片占用的行数,向上取整避免被截断 occupy_rows = (height_px // EXCEL_PX_PER_ROW) + 1 # 插入图片 worksheet.insert_image(current_row, current_col, img_path) # 更新下一张的起始行 current_row += occupy_rows + PADDING_ROWS workbook.close()
固定尺寸简化版本
如果不需要适配不同尺寸的图片,可以固定每张图的占用行数/缩放比例,不需要额外依赖:
import xlsxwriter workbook = xlsxwriter.Workbook('image_output.xlsx') worksheet = workbook.add_worksheet() image_paths = ['python.png', 'chart1.png', 'photo.jpg'] current_row, current_col = 1, 1 FIXED_OCCUPY_ROWS = 20 # 固定每张图占20行 PADDING_ROWS = 2 for img_path in image_paths: # 可通过x_scale和y_scale固定图片缩放比例 worksheet.insert_image(current_row, current_col, img_path, {'x_scale': 0.6, 'y_scale': 0.6}) current_row += FIXED_OCCUPY_ROWS + PADDING_ROWS workbook.close()
补充说明
- 插入图表的逻辑和图片完全一致,把
insert_image()替换为insert_chart()即可,同样支持行号列号参数 - 如果需要网格布局,只需要增加计数器,每放满N张图就换行重置列坐标即可
内容的提问来源于stack exchange,提问作者Aparna Vashishth
相关产品推荐
相关产品推荐

