Excelで作ったデータ表をDB(MySQL)に簡単な操作でセットするPythonのツール

Python で、Excelファイルを受け取り MySQL DBに簡単にデータをセットする。
PCで実行するので、用意する Python スクリプトは、pyinstaller で EXE化をする。
DB接続情報とシートにデータを書き込んだ Excel ファイルを
ドラッグアンドドロップPython スクリプトEXEファイルに送れば、接続から
データのインサートまでやってくれる。

仕様は、、、
Excelファイルは「接続情報」という名のシートを必ず用意する。
・「接続情報」シートは以下の通り、

・「接続情報」シートに書く、host名などこの書式(セルの位置)を崩してはならない。このフォーマット守ること。
・INSERTするテーブル名のシート名にデータを書く
・INSERTするテーブルのシートは、必ず1行目にテーブルカラム名を記載する
・2行目以降に格納するデータを記載する。
・サポートするデータ型は、Excelのセルの書式に依存して、文字列、数値、TimeStamp(日付時刻)
・日付時刻は、yyyy/MM/dd HH:mm:ss の書式
・空セルは、NULLでINSERT する
シート名のテーブルに対して、TRUNCATE TABLE を実行してから INSEERT を行う。
記載したテーブルの値の主キー重複違反などのチェックは実行しないので、データ記載に注意すること。
・実行後は、Python の os.system("PAUSE") 実行により DOSコマンドプロンプトで何かキーをクリックするまで終了しない

Python スクリプトは、以下でこれを PyInstaller で EXE化すればよい

# -*- coding: utf-8 -*-
#  VsetMySQL.py : Excel → mysql データセット
#
import os
import sys
import mysql.connector
import openpyxl
import datetime
from traceback import format_exception

class VsetMySQL():
    def __init__(self, file):
        self.file = file
        self.book = openpyxl.load_workbook(self.file)
    def transaction(self, truncatesql, sql):
        sheet = self.book['接続情報']
        try:
            connect = mysql.connector.connect(host=sheet["B1"].value, port=sheet["B2"].value, user=sheet["B3"].value,
                                              password=sheet["B4"].value, database=sheet["B5"].value, charset=sheet["B6"].value)
            cur = connect.cursor()
            cur.execute(truncatesql)
            cur.execute(sql)
            connect.commit()
        except BaseException as e:
            connect.rollback()
            print(''.join(format_exception(type(e), e, e.__traceback__)))
        finally:
            connect.close()
    def cellToValue(self, cell):
        if type(cell) is str:
            return "'%s'" % cell
        elif type(cell) is int:
            return "%d" % cell
        elif type(cell) is datetime.datetime:
            return "'%s'" % cell.strftime('%Y-%m-%d %H:%M:%S')
        elif cell is None:
            return "NULL"
    def execute(self):
        for table in [e for e in self.book.sheetnames if e != "接続情報"]:
            sql1 = "TRUNCATE TABLE " + table + ";"
            sheet = self.book[table]
            row = list(sheet.values)
            sql = "INSERT INTO %s (%s)VALUES" % (table, ", ".join(row[0]))
            ary = []
            for r in row[1:]:
                l = ", ".join(list(map(lambda x: self.cellToValue(x), r)))
                ary.append("(" + l + ")")
            sql2 = "%s\n%s\n;" % (sql, ",\n".join(ary))
            print(sql1)
            print(sql2)
            self.transaction(sql1, sql2)
if __name__ == '__main__':
    args = sys.argv
    if len(args) == 2:
        if os.path.isfile(args[1]):
            vset = VsetMySQL(args[1])
            vset.execute()
        else:
            print("Not Found %s" % args[1])
    else:
        print("Usage: VsetMySQL.exe file")
    os.system("PAUSE")