我希望自动化我的工作报告流程,其中涉及对同一工作簿中的多个 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”导航选项卡,但是,我遇到了无法自动关闭导航侧栏的问题,这会干扰我想要的屏幕截图自动捕捉。
执行您似乎需要的一些功能的示例;
您可以将 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')