python实现Excel指定区域截图

方法一:xlwings

import os.path
import uuid
from io import BytesIO
from typing import Union

import xlwings as xw
from PIL import ImageGrab


def excel_grab(excel_path, sheet_name: Union[str, int] = 0, cell_area=None, pic_path=None, visible=False, saved=True):
    """
    Excel指定区域截图
    :param excel_path: Excel文件路径
    :param sheet_name: 工作表名称或索引,0即第一张工作表
    :param cell_area: 截图区域,默认None。'A2:N17', 不指定时获取有内容的区域截图
    :param pic_path: 截图文件路径,png格式
    :param visible: 截图时是否打开显示Excel
    :param saved: 是否将截图保存到本地
    :return: png路径 或 图片的bytes
    """
    app = xw.App(visible=visible, add_book=False)
    wb = app.books.open(excel_path)
    if isinstance(sheet_name, str):
        sheet = wb.sheets(sheet_name)
    else:
        sheet = wb.sheets[sheet_name]
    if cell_area:
        pic_area = sheet[cell_area]
    else:
        pic_area = sheet.used_range  # 获取有内容的range
    try:
        pic_area.api.CopyPicture()  # 复制图片区域
        sheet.api.Paste()
        pic = sheet.pictures[0]  # 当前图片
        pic.api.Copy()
        pic.delete()  # 删除sheet上的图片
    except Exception as e:
        return f'区域【{cell_area}】截图失败,错误:{e}'
    finally:
        wb.close()
        app.quit()

    try:
        img = ImageGrab.grabclipboard()  # 获取剪贴板的图片数据
    except Exception as e:
        return f'区域【{cell_area}】从剪贴板获取截图失败,错误:{e}'
    if saved:
        if not pic_path:
            pic_path = f'{os.path.splitext(excel_path)[0]}_{uuid.uuid4().hex[:10]}.png'
        img.save(pic_path)
    else:
        f = BytesIO()
        img.save(f, 'png')
        img_data = f.getvalue()
        f.close()
    return pic_path if saved else img_data

方法二:win32com

import os.path
import uuid
from io import BytesIO
from typing import Union

from PIL import ImageGrab
from win32com.client import Dispatch


def print_excel(excel_path, sheet_name: Union[str, int] = 1, screen_area=None, pic_path=None, visible=False, saved=True):
    """
    Excel指定区域截图
    :param excel_path: Excel文件路径
    :param sheet_name: 工作表名称,或索引,1即第一个工作表
    :param screen_area: 截图区域,默认None。'A2:N17', 不指定时获取有内容的区域截图
    :param pic_path: 截图保存路径
    :param visible: 截图时是否打开显示Excel
    :param saved: 是否将截图保存到本地
    :return: 截图路径或截图的bytes
    """
    excel = Dispatch("Excel.Application")  # 启动excel,WPS使用Ket.Application或et.Application
    excel.Visible = visible  # 可视化
    excel.DisplayAlerts = False  # 是否显示警告

    wb = excel.Workbooks.Open(excel_path)  # 打开excel
    if isinstance(sheet_name, str):
        ws = wb.Sheets(sheet_name)
    else:
        ws = wb.Sheets[sheet_name]

    try:
        # 复制图片区域
        if screen_area:
            ws.Range(screen_area).CopyPicture()
        else:
            ws.UsedRange.CopyPicture()
        ws.Paste()  # 粘贴
        ws.Shapes(excel.Selection.ShapeRange.Name).Copy()  # 选择图片

        img = ImageGrab.grabclipboard()  # 获取剪贴板的图片数据
        if saved:
            if not pic_path:
                pic_path = f'{os.path.splitext(excel_path)[0]}_{uuid.uuid4().hex[:10]}.png'
            img.save(pic_path)
        else:
            f = BytesIO()
            img.save(f, 'png')
            img_data = f.getvalue()
            f.close()
    except Exception as e:
        print(f'区域【{screen_area}】截图失败,错误:{e}')
    finally:
        wb.Close(False)  # 不保存关闭工作薄
        excel.Quit()
        return pic_path if saved else img_data
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Python截取Excel指定区域并生成图片,首先需要安装openpyxl和PIL库,openpyxl用于处理Excel文件,PIL用于生成图片。 首先,我们需要打开Excel文件,然后选择指定区域。可以通过openpyxl库中的load_workbook函数进行打开,并使用active属性或者获取sheet之后使用cell函数来定位需要截取的区域。 接下来,可以使用PIL库中的Image模块来创建一个新的图片对象。然后,通过遍历Excel指定区域的内容,并将其添加到图片对象中相应的位置。 最后,可以使用PIL库的save函数将图片保存到本地磁盘。 整个过程的代码可以分为以下几个步骤: 1. 导入openpyxl和PIL库 2. 打开Excel文件 3. 选择指定区域 4. 创建一个新的图片对象 5. 将Excel指定区域的内容添加到图片对象中 6. 保存图片到本地磁盘 一个简单的示例代码如下: ```python import openpyxl from PIL import Image, ImageDraw # 打开Excel文件 wb = openpyxl.load_workbook('example.xlsx') sheet = wb.active # 选择指定区域 cell_range = sheet['A1:C3'] # 创建一个新的图片对象 img = Image.new('RGB', (300, 300), color = (255, 255, 255)) draw = ImageDraw.Draw(img) # 将Excel指定区域的内容添加到图片对象中 for row in cell_range: for cell in row: draw.text((cell.column * 100, cell.row * 100), cell.value, fill=(0, 0, 0)) # 保存图片到本地磁盘 img.save('output.png') ``` 这样就可以使用Python截取Excel指定区域并生成图片了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值