Skip to content

Instantly share code, notes, and snippets.

@aipro-jp
Created April 30, 2025 05:25
Show Gist options
  • Save aipro-jp/0760e91987ab5a910cf2c6a0ca2c4755 to your computer and use it in GitHub Desktop.
Save aipro-jp/0760e91987ab5a910cf2c6a0ca2c4755 to your computer and use it in GitHub Desktop.
支店別合計売上Excelファイル作成
# 必要なライブラリをインポートします
import pandas as pd # データを扱うための必須ライブラリ。Excelファイルの読み込み、データ結合、集計に使います。
import os # ファイルやディレクトリ(フォルダ)に関する操作を行うための標準ライブラリ。今回は主にファイル名の扱いに使います。
import glob # 指定したパターンに一致するファイル名を探すための標準ライブラリ。
# --- 設定 ---
# 集計したいExcelファイルを自動で見つけるためのパターンを指定します。
# このPythonスクリプトと同じフォルダにあるファイルのうち、
# ファイル名が「どんな文字でもいい(*)」の後に「_売上.xlsx」という形になっているものを探します。
# 例: '東京支店_売上.xlsx', '大阪支店_売上.xlsx' など
input_file_pattern = '*_売上.xlsx'
# 集計結果を保存する新しいExcelファイルの名前です。
# このファイルも、スクリプトと同じフォルダに作成されます。
output_file_name = '支店別売上合計.xlsx'
# -----------------
# 読み込んだ各ExcelファイルのDataFrame(表形式データ)を一時的に保管しておくための
# 空っぽのリスト(箱)を用意します。
all_data = []
# glob.glob()関数を使って、指定したパターン(input_file_pattern)に合う全てのファイル名を
# 現在の作業フォルダの中から見つけ出します。(glob.globを使用)
input_files = glob.glob(input_file_pattern)
# globで見つかったファイルがあるかどうかを確認します。
# ファイルが一つも見つからなかった場合は、その旨を表示して処理を終了します。
if not input_files:
print(f"警告:指定されたパターン '{input_file_pattern}' に合うファイルが作業フォルダに見つかりませんでした。")
print("集計・出力処理は行われず、新しいファイルも作成されません。サンプルファイルが正しく配置されているか確認してください。") # メッセージを少し修正
else:
# ファイルが見つかった場合の処理
print(f"以下のファイルを処理対象として見つけました:{input_files}")
# 見つかったファイルリスト(input_files)を一つずつ取り出して処理するための繰り返し(ループ)を開始します。
# for ... in ...: は、リストの要素を順番に file_name という変数に取り出し、繰り返しの処理を行います。
for file_name in input_files:
print(f"\n'{file_name}' を読み込み中...")
# ファイルの読み込みやデータ加工でエラーが発生する可能性があるので、
# try...except ブロックを使ってエラーに備えます。
try:
# pandasのpd.read_excel()関数を使って、現在のExcelファイルを読み込みます。
# 読み込んだデータはDataFrame(pandasの表形式データ構造)として df という変数に格納されます。
# sheet_name=0 は、Excelファイルの一番左にある最初のシートを読み込む指定です。
df = pd.read_excel(file_name, sheet_name=0)
# ファイル名から支店名を取り出す処理を行います。(例: '東京支店_売上.xlsx' から '東京支店')
# ファイル名から '_売上.xlsx' の部分を消すと、支店名だけが残ります。
branch_name = file_name.replace('_売上.xlsx', '')
# 読み込んだ表(DataFrameであるdf)に「支店名」という新しい列を追加します。
# この列の全部の行に、さっき取り出した支店名(branch_name)を設定します。
# これにより、後でどのデータがどの支店のものかを区別できるようになります。
df['支店名'] = branch_name
# 支店名列を追加した現在のDataFrame(df)を、最初に用意しておいた all_data リストに追加します。
# これをループの度に繰り返すことで、all_data リストには各ファイルのDataFrameが順番に格納されていきます。
all_data.append(df)
print(f"'{file_name}' の読み込みと支店名 '{branch_name}' の追加が完了しました。")
except Exception as e:
# Excelファイルを読み込む際やデータ加工中に何らかの予期しないエラーが発生した場合、
# そのエラーをキャッチして、エラーメッセージと詳細を表示します。
# これにより、どのファイルでエラーが起きたのか、どのようなエラーなのかが分かりやすくなります。
print(f"エラー: '{file_name}' を読むとき、または処理中に問題が発生しました。詳細: {e}")
# エラーが発生したファイルは all_data リストに追加されないため、集計対象から自動的に除外されます。
# 全てのファイルの読み込みと加工が終わったら、all_data リストに格納された複数のDataFrameを一つに合体させます。
# all_data リストにデータが一つでも入っている(少なくとも一つのファイルが正常に処理できた)場合のみ合体処理を行います。
if all_data:
# pd.concat()関数を使うと、リストに含まれる複数のDataFrameを縦方向(行方向)に簡単につなげることができます。
# ignore_index=True を指定すると、元のDataFrameの行番号(インデックス)を無視して、
# 合体後の新しいDataFrameに0からの連番のインデックスを付け直してくれます。
combined_df = pd.concat(all_data, ignore_index=True)
print("\n全てのファイルを一つの大きなデータに合体しました!集計に進みます。")
# 合体したデータがどのように見えるか確認したい場合は、 combined_df.head() と書くと最初の5行を見ることができます。
else:
# もし all_data リストが空っぽだった場合(指定パターンに合うファイルが全く見つからなかったなど)の処理です。
print("\n集計できる有効なデータがありませんでした。集計・出力処理は行われません。")
# 後続の処理でエラーが発生しないように、空っぽのDataFrameを作成しておきます。
combined_df = pd.DataFrame()
# --- 注意点 ---
# 今回のコードではシンプルさを優先するため、globで見つかったファイルが処理中に削除されたり、
# ファイル名が予期しない形式であったりする場合の厳密なエラー処理は省略しています。
# 実際の業務で利用する際は、ファイルが存在するかどうかのチェック(os.path.exists()など)や、
# ファイル名の解析が失敗した場合の処理などを追加することを推奨します。
# -----------------
# --- データ集計 ---
# 合体した表 (combined_df) が空っぽではない(集計対象のデータがある)場合のみ集計処理を行います。
if not combined_df.empty: # combined_df.empty は、DataFrameが空かどうかを判定するプロパティです。
# pandasの groupby() メソッドを使って、「支店名」の列を基準にデータをグループ分けします。
# 次に、そのグループ分けされたデータの中から「売上金額」の列を選択し、
# 最後に .sum() メソッドを使って、各グループ(支店)ごとに「売上金額」の合計値を計算します。
# この結果は、支店名をインデックスとする新しいSeries(pandasの一次元データ構造)として branch_sales_summary に格納されます。
branch_sales_summary = combined_df.groupby('支店名')['売上金額'].sum()
print("\n--- 支店別の売上金額合計です ---")
# 計算して得られた支店別の合計売上金額を画面(コンソール)に表示してみましょう。
print(branch_sales_summary)
else:
# 集計対象のデータがなかった場合(combined_dfが空だった場合)のメッセージを表示します。
print("\n集計するデータがありませんでした。集計結果は生成されません。")
# 後続の処理でエラーにならないように、空っぽのSeriesまたはDataFrameを作成しておきます。
branch_sales_summary = pd.DataFrame() # 集計結果がないため、空のDataFrameとします。
# --- 集計結果を新しいExcelファイルに保存 ---
# 集計結果 (branch_sales_summary) が空っぽではない(集計が成功している)場合のみ保存処理を行います。
if not branch_sales_summary.empty:
# ファイルを保存する際にエラーが発生する可能性があるので、try...except ブロックで囲みます。
try:
# pandasの to_excel() メソッドを使って、集計結果(branch_sales_summary)をExcelファイルとして保存します。
# 最初の引数 output_file_name で、保存するファイルの名前(例: '支店別売上合計.xlsx')を指定します。
# sheet_name='支店別合計売上' で、Excelファイル内のシート名を指定できます。
# index=True(デフォルト値)なので、集計結果のインデックス(この場合は支店名)も
# Excelファイルの最初の列として一緒に出力されます。
branch_sales_summary.to_excel(output_file_name, sheet_name='支店別合計売上')
print(f"\n--- 集計結果を '{output_file_name}' として作業フォルダに保存しました! ---")
print(f"'{output_file_name}' を開いて、「支店別合計売上」シートを見てみてくださいね。集計結果が確認できるはずです。")
except Exception as e:
# ファイルを保存する際に何らかのエラーが発生した場合(例: 同じ名前のファイルが別のアプリケーションで開かれているなど)、
# そのエラーをキャッチしてメッセージを表示します。
print(f"\nエラー:集計結果の保存中に問題が発生しました。詳細: {e}")
print(f"'{output_file_name}' ファイルがうまく作られなかったか、アクセスできない状態かもしれません。")
else:
# 集計結果が空だった場合(集計対象データがなかったなど)は、ファイルは作られないことをメッセージで伝えます。
print("\n集計結果がありませんでした。そのため、新しいExcelファイルは作成されません。")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment