PythonでExcelデータをWindowsソフト(税務ソフト)へ自動入力。openpyxl・pyautogui・pyperclip。

Python(パイソン)でプログラミングし、Excelデータをソフトへ入れる方法をまとめてみました。

ex-it_08

Pythonでマウス操作・キーボード操作をするなら、pyautogui

今回の事例は、こういったものです。

ExcelデータをWindowsソフト(税務ソフト)に入力します。

同じPC内ソフト、データを取り込むなり連動できればいいのですが、残念ながらできません。
そのため、Pythonというプログラミング言語で、
・Excelからデータを読み取る
・ソフトへ入力する
ということをやっています。

そのPythonは、必要な時に必要なだけ仲間の力を借りることができるのです。

ドラゴンボールでいえば、
・何かを切断したいならクリリンに出てきてもらい、気円斬。
・敵の動きを止めたいなら、チャオズに出てきてもらい、超能力で止める
・体力を回復したいなら、恐れ多いのですが神様のデンデに出てきてもらい、回復してもらう

ワンピースでいえば、
・おなかが空いたら、サンジに出てきてもらい、料理を作ってもらう
・船を動かすなら、ナミに出てきてもらい、方角を見てもらう
・強敵が出会えば、ゾロに出てきてもらい、戦ってもらう

という感じです。

Pythonではその仲間を「ライブラリ」といい、インストールして、インポートします。
今回は、入力するという場面で、力を借りるのは、pyautoguiです。
これ、わけると、py(Python),auto(自動)、GUIとなります。
GUIとは、Graphical User Interface。
マウスでクリックしたり、タッチしたりして操作できることです。

pyautoguiは、関連してキーボード操作もできます。

Pythonの基本はこちらの記事で書きました。
PythonとEXCELマクロ比較。Pythonの導入・設定【Windows・Mac両対応】 | EX-IT

このライブラリをインストールしましょう。
インストールは最初の1回で大丈夫です。
コマンドプロンプトを使うなら、
pip install pyautogui
Macのターミナルなら
pip3 install pyautogui

Pythonではこう書いて、インポート(import)します。
インポートとは、ライブラリを使うという意味で毎回必要です。
as 〇〇
で、プログラミング中は、〇〇と表現するということにできます。
pyautoguiだと長いので、pgとしました。

import pyautogui as pg

 

pyautoguiは、

・pyautogui.click(〇、〇)で、座標〇・〇をクリック

・pyautogui.typewrite(〇〇)で、タイピング

・pyautogui.press(〇)でキーを押す

といったことができます。

たとえば、「普通預金」と入力するなら、

pyautogui.typewrite(‘普通預金’)

といれればいいはずです。

(文字は、’で囲むというルールです)

しかしながら、うまくいきません。

日本語は、typewriteで使えないのです。

そこで、コピー、貼り付けを使います。

Excelからデータをコピーして、それをソフトに貼り付けます。

コピーして貼り付けには、pyperclipというライブラリがありますので、インストールしておきましょう。

また、Excelを使うので、openpyxlというライブラリも必要です。

 

Pythonで、Excelから読取

PythonでExcelからデータを読み取ります。

openpyxlをインポートし、xlという名前で今後使うとし、

Excelファイルを開き(ファイル名の前にrをつけておきます)、

シートを指定します。

シートの指定は、開いたそのシートという指定をしました。

vがついているのは変数で、任意です。

 

# Excelを準備
import openpyxl as xl

Excelファイルを開く

v_wb = xl.load_workbook(r’C:\Users\info0\Dropbox\預金残高サンプル.xlsx’)

Excelシートを指定

v_ws = v_wb.active

こういったデータでシートを読み取っていきましょう。

ex-it_13

変数v_typeに「種類」を入れると考え、まずは、セルA2の「当座預金」を入れていきます。

 

