背景
现在有一个 xlsx 文件,表格中的第一列的每一行的代表一个点位信息(点名),每个点每个对应四幅图像,这些图像的命名都包含了点名。那么,如何创建一个新的 xlsx 文件,把点名和对应的图像导入到 xlsx 文件中呢?
代码
import pandas as pd
import os
import xlsxwriter
from PIL import Image
#t 查看存储点位信息的文件
df = pd.read_excel(exmpl.xlsx)
df.columns # 查看各个列
#t 查看存储图像的文件夹
path = r"F:\xxx\photos"
pics = os.listdir(path)
#t 定义新的 workbook 和 worksheet
# workbook 就是整个文件
# worksheet 就是文件里的子标签页
book = xlsxwriter.Workbook("point.xlsx")
sheet = book.add_worksheet("point")
#t 写入列名
sheet.write("A1", "point_ID") # (位置, 文本)
sheet.write("B1", "photo")
sheet.write_column(1, 0, df.formID.values.tolist()) # 写入点位名(一列),这一列从(行=1,列=0)开始写
#t 固定图片大小,调整单元格大小
image_width = 120
image_height = 160
cell_width = 5
cell_height = 160
sheet.set_column("B:E", cell_width*4) # 设置单元格列宽;从 B到E(inclusive),每一列都是cell_width 的宽度
#t 调节图片大小并插入图片
# 下一步原本可以直接插入图片了,但是,因为图片的维度不一样,所以需要求出图片维度与目标维度的比例
for i in range(len(df.formID.values.tolist())):
for prefix in ['a', 'b', 'c', 'd']: # 四列对应四个前缀
if prefix+df.formID.values.tolist()[i] + ".jpg" in pics:
x_scale = image_width / (
Image.open(os.path.join(path, prefix+df.formID.values.tolist()[i] + ".jpg")).size[0]
) # 目标宽度/要插入图片的宽度
y_scale = image_height / (
Image.open(os.path.join(path, prefix+df.formID.values.tolist()[i] + ".jpg")).size[1]
) # 目标高度/要插入图片的高度
sheet.set_row(i + 1, cell_height) # 设置行高
##t 插入文件
if(prefix == "a"):
sheet.insert_image(
"B{}".format(i + 2), # 前缀为a的图像出入B列
os.path.join(path, prefix+df.formID.values.tolist()[i] + ".jpg"),
{"x_scale": x_scale, "y_scale": y_scale, "x_offset": 15, "y_offset": 20},
) # 设置一下x_offset和y_offset让图片居中
elif(prefix == "b"):
sheet.insert_image(
"C{}".format(i + 2),
os.path.join(path, prefix+df.formID.values.tolist()[i] + ".jpg"),
{"x_scale": x_scale, "y_scale": y_scale, "x_offset": 15, "y_offset": 20},
)
elif(prefix == "c"):
sheet.insert_image(
"D{}".format(i + 2),
os.path.join(path, prefix+df.formID.values.tolist()[i] + ".jpg"),
{"x_scale": x_scale, "y_scale": y_scale, "x_offset": 15, "y_offset": 20},
)
else:
sheet.insert_image(
"E{}".format(i + 2),
os.path.join(path, prefix+df.formID.values.tolist()[i] + ".jpg"),
{"x_scale": x_scale, "y_scale": y_scale, "x_offset": 15, "y_offset": 20},
)
book.close() # 这一行必须加,否则 point.xlsx 不会被保存
参考
https://zhuanlan.zhihu.com/p/212187337