こんにちはーー
趣味でPythonを使ってエクセルやCSVの処理を自動化しているロペです。
今回はExcel内の特定の文字列を検索して、その行番号に転記するプログラムを作成したので記事にしました。
ググりまくってプログラムを作成しているので、誰かのブログが役に立っています。
この記事も誰かの役に立てば幸いです。
概要
最初に、作成したプログラムで実行した内容を書きます。
baseとtest1,test2,test3を用意します。
それぞれのファイルの中身は↓のようになっています。
base
test1
test2
test3
test1~3で、a列、b列の1の数をカウントして、
1以上だったら1と転記して0だったら0と転記します。
完成例
ブログを書いているPCだとxlsxが使えず、xlsはpythonがサポートしてなかったので、
プログラムを実行できず、実行していたら↓のようになっているはずです(多分)
作成したプログラム
↓のようなプログラムを作成しました。
ブログを書いているPCだとxlsxが使えず、xlsはpythonがサポートしてなかったので、
デバッグができておらず、もしからしたらどこかでエラーでるかもしれません・・・
別PCでは意図通りに動いていたので、↓の”考え方”を見て頂ければと思います。
import os import glob from openpyxl import load_workbook import pandas as pa trgt_file = 'baese.xlsx' wb = load_workbook(trgt_file) ws = wb['Sheet'] max_row = ws.max_row df_base = pd.read_excel(trgt_file) serch_path ='./' for f in glob.glob(serch_path+'*.xlsx'): serch_file_name = os.path.split(f)[1].replace('.xlsx','') max_row_add = ws.max_row print(serch_path + os.paht.split(f)[1]) df = pd.read_excel(serch_path + os.path.split(f)[1]) max_row2=ws.max_row print('max_row:'+str(max_row2)) a_val = df.iloc[:,1] b_val = df.iloc[:,2] comf_a_val = a_val ==1 comf_b_val = b_val ==1 if comf_a_val.sum()>=1: set_a_val =1 else: set_a_val =0 print('test1のカウント結果:'+ set_a_val) if comf_b_val.sum()>1: set_b_val =1 else: set_b_val =0 print('test1のカウント結果:'+ set_b_val) for s in range(1,max_row): if serch_file_name in str(ws['A'].value): ws.cell(row=int(s),column=2).value = set_a_val ws.cell(row=int(s),column=3).value = set_b_val wb.save(trgt_file) break else: print(serch_file_name+'はみつかりません')
考え方
ファイル名の取得
for f in glob.glob(serch_path+'*.xlsx'): serch_file_name = os.path.split(f)[1].replace('.xlsx','')
glob関数で、配下のxlsxファイル名を取得します。
条件を満たす値のカウント
comf_a_val = a_val ==1 comf_b_val = b_val ==1 if comf_a_val.sum()>=1: set_a_val =1 else: set_a_val =0
このプログラムで、値が1となっている行数をカウントし、1件以上あれば変数に1を設定します。
0件の場合は変数を0とします。
指定の行に値を転記する
for s in range(1,max_row): if serch_file_name in str(ws['A'].value): ws.cell(row=int(s),column=2).value = set_a_val ws.cell(row=int(s),column=3).value = set_b_val wb.save(trgt_file) break
for文で、行を上から順に条件を満足する文字列か確認していき、
一致した行番号を取得して、その行番と指定の列に上で定義した変数set_a_val/set_b_balの値を記載します。
値に記載は、ws.cell(row=*,column=*).valueを使用します
以上になります!!
コメント