学習めも。

Python、Anaconda学習中🔰 ブログ引っ越ししました😄よろしくお願いします!https://noeiganolife.com/

記録用🔰

プログラミング以外の記事はこちら

複数のシートをまとめる

複数のシートをまとめる

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(検索パターン):
 処理

▼フォルダ構成 f:id:Moriane:20211205172119p:plain

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")