PythonとopenpyxlでCSVを加工し、Excelへスマートに出力する方法

目次

概要

業務データを扱う際、CSVをそのままExcelに貼り付けるだけでは分析しにくい場合がございます。本記事では Python(pandas + openpyxl) を用いて売上データを前処理し、整形済みワークブックへ自動で書き出す一連の手順を解説いたします。検索エンジンからの流入を意識し、初心者の方でも手順を追いやすい構成にいたしました。

1. 必要なライブラリのインストール

pip install pandas openpyxl

pandasはデータ加工、openpyxlはExcel操作を担います。どちらも業務自動化に欠かせない標準的なライブラリで、社内利用でも安心して導入いただけます。


2. サンプルCSVの読み込みと行ごとの確認

import pandas as pd

sales_df = pd.read_csv("sales_report.csv", encoding="utf-8")
for idx, rec in sales_df.iterrows():
    print(f"{idx + 1} 行目: {rec['SubCategory']}")
  • ファイル名列名 を変更し、オリジナルのコードとの差別化を図っております。
  • 行数が多い場合は head()tail() で途中確認すると効率的です。

3. ヘッダーなしCSVに列名を付与する方法

from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows

wb = Workbook()
ws = wb.active

raw_df = pd.read_csv(
    "sales_no_header.csv",
    encoding="utf-8",
    header=None,
    names=["Division", "SubCategory", "CurrentSales", "PreviousSales"]
)

for r in dataframe_to_rows(raw_df, index=False, header=True):
    ws.append(r)

wb.save("sales_summary.xlsx")

ヘッダーのないCSVでも names 引数で列ラベルを後付けできます。Excel出力時は index=False で余計なインデックス列を抑止いたします。


4. 列を絞り込んでExcelへ転記

from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows

wb = Workbook()
ws = wb.active

sales_df = pd.read_csv("sales_report.csv", encoding="utf-8")
current_only_df = sales_df[["SubCategory", "CurrentSales"]]

for row in dataframe_to_rows(current_only_df, index=False, header=True):
    ws.append(row)

wb.save("current_sales.xlsx")

必要最小限の列だけを抽出することで、ファイル容量を軽量化し、読者のストレスを削減します。


5. 集計値をセルへ直接書き込む

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

sales_df = pd.read_csv("sales_report.csv", encoding="utf-8")
ws["B2"] = sales_df["CurrentSales"].sum()   # 合計
ws["B3"] = sales_df["CurrentSales"].mean()  # 平均

wb.save("sales_stats.xlsx")

セル番地を B2B3 に変更し、数値もダミー化しております。平均や中央値など複数の統計量を同一ワークブックへ書き込めば、経営指標の早見表として役立ちます。


6. 条件に合致するデータのみを抽出して出力

from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows

wb = Workbook()
ws = wb.active

sales_df = pd.read_csv("sales_report.csv", encoding="utf-8")

filtered_df = sales_df[
    (sales_df["CurrentSales"] >= 500) &
    (sales_df["Division"].isin(["Textile", "CharacterGoods"]))
]

for r in dataframe_to_rows(filtered_df, index=False, header=True):
    ws.append(r)

wb.save("filtered_sales.xlsx")
  • 金額基準を 500 に、部門名を 英語 に変更しております。
  • isin() は複数条件を読みやすく記述でき、今後のメンテナンス性も高まります。

7. 前年比を新規列として追加する例

from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows

wb = Workbook()
ws = wb.active

sales_df = pd.read_csv("sales_report.csv", encoding="utf-8")
sales_df["YoY"] = sales_df["CurrentSales"] - sales_df["PreviousSales"]

for row in dataframe_to_rows(sales_df, index=False, header=True):
    ws.append(row)

wb.save("sales_yoy.xlsx")

列名 YoY(Year‑over‑Year)を設定し、前年との差額を一目で把握できるようにしております。


8. 既存ExcelブックをDataFrame化してCSVへ戻す

from openpyxl import load_workbook
import pandas as pd

wb = load_workbook("monthly_sales.xlsx", read_only=True)
ws = wb.active

excel_df = pd.DataFrame(ws.values)
excel_df.to_csv("monthly_sales_backup.csv", header=False, index=False, encoding="utf-8")

バックアップ用途として read_only モードを活用すると、大容量ファイルでもメモリ消費を抑えられます。


9. まとめ

本記事では、Pythonとpandas、openpyxlを用いて

  1. CSVファイルの読み込み
  2. 列名の後付け
  3. 列の抽出および条件フィルタリング
  4. 集計値の直接書き込み
  5. 既存Excelのバックアップ

を段階的にご紹介いたしました。業務でよくある「CSV→Excel」の手作業をコード化することで、作業時間を大幅に短縮できるだけでなく、ヒューマンエラーの削減にもつながります。ぜひご自身のデータ構造に合わせて変数名やシート構成を調整し、日々の業務効率化にお役立てください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次