概要
こっちのExcelから値貼り付けて
別のExcelで、パワークエリなるものを実行して
また別の。。。。あーーーーーーーー
ってなったことがあった。
正直そのExcelでやっている作業自体、簡単なPythonプログラムで実装可能だが
数値検証は終わっている先人の物を全部書き換えるのは現実的じゃないってシチュエーション
そんな時操作だけを自動化したプログラムを作った。
後々使いそうなロジックは、クラス化しておいた。
利用環境
>
Python 3.9.0
Visual Studio Code 1.52.0
openpyxl
xlwings
pandas
>
ソースコード
openpyxl,xlwings,pandas を適材適所でって感じかな
#Python Excel操作ライブラリ
#よくありそうな、操作をライブラリ化
import xlwings as xw
import openpyxl
class lib_excel_ope:
#コンストラクタ 現在のところ処理無し
def __init__(self):
pass
def exec_macro(self,xlsm_name:str,macro_name:str):
#マクロの実行 xlwings
wb = xw.Book(xlsm_name) # ブックを開く
macro = wb.macro(macro_name) # マクロを取得
macro() # マクロを実行
wb.save(xlsm_name)
wb.close
apps = xw.apps # アプリ実行環境管理インスタンスを返す
app = apps.active
app.kill()
def copy_cell(self,frompath:str,topath:str,fromsheet:str,tosheet:str,fromrow:int,torow:int,frmcol:int,tocol:int):
#指定したシートをコピペ
#範囲の指定の仕方は、対象範囲以内という条件 pythonの終了条件側で + 1
wb1 = openpyxl.load_workbook(frompath)
wb2 = openpyxl.load_workbook(topath)
ws1 = wb1[fromsheet]
ws2 = wb2[tosheet]
for rownum in range(fromrow, torow + 1):
for colnum in range(frmcol, tocol + 1):
cellstr = ws1.cell(row=rownum,column=colnum).coordinate
ws2[cellstr] = ws1[cellstr].value
wb2.save(topath)
def check_effctive_cell(self,filename:str,sheetname:str,checkcol:int):
#どこまで有効行か確認
wb1 = openpyxl.load_workbook(filename)
ws1 = wb1[sheetname]
#とりあえず、MAXは1000行までと仮定
for rownum in range(1, 1000):
cellstr = ws1.cell(row=rownum,column=checkcol).coordinate
if ws1[cellstr].value is None :
return rownum - 1 #有効行はNone の1行前
wb1.close()
def ifnone_round(self,cellvalue):
if cellvalue is None:
return cellvalue
else:
return round(cellvalue)
#デスクトラクタ現在のところ処理なし
def __del__(self):
pass
if __name__ == '__main__':
#単体テスト用のコード
#Python Excel操作ライブラリ
exlopeobj = lib_excel_ope()