Python 学习笔记:把图片文件导入 xlsx 文件

原文地址

背景

现在有一个 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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值