v_type = v_ws['a2’].value

とし、

print(v_type)

で、出力してみましょう。

無事に、「当座預金」と出てくればOKです。

他も同様に書いてみましょう。

金融機関名は、ソフトの都合上、金融機関名と支店名をくっつけています。

プリントすると、2行目は無事とれている感じです。

Pythonを書くソフトは、Pycharmを使っています。

ex-it_15

 

 

Pythonで、Windowsソフトへ入力

次にExcelからとってきたデータをコピーして、ソフトに貼り付けます。

 

入力開始位置の座標を調べる

ソフトに入力するには、その入力開始位置がどこかを指定する必要があります。

RPAなら、操作を記録できるので、記録モードにしてクリックすればすむのですが、Pythonはそうはいきません。

その位置の座標(X、Y)を指定する必要があります。

PCの画面のこの位置がX、Yともにいくつかということです。

image

 

Pythonを書くソフトPycharmでは、下の[Pythonコンソール]を使います。

>>のあとにプログラムを書き、実行すると、その結果が表示できるのです。

image

import pyautogui

でインポートし、

pyautogui.position()

と入れ、マウスカーソルを座標に置いてEnterを押せば、その座標を表示してくれます。

この座標をプログラムで使うのです。

 

image

これをおもしろい!と思うかどうかはプログラミングを使うかどうかの分かれ目でもあります。

ただ、ペチペチ入力する人生から舵を切りたいなら、面白いと思わないまでも、やってみましょう。

このときの注意点は、

・ソフトの位置を決めて、座標を調べるときとプログラムを実行するときを同じにする

ということです。

私は、Windowsキー+左を押した位置にしています。

これなら確実ですので。

また、解像度が異なるPCではこの座標を変える必要があります。

PCの解像度を調べて、それぞれの位置を読み取るというプログラムも書くことはできますが。

その座標をこのように表現し、クリックします。

開始位置さえ決まれば、あとは、TabやEnterでカーソルを動かせるはずです。

 

# 入力開始位置を指定
pg.click(170, 247)

コピーして貼り付け

Pythonでコピー貼り付けには、

コピーに使うライブラリ pyperclip (pcとして使う)

貼り付けに使うライブラリ pyautogui (pgとして使う)

を使いましょう。

 

import pyautogui as pg
import pyperclip as pc

Excelからとったデータは、

v_type = v_ws['a2’].value

です。

これを、コピーするには、

 

pc.copy(v_type)

と書きます。
(pcは、pyperclip)

貼り付けは、ショートカットキーのCtrl+Vを使うので、 pg.hotkey('ctrl’, 'v’) と書きます。 (pgは、pyautogui)

ここまで書いて実行してみて、うまくいけばOKです。

image

このあとにどうカーソルを動かすかを考えます。 「当座預金」と入力して、Tab、Tabで次の入力位置に行きますので、そのように書きましょう。

image

Tabを押すにはこう書きます。

pg.press('tab’)

2回押すなら、プログラムをコピーしてもいいのですが、こういう書き方ができます。

pg.press('tab’, presses=2)

 

こうやってすべての項目について書いてみましょう。

# Excelを準備
import openpyxl as xl

# Excelファイルを開く
v_wb = xl.load_workbook(r'C:\Users\info0\Dropbox\預金残高サンプル.xlsx')

# Excelシートを指定
v_ws = v_wb.active

# 種類
v_type = v_ws['a2'].value

import pyautogui as pg
import pyperclip as pc

# 入力開始位置を指定
pg.click(170, 247)

# 繰り返し

pc.copy(v_type)
pg.hotkey('ctrl', 'v')
pg.press('tab', presses=2)

# 金融機関名
v_bank = v_ws['b2'].value + ' ' + v_ws['c2'].value

pc.copy(v_bank)
pg.hotkey('ctrl', 'v')
pg.press('tab', presses=1)

# 口座番号
v_num = v_ws['d2'].value

pc.copy(v_num)
pg.hotkey('ctrl', 'v')
pg.press('tab', presses=1)

# 期末現在高
v_amount = v_ws['e2'].value

pc.copy(v_amount)
pg.hotkey('ctrl', 'v')
pg.press('tab', presses=3, pause=1.0)

 

これで動けば、1行をうまく入力できたということです。

最後の行で、

pg.press('tab’, presses=3, pause=1.0)

としました。

これはRPAにもあることで、イケてないソフトほどついてこれないのです。

そのため、pauseで1秒とめています。

(これ、DIOのザ・ワールドのようで大好きです)

 

繰り返し部分をつくる

以上のプログラムを、Excelの2行目から7行目まで繰り返します。

Pythonの繰り返しは、

for i in range(〇,△):

で〇から△まで繰り返します。

この場合は、2から7行目なので、

for i in range(2,8):

です。

7行目までなので8と指定します。

 

for i in range(2, 8):
    v_type = v_ws['a' + str(i)].value

とすれば、iに2、3、4、5、6、7と入り、7行目まで繰り返してデータをとってきてくれるわけです。 iはPythonの場合、str(i)と文字列(string)にします。 なお、Pythonのforは、その下でインデントをつけた(Tabキー1回)部分を繰り返すというしくみです。

その他、金融機関名、口座番号、期末現在高も同様にとってくるように書きます。

ただ、「7行目」というのをヒトが数えて毎回書き直すのは面倒です。

これもPythonに数えてもらいましょう。

for i in range(2, v_ws.max_row + 1):

 

とすれば、最大行の7に1を足した8とすることできます。

データが増減しても、プログラムを変更する必要はありません。

完成版はこうなります。

ソフトによって、読み取る場所や、クリック位置を変更すれば使えるはずです。

なお、毎回データを削除するのがめんどくさいので、

データ削除

for i in range(7):

pg.click(31, 269)

pg.press('delete’, pause=1.0)

という削除のプログラムも入れています。

この場合は、7回繰り返すというプログラムです。

 

# Excelを準備
import openpyxl as xl

# Excelファイルを開く
v_wb = xl.load_workbook(r'C:\Users\info0\Dropbox\預金残高サンプル.xlsx')

# Excelシートを指定
v_ws = v_wb.active

import pyautogui as pg
import pyperclip as pc

# データ削除
for i in range(7):
    pg.click(31, 269)
    pg.press('delete', pause=1.0)

# 入力開始位置を指定
pg.click(170, 247)

# 繰り返し
for i in range(2, v_ws.max_row + 1):
    # 種類
    v_type = v_ws['a' + str(i)].value

    pc.copy(v_type)
    pg.hotkey('ctrl', 'v')
    pg.press('tab', presses=2)

    # 金融機関名
    v_bank = v_ws['b' + str(i)].value + ' ' + v_ws['c' + str(i)].value

    pc.copy(v_bank)
    pg.hotkey('ctrl', 'v')
    pg.press('tab', presses=1)

    # 口座番号
    v_num = v_ws['d' + str(i)].value

    pc.copy(v_num)
    pg.hotkey('ctrl', 'v')
    pg.press('tab', presses=1)

    # 期末現在高
    v_amount = v_ws['e' + str(i)].value

    pc.copy(v_amount)
    pg.hotkey('ctrl', 'v')
    pg.press('tab', presses=3, pause=1.0)

 

この事例、RPAツールのUiPathと比べてみても興味深いです。
とっつきやすさや記録のしやすさは、RPAのほうが上ですが、

・特定のソフトに依存しない

・構造がシンプル

・プログラムを書きやすい

という点では、Pythonが上です。
完全無料ですし。

RPAもどっちみちプログラミングの知識が必要ですし、プログラミングしなければいけない部分もあります。
RPAでプログラミングの基礎を学び、PythonやExcelマクロに入るのもおすすめです。

UiPath(RPA)×Excel。Excelから税務ソフト(JDL勘定科目内訳明細書)へロボットが入力 | EX-IT


■編集後記

昨日は、RPAのイベントへ。
六本木ヒルズ近くだったので、合間に森美術館の「建築の日本展」へ。
絵はあんまりですが、建築・建造物は興味あります。

夕方は、AI本の打ち合わせ。

夜は、ようやく、ようやくゼルダの伝説ブレスオブワイルドをクリア。
7月から再スタートし、ダウンロード版を買って読込時間を短縮し、途中で最初からやり直しつつ。
トータルプレイ時間200時間は行ってるかと。
そして、その後、オクトパストラベラーをはじめましたとさ。

■昨日の1日1新

※詳細は→「1日1新」

森美術館
スカイビュー
ヒルズ ロブションのパン
Bizroboイベント
建築の日本展

■昨日の娘日記

昨日で1歳半。
保育園の食事も幼児食に。
食材が変わったり、うどんが長くなったりするそうで。
お祝いにおもちゃを買いに。
(いつも買ってはいるのですが)
好きなカエルのぬいぐるみと、動物カードを買いました。

動物カードは、2つに分かれていて組み合わせるもの。
頭の体操にもよさそうです。
好きな、サル、ワニ、カメ、ゾウもいます。