複数のシートをまとめる
複数のシートをまとめる
1シートごとに入力されている4〜6月の売上を1つにまとめて別名のブックに保存する。
ポイント
・1つ目のシートはヘッダーを含めて読み込む
・row_listというからのリストを作成しておき、この中に3つのシートの行を順次追加
・そしてrow_listのデータを新しく作成したシートに1行ずつappend()で追加して、最後に別名で保存
・is_first?sheetという「1つ目のシートかどうか」を記録する変数を用意する。最初はTrueを代入しておき、1つ目のシートのループが完了したら、Falseに切り替える。
⇨そして、is_first_sheetがTrueの場合には1行目から、Falseの場合は4行目からシートを読み込む
import openpyxl wb = openpyxl.load_workbook("売上データ_6月入力.xlsx") # 1つ目のシートかどうか is_first_sheet = True # このリストに全シートから読み取ったデータをまとめる row_list = [] # ブックの中の全てのシートを処理 for ws in wb.worksheets: if is_first_sheet: # 1つ目のシートだけヘッダーから読み込む start_row = 1 else: # 2つ目以降のシートでは読み込み位置を変える start_row = 4 for row in ws.iter_rows(min_row=start_row): # ヘッダーより下で空行になったら読み込み終了 if row[0].row > 3 and row[0].value is None: break value_list =[] for c in row: value_list.append(c.value) # リストにデータを追加 row_list.append(value_list) #1つ目のシートは読み込んだのでFalseを代入 is_first_sheet = False # データを転記する新しいシート ws_new = wb.create_sheet(title="第一四半期売上") # 書き込み時の行番号 row_num = 1 # 新しいシートに1行ずつデータを書き込む for row in row_list: # 1行分のデータを書き込む ws_new.append(row) # データ部分のA列に日付の表示形式を設定 if row_num > 3: ws_new.cell(row_num, 1).number_format = "yyyy/m/d" row_num = row_num + 1 # 別名でブック保存 wb.save("売上データ_第一四半期売上.xlsx")
複数のブックをシート名ごとにまとめる
フォルダーの中にあるファイルを1つずつ取得するには、検索するフォルダーでpathlibのPath()を作成し、そこにglob()で「検索パターン」を指定する
・フォルダー内のファイルを1つずつループ
from pathlib import Path for file in Path(フォルダーのパス).glob(検索パターン): 処理
▼フォルダ構成
import openpyxl from pathlib import Path # 各支店ブックの読み込み wb_list = [] for file in Path("売上全支店").glob("*.xlsx"): wb = openpyxl.load_workbook(file, data_only=True) wb_list.append(wb) # 保存先の新しいブック wb_new = openpyxl.Workbook() # 1つ目のブックからシート名のリストを取得 sheet_names = wb_list[0].sheetnames # シート名ごとに処理 for sheet_name in sheet_names: # このシートに書き込む ws_new = wb_new.create_sheet(sheet_name) # 1つ目のブックかどうか is_first_book = True # このリストに全ブックから読み取ったデータをまとめる row_list = [] # 各支店のブックごとにデータ読み込み for wb in wb_list: # 読み込むシート ws = wb[sheet_name] if is_first_book: start_row = 1 else: start_row = 4 # シートから1行ずつデータを読み込む for row in ws.iter_rows(min_row=start_row): # ヘッダーより下で空行になったら読み込み終了 if row[0].row > 3 and row[0].value is None: break value_list = [] for c in row: value_list.append(c.value) row_list.append(value_list) is_first_book = False # 書き込み時の行番号 row_num = 1 # シートに1行ずつデータを書き込む for row in row_list: # 1行分のデータを書き込む ws_new.append(row) # データ部分のA列に日付の表示形式を設定し、F列の数式を書き換え if row_num > 3: ws_new.cell(row_num, 1).number_format = "yyyy/m/d" ws_new.cell(row_num, 6).value = "=D" + str(row_num) + "*E" + str(row_num) row_num = row_num + 1 # 作成時の既存シートを取り除く ws_first = wb_new.worksheets[0] wb_new.remove(ws_first) wb_new.save("売上データ_全国.xlsx") import openpyxl from pathlib import Path # 各支店ブックの読み込み wb_list = [] for file in Path("売上全支店").glob("*.xlsx"): wb = openpyxl.load_workbook(file, data_only=True) wb_list.append(wb) # 保存先の新しいブック wb_new = openpyxl.Workbook() # 1つ目のブックからシート名のリストを取得 sheet_names = wb_list[0].sheetnames # シート名ごとに処理 for sheet_name in sheet_names: # このシートに書き込む ws_new = wb_new.create_sheet(sheet_name) # 1つ目のブックかどうか is_first_book = True # このリストに全ブックから読み取ったデータをまとめる row_list = [] # 各支店のブックごとにデータ読み込み for wb in wb_list: # 読み込むシート ws = wb[sheet_name] if is_first_book: start_row = 1 else: start_row = 4 # シートから1行ずつデータを読み込む for row in ws.iter_rows(min_row=start_row): # ヘッダーより下で空行になったら読み込み終了 if row[0].row > 3 and row[0].value is None: break value_list = [] for c in row: value_list.append(c.value) row_list.append(value_list) is_first_book = False # 書き込み時の行番号 row_num = 1 # シートに1行ずつデータを書き込む for row in row_list: # 1行分のデータを書き込む ws_new.append(row) # データ部分のA列に日付の表示形式を設定し、F列の数式を書き換え if row_num > 3: ws_new.cell(row_num, 1).number_format = "yyyy/m/d" ws_new.cell(row_num, 6).value = "=D" + str(row_num) + "*E" + str(row_num) row_num = row_num + 1 # 作成時の既存シートを取り除く ws_first = wb_new.worksheets[0] wb_new.remove(ws_first) wb_new.save("売上データ_全国.xlsx")