end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

appiumでexcelファイルを開き、セルに値を入力 - RPAもどき

手順としては、以下。

  1. WinAppDriverUiRecorder で対象となるセルのXPATHを求める
  2. find_element_by_xpath()でセルをappiumから接続
  3. そのセルをクリックすることで、選択
  4. send_keys()で値を入力

ただ、値の入力程度で、これだけの手間を要するのであれば、 openpyxl や xlrd の方がお手軽が印象です。

xlrd for python で excel (xlsx) を読む - end0tknr's kipple - 新web写経開発

# -*- coding: utf-8 -*-
from appium import webdriver
from selenium.webdriver.common.keys import Keys
import pyautogui
import win32gui
import time

def main():
    ## appiumで、アプリ起動
    desired_caps = {}
    desired_caps["app"] = r"c:\Users\end0t\Downloads\ないしょ_DEV_MACRO.xlsm"

    driver = webdriver.Remote(
        command_executor='http://127.0.0.1:4723',
        desired_capabilities= desired_caps)

    ## win32guiで、対象のアプリを探索
    time.sleep(2)
    app_handle = win32gui.FindWindow(None, "ないしょ_DEV_MACRO.xlsm  \[保護ビュー\] - Excel")
    print("APP HANDLE 0:",app_handle)
    
    ## pyautoguiで、ショートカット(ALT→F→I→E)を送信し、保護ビューを解除
    if app_handle > 0 :
        pyautogui.press('alt')
        time.sleep(1)
        pyautogui.press('F')
        time.sleep(1)
        pyautogui.press('I')
        time.sleep(1)
        pyautogui.press('E')

    time.sleep(2)

    ## pyautoguiで、ショートカット(CTRL+I)を送信し、マクロ実行
    ## (CTRL+Iのショートカットは、EXCEL上でALT+F8により設定画面表示)
    app_handle = win32gui.FindWindow(None, "最適テリトリー_DEV_MACRO.xlsm - Excel")
    print("APP HANDLE 1:",app_handle)

    if app_handle > 0 :
        pyautogui.hotkey('ctrl','i')


    ## とあるセルに値を入力
    ## (CTRL+Iのショートカットは、EXCEL上でALT+F8により設定画面表示)
    xpath_str = \
        "".join(["/Pane[@Name=\"デスクトップ 1\"][@ClassName=\"#32769\"]",
                 "/Window[@Name=\"ないしょ_DEV_MACRO.xlsm - Excel\"][@ClassName=\"XLMAIN\"]",
                 "/Pane[@ClassName=\"XLDESK\"]",
                 "/Tab[@Name=\"ないしょ_DEV_MACRO.xlsm\"][@ClassName=\"EXCEL7\"]",
                 "/TabItem[@Name=\"シート 数_旬別\"]",
                 "/DataGrid[@Name=\"グリッド\"]/DataItem[@Name=\"B1\"]"])
    try:
        xls_cell = driver.find_element_by_xpath(xpath_str)
        xls_cell.click()
        xls_cell.send_keys("HOGE FOO")
        time.sleep(5)
    except Exception as e:
        pass  ## version check画面が単に見つからない場合、無視して進みます

        
    ## 終了
    driver.quit()


if __name__ == '__main__':
    main()