部署別や月別に分割された売上シートを、納品用に 1 枚へまとめ直したい場面は少なくありません。本稿では openpyxl を活用し、ブック内の各ワークシートからデータを抽出して 「Summary」シート に転記するサンプルコードと、その仕組みを丁寧にご説明いたします。
目次
1. サンプルファイル構成
シート名 | 役割 |
---|---|
DivisionA | 部門 A の売上明細 |
DivisionB | 部門 B の売上明細 |
… | (以降部門ごとに複数) |
Summary | 集約結果を書き込むシート |
前提
各部門シートでは 3 行目以降にデータ行が並び、3 列目 (C 列) から実データが開始しているものといたします。
2. ライブラリのインストール
pip install openpyxl
3. 集約スクリプト
from openpyxl import load_workbook
# 1) ブックを読み込み
wb_path = 'sales_report.xlsx'
wb_book = load_workbook(wb_path)
# 2) 集計先シートを取得
ws_summary = wb_book['Summary']
# 3) 集約用リストを作成
merged_rows = []
# 4) 2 枚目以降のシート([0] は Summary と想定)をループ
for ws in wb_book.worksheets[1:]:
# 対象範囲:4 行目以降、C 列~最終列まで
for row in ws.iter_rows(min_row=4,
max_row=ws.max_row,
min_col=3,
max_col=ws.max_column):
# セル値と表示形式を保持
merged_rows.append([(cell.value, cell.number_format) for cell in row])
# 5) Summary シートへ転記
for idx, row_data in enumerate(merged_rows, start=4):
# 先頭列に連番を付与
ws_summary.cell(idx, 2).value = idx - 3
# 取得済みデータを書き込み
for jdx, (val, fmt) in enumerate(row_data, start=3):
tgt_cell = ws_summary.cell(idx, jdx)
tgt_cell.value = val
tgt_cell.number_format = fmt # 元シートと同じ書式を維持
# 6) 保存
wb_book.save('sales_report_consolidated.xlsx')
4. 処理の流れ
ステップ | 詳細 |
---|---|
① ブック読み込み | load_workbook() で既存ファイルを開きます。 |
② 集約先シート取得 | Summary シートはテンプレート側であらかじめ用意しておくと安全です。 |
③‐④ データ抽出 | worksheets[1:] で Summary を除外し、各シートの 4 行目以降を走査します。 |
⑤ データ貼り付け | 取得した値と書式を保持しつつ、新しい行へ順に転記します。 |
⑥ 保存 | 元ファイルを残したい場合は別名で出力します。 |
5. 応用アイデア
ニーズ | 実装ヒント |
---|---|
タイトル行の書式もコピーしたい | iter_rows(min_row=3, max_row=3, …) でヘッダー行を取り込み、転記前に挿入 |
行の並び替えが必要 | merged_rows を pandas DataFrame に変換し、sort_values() 後に再度 openpyxl へ戻す |
複数ブック横断で集約 | glob.glob('*.xlsx') でブック単位にループし、同じロジックを適用 |
まとめ
- openpyxl の
iter_rows()
を使えば、セルの値だけでなく 表示形式も保持 してコピーできます。 - 集約対象シートをリストで制御すると、追加・削除に柔軟に対応できます。
- ルーチン業務に組み込めば、部門別や月別のシートを短時間で 一括集計 でき、レポート作成工数を大幅に削減できます。