有没有一种方法可以在 Python 中一致地直观地导航 excel?

问题描述 投票:0回答:1

我希望自动化我的工作报告流程,其中涉及对同一工作簿中的多个 Excel 工作表进行屏幕截图。现在,我正在使用 pyAutoGui,它工作正常

我遇到的问题是一致性——虽然它在我的计算机上运行,但我需要这种自动化既可扩展,又可供其他人在他们的计算机上运行它并使其功能相同。这使得任何类型的“点击”功能都无法实现,因为我不知道用户正在运行什么屏幕尺寸(例如,显示器、笔记本电脑等)。不过,我确实知道它始终会在 Windows 计算机上运行。

我对 python 比较陌生,所以如果有些不清楚,我深表歉意,并将提供任何所需的说明。

事实上,我一直在完全使用热键来浏览 Windows 桌面和 Excel 界面——程序中的一键单击是单击全屏的“查找和替换”菜单,以确保当我使用热键时它位于前台。发送搜索键:

# open excel sheet on first time

    if (wbIndex == 0):

        pyg.press("win")

        time.sleep(1)

        pyg.write("[EXCEL NAME]", 0.01)

        time.sleep(1)

        pyg.press("enter")

        time.sleep(5)

        try:

            pyg.getWindowsWithTitle("[EXCEL WINDOW TITLE]")[0].maximize

        except:

            print("EXCEL SHEET NOT FOUND - Ending Program")

            quit()

        time.sleep(2)

    #open excel navigator to navigate to correct sheet
    pyg.hotkey("ctrl", "f")

    time.sleep(2)

    try:

        pyg.getWindowsWithTitle("Find and Replace")[0].maximize()

    except Exception as e:

        print("Could NOT find Search window -- exiting program.")

        time.sleep(15)

        quit()

    time.sleep(1)
    #click to bring search window to the foreground
    pyg.click(1400,600)

    time.sleep(0.5)
    #tab to the search menu for the find and replace meny
    pyg.press("tab")

    time.sleep(0.25)

    pyg.press("tab")

    time.sleep(0.25)
    #sheet title that I want
    pyg.write(clientName)

    time.sleep(0.5)
    #if it is first search, navigate to make sure it can search within workbook, not sheet
    if wbIndex == 0:

        pyg.press("right")

        time.sleep(0.25)

        pyg.press("tab")

        time.sleep(0.25)

        pyg.press("tab")

        time.sleep(0.25)

        pyg.press("down")

        time.sleep(0.25)

        pyg.press("down")

        time.sleep(0.5)

        pyg.press("enter")

        time.sleep(0.5)
    #navigate down to "next" button and press enter to navigate to the correct sheet
    pyg.press("enter")

    time.sleep(2)

    pyg.press("esc")

    time.sleep(1)
    ```
    That process gets me to the first page I need, at which point I screenshot. Then, I navigate to the next page I need, which will always be the following sheet.
    ```

    pyg.hotkey("ctrl", "pagedown")

    time.sleep(1)

    pyg.hotkey("ctrl", "g")

    time.sleep(0.25)
    #scroll up to first cell with cell navigation
    pyg.write("A1")

    time.sleep(0.1)

    pyg.press("enter")

    time.sleep(1)

然后我会再次截图。

同样,这个过程在我的计算机上有效,但在其他计算机上测试时,它非常不一致,我很好奇是否有更可靠的方法来执行此过程,可以减少错误。我最常见的错误是它无法找到并最大化查找和替换窗口,并且它不正确地导航查找和替换窗口。

我尝试过通过“alt + w”导航,然后通过“k”导航选项卡,但是,我遇到了无法自动关闭导航侧栏的问题,这会干扰我想要的屏幕截图自动捕捉。

python excel automation pyautogui
1个回答
0
投票

执行您似乎需要的一些功能的示例;

您可以将 Xlwings 与 'visible=' True 或 False 一起使用。如果为 True,那么您可以实时观察对工作表所做的更改,如果需要,可以暂停执行以查看更改。
您可以使用 Excel 查找/替换功能,通过简单的语法指定要查找的内容和要替换的内容。或者您可以设置所有/部分可用选项。请注意,代码使用源自 Xlwings 常量的 Excel 名称。如果愿意,您可以将它们替换为实际的枚举值,
例如

LookAt.xlPart
可以替换为值 2。

您可以使用几个选项将一系列单元格保存为图像,我在此处展示了如何复制到剪贴板并使用 Excel 中的 CopyPicture 选项。
Excels CopyPicture 有一些可以设置的选项,代码再次使用 Excel 名称,但可以使用枚举值。
您可以指定单元格范围或

used_range
,即所有具有值并以不同格式保存的单元格,PNG、JPG 等。

如果需要,您可以在完成时使用相同名称或新名称保存工作表,或者如果可以放弃更改,则可以保留此行。

import xlwings as xw
from xlwings.constants import LookAt, SearchOrder, PictureAppearance, CopyPictureFormat
from PIL import ImageGrab

xlReplaceFormula = 0  # Replace Formula (0)
xlReplaceFormula2 = 1  # Replace Formula 2 (1)

filepath = 'foo.xlsx'
sheetname = 'Sheet1'

searchfor = 'text1'
replacewith = 'text2'

with xw.App(visible=True) as app:
    wb = xw.Book(filepath)  # Load the Workbook 
    ws = wb.sheets[sheetname]  # Select the Sheet to use

    ### Find/Replace function
    # ws.used_range.api.Replace(text1, text2)  # Simple syntax
    ### Set all options
    ws.used_range.api.Replace(What=text1,
                              Replacement=text2,
                              LookAt=LookAt.xlPart,
                              SearchOrder=SearchOrder.xlByRows,
                              MatchCase=False,
                              SearchFormat=False,
                              ReplaceFormat=False,
                              FormulaVersion=xlReplaceFormula2
                              )

    ### Copy a data to save as an image
    ### Using copy
    # ws.range('A1:H20').copy(destination=None)  # Copy a range
    ws.range(ws.used_range).copy(destination=None)  # Copy the used range
    img = ImageGrab.grabclipboard()
    img.save('test_jpg.jpeg', 'JPEG')

    # ### Using CopyPicture
    # ws.range('A1:H20').api.CopyPicture(Appearance=PictureAppearance.xlScreen, Format=CopyPictureFormat.xlPicture)
    ws.range(ws.used_range).api.CopyPicture(Appearance=1, Format=-4147)  # Using enumerated values
    ws.api.Paste()
    image = ws.pictures[0]  # Should be one only in the list 
    image.api.Copy()
    img_png = ImageGrab.grabclipboard()
    img_png.save('test_png.png')

    ### Stop the execution to observe the Sheet at any time if desired
    input("Hit any key when ready!")

    ### Save the changes to the Sheet if required
    wb.save('foo_out.xlsx')

© www.soinside.com 2019 - 2024. All rights reserved.