PythonでEXCEL操作を自動化する方法が簡単すぎた驚きの手順

スポンサーリンク
Python

この記事を読むと、Pythonを使ったEXCEL操作を自動化する方法が分かります。

たくさんのEXCELファイルを、間違えずに修正しなくてはならず、つかれる。
同じ操作の繰り返しで、手順を間違えそうで、つらい。
短期間でたくさんのEXCELファイルを修正する必要があり、手作業では間に合わない。
VBAで、たくさんのEXCELファイルを操作する方法がわからない。
openpyxlで、Excelの図形が消えて困った

こんな悩みを持っていましたが、Pythonを使ってプログラムを作ったところ、簡単に自動化でき、驚きました。
具体的な方法をお伝えします。

スポンサーリンク

はじめに

使用した環境

  • macOS Sonoma バージョン 14.2.1
  • Python Version 3.11.5
  • openpyxl 3.1.2

【注意点】EXCEL操作のライブラリを使う場合に、注意すること。

EXCEL操作が可能なライブラリは、主に2種類(openpyxlと、xlwings)あります。
特徴と注意点が異なるため、使う際には、注意が必要です。

特徴は以下の通り

No比較項目openpyxlxlwings補足説明
1EXCEL不要必要EXCELのインストールが要否が違います。
2速度早い遅い
3
注意点
図形あり、セル結合あり
の場合、不具合あり
形がある場合、不具合あり。
・セル結合の場合等情報が取得できない場合がある。
・保存すると図形が消える。
openpyxlとxlwingsの違い

図形あり、または、セル結合ありの場合、xlwingsの一択です。
図形なしの場合、速度の早いopenpyxlがおすすめです。

 

openpyxlで、できること。

EXCELがインストールされていない環境でも使えます。
ターミナルを起動して、以下のコマンドを入力してください。

pip3 install -U openpyxl

 

セルの書式設定

文字色、背景色、罫線の設定ができます。
色の指定は16進数カラーコードで指定する必要があるため、事前に準備をする必要があります。

例:白は、FFFFFF。

type= null

  

セルの値編集

文字(項目タイトル)、数値(初期値)、数式(=ROW-3)などを指定したセルに、設定できます。

ws['B2'].value = '=ROW-3'

データの入力規制

リスト形式で入力する値を制限できです。選択可能な値を指定することができます。

data_validation=Datavalidation( type = 'list', formula1='"aaa,bbb"', allow_blank=True) 
                          # リスト形式
                                           # 選択肢:aaaとbbb
                                           # 空白あり
validation.add( 'B2:B7' )                  # 適用範囲
ws.add_data_validation( data_validation )  # 入力規制の追加

xlwingsで、できること。

EXCELの機能を使うため、インストールされている環境が必要です。

ターミナルを起動して、以下のコマンドを入力してください。

pip3 install -U xlwings

図形の値取得

EXCELファイルに設定された図形から、値を取得することができます。

 

サンプルプログラム

入力ファイル(*.xlsx)から、図形の値を取得し、出力ファイル(output.xlsx)に書き込むサンプルプログラムは以下のとおり。

サンプルを実行する際には、globライブラリをインストールしてください。

pip3 install -U glob

 サンプルプログラム

import openpyxl as op
import xlwings as xw
import glob

def read_all():
    cnt1 = 0    # ファイル数
    cnt2 = 0    # 図形数

    o_book = 'output.xlsx'              # 出力ファイルを指定
    o_wb   = op.load_workbook(o_book)   # 出力ファイルをひらく
    o_ws   = o_wb.worksheets[0]         # 左端のシートを指定

    app = xw.App( visible=False )       # EXCELを非表示で起動する

    lists  = sorted( glob.glob('*.xlsx') )  # 拡張子が.xlsxのファイルリストを取得する
    for list in lists:  # ファイルを取得
        print( f'file =:{list}' )
        cnt1 += 1
        i_wb  = xw.books.open(list)     # 入力ファイルをひらく
        i_ws  = i_wb.sheets[0]          # 左端のシートを指定

        for s in i_ws.shapes:   # 図形を取得
            cnt2 += 1
            print( f'type  : {s.type}' )
            print( f'name  : {s.text}---' )
            print( f'name  : {s.name}' )
            print( f'parent: {s.parent}' )    # 親オブジェクト
            o_ws.cell( column=1 ,row=cnt2+1 ).value = cnt1      # ファイル数
            o_ws.cell( column=2 ,row=cnt2+1 ).value = list      # 入力ファイル名
            o_ws.cell( column=3 ,row=cnt2+1 ).value = cnt2      # 図形数
            o_ws.cell( column=4 ,row=cnt2+1 ).value = s.text    # 図形の値
        else:                   # 図形がなくなった場合
            i_wb.close()                # 入力ファイルをとじる

    else:               # 入力ファイルがなくなった場合
        o_wb.save(o_book)   # 出力ファイルを保存する
        o_wb.close()        # 出力ファイルをとじる
        app.quit()          # EXCELを終了する

if __name__=='__main__':
    read_all()

出力結果

file =:Book1.xlsx
type  : auto_shape
name  : サンプル図形1---
name  : Rounded Rectangle 1
parent: <Sheet [Book1.xlsx]Sheet1>
type  : auto_shape
name  : サンプル図形2---
name  : Rounded Rectangle 3
parent: <Sheet [Book1.xlsx]Sheet1>
type  : auto_shape
name  : サンプル図形99_帳票
---
name  : Flowchart: Document 5
parent: <Sheet [Book1.xlsx]Sheet1>
file =:Book2.xlsx
type  : auto_shape
name  : 2サンプル図形1_丸四角---
name  : Rounded Rectangle 1
parent: <Sheet [Book2.xlsx]Sheet1>
type  : auto_shape
name  : 2サンプル図形2_丸四角---
name  : Rounded Rectangle 2
parent: <Sheet [Book2.xlsx]Sheet1>
type  : auto_shape
name  : 2サンプル図形3_菱形
---
name  : Flowchart: Data 5
parent: <Sheet [Book2.xlsx]Sheet1>
file =:output.xlsx

 

output.xlsx

タイトルとURLをコピーしました