【python办公自动化】如何在Excel表格里面插入对象

前言

用openpyxl处理Excel数据还是蛮舒服的。同时也可以插入图片,不过插入图片有个弊端,那就是,它只是把图片按比例缩小了。要看大图你得拉大来看,并不舒服。于是,想着能否插入对象文件。双击直接就能够打开图片来看。emmmm,好吧。果断使用win32com封装了个方法出来。

Excel插入对象文件

废话不多说,上代码

# 这个模块是用于excel表格操作的,
# 包括插入文件对象的
# 另存xls为xlsx


import os
import win32com.client


class ExcelInsert(object):
    def __init__(self, excel_file_path, sheet_name):
        """
        构造函数

        :param excel_file_path: 指定要操作的excel表格
        :param sheet_name: 指定要操作的excel表格的表
        :returns: None
        """
        self.filename = excel_file_path
        # self.excel = win32com.client.Dispatch('Excel.Application')  # 这个得在gencache.EnsureDispatch('Excel.Application') 有生成对应的缓存文件temp/gen_py/文件夹之后才能使用
        self.excel = win32com.client.gencache.EnsureDispatch('Excel.Application')  # 如果没有缓存文件,则生成缓存文件
        # self.excel.Visible = True  # 显式打开excel 调试设置True
        self.book = self.excel.Workbooks.Open(excel_file_path)
        self.sheet_name = self.book.Worksheets(sheet_name)

    def insert_obj(self, insert_file_path, col, row, auto_wh=False):
        """
        向Excel文件里面插入对象

        :param insert_file_path: 要插入文件的路径,可以插入图片、也可以插入文档等
        :param col: 指定要插入的列
        :param row: 指定要插入的行
        :param auto_wh: 根据对象文件自适应行高
        :returns: None
        """
        shape = self.sheet_name.Shapes.AddOLEObject(Filename=insert_file_path, Link=False)  # 插图片附件
        shape.Left = self.sheet_name.Cells(row, col).Left  # 把定位附件到指定单元格 单位:磅
        shape.Top = self.sheet_name.Cells(row, col).Top
        if auto_wh:
            self.sheet_name.Rows(row).RowHeight = shape.Height  # 行高
            self.sheet_name.Columns(col).ColumnWidth = shape.Width  # 列宽

    def save(self, name=None):
        """
        保存文件,name为自己想要命名文件的名字,不传的话,默认为"源文件名字+(new)"

        :param name: 传入自己要命令的文件名
        :returns: None
        """
        if not name:
            path_list = self.filename.split(".")
            path_list[-2] = path_list[-2] + "(new)"
            path = ".".join(path_list)
        else:
            path = os.path.join(os.getcwd(), name)
        if os.path.exists(path):
            os.remove(path)
        self.book.SaveAs(path)
        self.book.Close()
        self.excel.Application.Quit()

    def __del__(self):
        pass



if __name__ == '__main__':
    a = ["A", "B", "C", "D", "E"]
    path = os.getcwd()
    filename = "../temp/test.xlsx"
    filename = os.path.join(path, filename)
    img_name = os.path.join(path, "../temp/baiyu_logo.jpg")
    # img_name = os.path.join(path, "../temp/Aword.docx")

    excel = ExcelInsert(filename, "Sheet1")
    for col in a:
        excel.insert_obj(img_name, col, 20)
    excel.save()  # 调用保存方法

源代码例程

https://github.com/BaiYu96/ExcelOpera.git

结束语

1、有时候觉得当程序员也挺好的,能够通过自己的双手,通过Google,搜索出你要的解决方案,然后灵活的使用ctrl+c,ctrl+v把想法实现hhhhh

2、太难了,连excel表格都能有对象了。我。。。转念一想,程序员还怕没对象?new一个出来就好了hhhhhh

猜你喜欢

转载自blog.csdn.net/zhh763984017/article/details/107878200
今日推荐