この記事を読むと、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 | 比較項目 | openpyxl | xlwings | 補足説明 |
1 | EXCEL | 不要 | 必要 | EXCELのインストールが要否が違います。 |
2 | 速度 | 早い | 遅い | |
3 | 注意点 | 図形あり、セル結合あり の場合、不具合あり | 図形がある場合、不具合あり。 ・セル結合の場合等、情報が取得できない場合がある。 ・保存すると図形が消える。 |
図形あり、または、セル結合ありの場合、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