【Python】デスクトップアプリ「Tkinter」でNW機器データをエクセルへ自動作成プログラム

Pythonでデスクトップアプリ「Tkinter」を使用し、GUIからSSH接続、コマンド入力で自動で出力結果をエクセルシート(範囲指定)に書き込むプログラムの流れを作成しました。

まだ完成はしていませんが、抽出したデータから必要な文字列、データを任意のセルに書き込むプログラムの流れとなっているので、参考にしてください。

Pythonデスクトップアプリ「Tkinter」を利用して出力したデータをエクセルへ自動反映

と言うことで、まずはこの「Tkinter」とは何かということですが。

「Tkinter」は、PythonでGUIを構築・操作するための標準ライブラリです。
Tkinterを起動すると以下のようなアプリでGUIで表示されます。

  • host:IPアドレス、またはホスト名入力
  • name:SSH接続した先のIDを入力
  • Password:パスワード入力
  • command:任意のコマンド入力。※今回は「show run」を入力

「Tkinter」ライブラリを利用したエクセル自動作成までのプログラム

今回はこの「Tkinter」を利用し、入力したデータからNW機器へSSH接続し、抽出データの指定のデータを抜き取り、エクセルへ書き込みます。
プログラムのコードは以下となります。

※ ssh_test_tkinter_00.py

import tkinter
import paramiko
import pandas as pd
import re
import openpyxl
from tkinter import messagebox


#「tkinter」実行ボタンがクリックされたら開始
def button_click():
    input_host_value = input_name.get()
    input_name_value = input_address.get()
    input_address_value = input_phone.get()
    input_command_value = input_command.get()


    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(input_host_value, username=input_name_value, password=input_address_value)

    stdin, stdout, stderr = client.exec_command(input_command_value)
    stdin.write(input_command_value)

    for o in stdout:
        with open('file.csv', 'a', newline='') as f:
            print(o, end='', file = f)

    for e in stderr:
        print(e)

    client.close()
    root.quit()
    

print('コンフィグ取得 > csvファイル保存完了')


# tkinter_ウインドウの作成
root = tkinter.Tk()
root.title("SSH_LOG_GET GUI")
root.geometry("350x120")

# host/IPaddress
input_name_label = tkinter.Label(text="host")
input_name_label.grid(row=1, column=1, padx=10,)

# host/IPaddress入力欄の作成
input_name = tkinter.Entry(width=40)
input_name.grid(row=1, column=2)


# userID
input_address_label = tkinter.Label(text="name")
input_address_label.grid(row=2, column=1, padx=10,)

# userID入力欄の作成
input_address = tkinter.Entry(width=40)
input_address.grid(row=2, column=2)


# パスワード
input_phone_label = tkinter.Label(text="password")
input_phone_label.grid(row=3, column=1, padx=10,)

# パスワード入力欄の作成
input_phone = tkinter.Entry(width=40)
input_phone.grid(row=3, column=2)


# コマンド
input_command_label = tkinter.Label(text="command")
input_command_label.grid(row=4, column=1, padx=10,)

# コマンド入力欄の作成
input_command = tkinter.Entry(width=40)
input_command.grid(row=4, column=2)

#ボタンの作成
button = tkinter.Button(text="実行ボタン",command=button_click)
button.place(x=10, y=80)

#ウインドウの描画
root.mainloop()


# 出力結果のスペースをカンマ区切りに変換
with open('file.csv', 'r', newline='') as file, 
    open('file_out.csv', 'w', newline='') as fileout:
    
    text = re.sub(r's* ', ',', file.read())
    print(text, file = fileout)
    print('置換完了')


# CSVファイルの読み込み
col_names = ['c{0:02d}'.format(i) for i in range(100)]
#data = pd.read_csv('file_out.csv', encoding="shift-jis", names = col_names)
data = pd.read_csv('file_out.csv', encoding='cp932', names = col_names)

# Excel形式で出力
data.to_excel('excel-data.xlsx', encoding='utf-8')

print('CSV > Excel変換完了')


#エクセルファイルのデータから「interface」 切り出し

#エクセルファイル読み込み
df = pd.read_excel('excel-data.xlsx')

#カラムc00列の「interface」の文字列抽出
data = df[df['c00'].str.contains('interface')]

#エクセルシートにデータ出力
data.to_excel('excel-data_find.xlsx', encoding='utf-8')

print('文字列:切り取り成功')


#セルとシート指定範囲読み取りと書き込み


wb =openpyxl.load_workbook('excel-data_find.xlsx')
wb.create_sheet('interface')

sheet = wb.get_sheet_by_name('Sheet1')
sheet2 = wb.get_sheet_by_name('interface')


for i in range(1,10):
    copy = sheet.cell(row = i, column = 4).value
#コピー元の列を定義
    sheet2.cell(row = i+10, column = 10, value = copy)
#Valueに指定した値を指定先の列に貼り付ける
    i += 1

wb.save('data.xlsx')


print('別シート「interface」への出力完了')
  • 10行目:def 「button_click」という関数を宣言 ※Tkinter起動
  • 19行目:Tkinterで入力した数値でSSHアクセス実施
  • 21行目:入力したコマンドをSSHアクセス先で実行 ※今回はshow runコマンド実施
  • 25,26行目:出力したデータをCSVファイルへ書き込み
  • 86行目〜:エクセルにセル単位で書き込めるように、出力結果のスペースをカンマ区切りに変換
  • 95行目〜:CSVファイルをエクセルに変換
  • 106行目〜:エクセルファイルのデータから「interface」 という文字列を切り出し
  • 120行目〜:セルとシート指定範囲で読み取りと書き込み

プログラム実行結果

本プログラムを実行すると、以下のようにTkinterが起動し必要項目を記入します。
それぞれSSH接続に必要な情報と、接続後のコマンドを入力します。

入力後、「実行ボタン」をクリックすると、SSHアクセスしたNW機器のデータを出力し、その中の任意の文字列データ(今回は「interface」)を抽出し、任意の任意のシートのセルに書き込みます。

PS C:Python> python .ssh_test_tkinter_00.py
コンフィグ取得 > csvファイル保存完了
置換完了
CSV > Excel変換完了
文字列:切り取り成功
.ssh_test_tkinter_00.py:128: DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).
  sheet = wb.get_sheet_by_name('Sheet1')
.ssh_test_tkinter_00.py:129: DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).
  sheet2 = wb.get_sheet_by_name('interface')
別シート「interface」への出力完了
PS C:Python>

「interface」のついた列のみの取得

指定で抜粋したデータを別シートの指定のセルに張り付けることに成功

全体のエクセルシートへの自動作成までのプログラムが完成したので、あとはエクセルのシートでパラメータシートを作成するプログラムを作っていきます。

最終的な完成版はこちらで随時更新をしていきます。

作成までに実施したプログラムに関しての情報は随時公開していきます。




エンジニアのオンライン学習

ITエンジニアにおすすめの教材、オンラインスクールです。
無料からエンジニアの学習ができる教材などまとめているので参考にしてください。

おすすめオンライン教材
自宅で学習ができるオンラインスクール

ITエンジニアの開発・検証・学習としてインターネット上で専用のサーバ(VPS)を利用しましょう!
実務経験はVPSで学べます。



コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

ABOUT US
げんき☆ひろき
インターネット関連のSEをやっています。 ネットワーク、サーバー、ストレージ、仮想基盤まで幅広く手を出しており、MVNOの構築経験もあります。 現在は、Pythonを使ったプログラミングの開発をしネットワークの自動化ツールを作成しています! Pythonの入門書も作成しているので、ぜひ参考にしてください!