Python 之 Excel 截图

Python 之 Excel 截图

win32 截图

# win32 截图
def winPic(excel_path):
    # file='截图.xlsx'
    # file_name = os.path.abspath(file)  # 把相对路径转成绝对路径
    pythoncom.CoInitialize()  # 开启多线程
    # 创建Excel对象
    excel = DispatchEx('excel.application')
    excel.visible = False         # 不显示Excel
    excel.DisplayAlerts = 0     # 关闭系统警告(保存时不会弹出窗口)
    # excel.ScreenUpdating = 1    # 关闭屏幕刷新

    workbook = excel.workbooks.Open(excel_path)  # 打开Excel文件
    sheet = workbook.worksheets['截图']
    img_name = '截图'
    screen_area = sheet.UsedRange  # 有内容的区域
    screen_area.CopyPicture()  # 复制图片区域
    sheet.Paste()  # 粘贴
    excel.Selection.ShapeRange.Name = img_name  # 将刚刚选择的Shape重命名,避免与已有图片混淆
    sheet.Shapes(img_name).Copy()  # 选择图片
    img = ImageGrab.grabclipboard()  # 获取剪贴板的图片数据
    # time.sleep(2)
    print(img)  # 可以弄个报错
    img.save(img_name + ".png")
    workbook.Close(False)  # 关闭Excel文件,不保存
    excel.Quit()  # 退出Excel
    pythoncom.CoUninitialize()  # 关闭多线程

Excel xlwings制作图片

# Excel xlwings制作图片
def xlwingsPic(excel_path, name):
    print('分析数据:'+name)
    app = xw.App(visible=True, add_book=False)
    # 1. 使用 xlwings 的 读取 path 文件 启动
    wb = app.books.open(excel_path)
    # 2. 读取 sheet
    sht = wb.sheets[0]
    # 3. 获取 行与列
    nrow = sht.used_range.last_cell.row
    ncol = sht.used_range.last_cell.column
    # 自动调整单元格大小。
    sht.autofit()
    # 合并‘合计’单元格
    Brow = 'C' + str(nrow)
    Hrow = 'I' + str(nrow)
    mer = Brow+':'+Hrow
    sht.range(mer).api.Merge()
    heji = sht.range(Hrow)

    # 4. 获取有内容的 range
    range_val = sht.range(
        (1, 3),  # 获取 第一行 第一列
        (nrow, ncol-1)  # 获取 第 nrow 行 第 ncol 列
    )
    # 设置背景色
    range_val.color = (255, 255, 255)
    # 设置单元格的对齐方式
    range_val.api.HorizontalAlignment = -4108    # -4108 水平居中。 -4131 靠左,-4152 靠右。
    # range_val.api.VerticalAlignment = -4130      # -4108 垂直居中(默认)。 -4160 靠上,-4107 靠下, -4130 自动换行对齐。

    # ‘合计’右对齐
    heji.api.HorizontalAlignment = -4152

    # Borders(9) 底部边框,LineStyle = 1 直线。2 虚线。 5 双点划线。4 点划线。
    range_val.api.Borders(9).LineStyle = 1
    range_val.api.Borders(9).Weight = 2               # 设置边框粗细。

    # Borders(7) 左边框
    range_val.api.Borders(7).LineStyle = 1
    range_val.api.Borders(7).Weight = 2

    # Borders(8) 顶部框
    range_val.api.Borders(8).LineStyle = 1
    range_val.api.Borders(8).Weight = 2

    # Borders(10) 右边框
    range_val.api.Borders(10).LineStyle = 1
    range_val.api.Borders(8).Weight = 2

    # 区域的单元格,内部边框
    # # Borders(11) 内部垂直边线。
    range_val.api.Borders(11).LineStyle = 1
    range_val.api.Borders(11).Weight = 2
    # # Borders(12) 内部水平边线。
    range_val.api.Borders(12).LineStyle = 1
    range_val.api.Borders(12).Weight = 2

    # 5. 复制图片区域
    range_val.api.CopyPicture()
    time.sleep(0.5)
    # 6. 粘贴
    sht.api.Paste()
    pic = sht.pictures[0]  # 当前图片
    pic.api.Copy()

    time.sleep(0.5)
    # 获取剪贴板的图片数据
    im = ImageGrab.grabclipboard()
    time.sleep(5)
    riqi = str(time.strftime("%Y-%m-%d", time.localtime()))
    ImageAdd = 'D:\\AutoSend\\Image\\' + str(riqi + name) + '.png'

    # 判断图片是否正确
    if isinstance(im, Image.Image):
        # print ("Image: size : %s, mode: %s" % (im.size, im.mode))
        im.save(ImageAdd)
    elif im:
        for filename in im:
            try:
                print("filename: %s" % filename)
                im = Image.open(filename)
            except IOError:
                pass  # ignore this file
            else:
                print("ImageList: size : %s, mode: %s") % (im.size, im.mode)
    else:
        print("clipboard is empty.")

    pic.delete()  # 删除sheet上的图片

    wb.close()  # 不保存,直接关闭
    app.quit()  # 退出
    # 返回图片保存地址
    return ImageAdd
posted @   Ivan丶ky  阅读(1765)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示