Python プログラミング

Pythonでよく使うExcel操作集めた

概要

こっちの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()

-Python, プログラミング
-,