【コピペで動く】ノンプログラマー向けopenpyxlの使い方まとめ!Excel作業を一瞬で終わらせる方法

python-openpyxl プログラミング

毎日のように「大量のExcelファイルからデータをコピペする」「定型レポートにデータを手入力する」といった作業に追われていませんか? 「もっと楽に、一瞬で終わらせられたらいいのに……」 そんなあなたにおすすめしたいのが、Pythonの「openpyxl(オープンパイエクセル)」ライブラリを使ったExcelの自動化です。

この記事では、プログラミング初心者の経理・事務担当者向けに、実務で本当によく使う操作だけを厳選した「openpyxlチートシート」をまとめました。 コードをコピペして、少し書き換えるだけで、今日からあなたのデスクワークが劇的に変わります!

openpyxlとは?

openpyxlは、PythonからExcelファイル(.xlsx形式)を直接読み書き・編集するための非常に強力なライブラリです。 Excelソフト(アプリ)を起動せずに裏側で高速に処理を行うため、大量のファイルがあっても一瞬で処理を終わらせることができます。

  • Excelの起動が不要: パソコンが重くならず、バックグラウンドで静かに処理が進みます。
  • 直感的な操作: ws[‘A1’] = “値” のように、Excelのセル番地をそのまま指定して書き換えられます。

準備:3分でできる環境確認と実行手順

コードを書く前に、お使いのパソコンでPythonが動く状態になっているかを確認し、プログラムを実行する基本手順を押さえましょう。

※なお、この記事ではPython自体のインストール手順は割愛します。まだインストールしていない方は、公式サイト等からインストールを済ませておいてください。

① Pythonがインストールされているか確認する

まずは、お使いのパソコンにPythonが入っているかを確かめます。

Windowsの「コマンドプロンプト」または「PowerShell」を開き、以下のコマンドを入力して Enter キーを押してください。

python -V

(※Vは大文字です)

画面に Python 3.11.x や Python 3.12.x のようにバージョン情報が表示されれば、準備はバッチリです!

② ライブラリをインストールする

次に、Excelを操作するためのライブラリ openpyxl をインストールします。同じ画面(コマンドプロンプト等)で、以下のコマンドを実行してください。

pip install openpyxl

作ったPythonプログラムを実行する方法

「Pythonプログラムをどうやって動かせばいいの?」という初心者の方向けに、実行の手順を分かりやすく解説します。

1.コマンドプロンプトを開く

Windowsのスタートメニューから「コマンドプロンプト」または「PowerShell」を起動します。

2.ファイルがある場所に移動する

プログラム(.pyファイル)が保存されているフォルダ(ディレクトリ)に移動します。

エクスプローラーで移動したいフォルダを右クリックするとパスのコピーをすることができます。

これをコマンドプロンプトに入力します。

# Documentsフォルダへ移動
cd "C:\Users\hisao\Documents"

※cd は「フォルダを移動する(Change Directory)」という命令です。

3.サンプルプログラムの作成

Documentsフォルダなどの作業フォルダにコピー&ペーストして、そのまま実行できる excel_test.py のコードを作成しました。

import openpyxl
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side

def create_excel_file():
    # 1. 新しいワークブック(Excelファイル)を作成
    wb = openpyxl.Workbook()
    ws = wb.active
    ws.title = "売上データ"

    # 2. グリッド線(セルを区切る薄いグレーの線)を常に表示する設定
    ws.views.sheetView[0].showGridLines = True

    # 3. データの書き込み
    # 1行目:ヘッダー(見出し)
    headers = ["注文ID", "商品名", "単価", "数量", "合計金額"]
    ws.append(headers)

    # 2行目以降:サンプルデータ(合計金額は空にしておきます)
    data = [
        ["A001", "Python入門書", 3000, 2],
        ["A002", "Excel自動化ガイド", 2500, 5],
        ["A003", "データ分析テキスト", 4000, 1],
        ["A004", "プログラミングノート", 500, 10],
    ]

    for row in data:
        # 行を追加する際、合計金額の部分には Excel の掛け算数式(=単価*数量)を書き込みます
        current_row = ws.max_row + 1  # これから書き込む行番号を取得
        formula = f"=C{current_row}*D{current_row}"  # 例: =C2*D2
        
        ws.append([row[0], row[1], row[2], row[3], formula])

    # 4. デザインと装飾(実務で使えるプロレベルの見た目に仕上げます)
    # カラーテーマ(目に優しいミントグリーン系)
    header_fill = PatternFill(start_color="D1E7DD", end_color="D1E7DD", fill_type="solid")
    header_font = Font(name="Meiryo UI", size=11, bold=True, color="0F5132")
    body_font = Font(name="Meiryo UI", size=11)
    
    # 罫線(細いグレーの線)
    thin_side = Side(style='thin', color='DDDDDD')
    thin_border = Border(left=thin_side, right=thin_side, top=thin_side, bottom=thin_side)

    # 文字の配置
    align_center = Alignment(horizontal="center", vertical="center")
    align_left = Alignment(horizontal="left", vertical="center")
    align_right = Alignment(horizontal="right", vertical="center")

    # 1行目(ヘッダー)に装飾を適用
    for col_num in range(1, 6):
        cell = ws.cell(row=1, column=col_num)
        cell.fill = header_fill
        cell.font = header_font
        cell.alignment = align_center
        cell.border = thin_border

    # 2行目以降(データ)に装飾と表示形式を適用
    for r in range(2, ws.max_row + 1):
        for c in range(1, 6):
            cell = ws.cell(row=r, column=c)
            cell.font = body_font
            cell.border = thin_border
            
            # 列に応じた「文字の配置」と「数値のカンマ区切り設定」
            if c in [1, 4]:    # 注文ID、数量は中央揃え
                cell.alignment = align_center
            elif c == 2:       # 商品名は左揃え
                cell.alignment = align_left
            elif c in [3, 5]:  # 単価、合計金額は右揃え + カンマ区切り(#,##0)
                cell.alignment = align_right
                cell.number_format = '#,##0'

    # 5. 列幅を文字の長さに合わせて自動調整
    for col in ws.columns:
        max_len = 0
        col_letter = openpyxl.utils.get_column_letter(col[0].column)
        for cell in col:
            val_str = str(cell.value or "")
            # 数式(=C2*D2など)の場合は文字数の計算が狂うため、仮の文字数を設定
            if val_str.startswith("="):
                val_str = "123,456"
            max_len = max(max_len, len(val_str))
        # 余裕を持たせた幅(最低でも12文字分)に設定
        ws.column_dimensions[col_letter].width = max(max_len + 3, 12)

    # 6. 保存
    output_filename = "excel_test_output.xlsx"
    wb.save(output_filename)
    print(f"🎉 成功!'{output_filename}' が新しく作成されました。")

if __name__ == "__main__":
    create_excel_file()

このコードを実行すると、プログラムと同じフォルダに excel_test_output.xlsx という綺麗にデザインされたExcelファイルが新しく書き出されます。

4.プログラムを実行する

サンプルプログラムを作成できたら、以下のコマンドを入力して実行します。

python excel_test.py

エラーが出ずに処理が終わり、移動したフォルダに新しいExcelファイルが書き出されていれば大成功です!

3. 【完全保存版】openpyxl 基本操作チートシート

事務仕事で「これだけ知っていれば8割の操作はカバーできる」基本コードをまとめました。

① ブックを開く・作成する・保存する

まずは基本中の基本、ファイルの読み書きと保存です。

import openpyxl

# 【パターンA】既存のExcelファイルを開く
wb = openpyxl.load_workbook("example.xlsx")

# 【パターンB】新しく白いExcelファイルを作る
# wb = openpyxl.Workbook()

# 操作するシートを選択する(アクティブなシート、またはシート名指定)
ws = wb.active  # 現在開いているシート
# ws = wb["Sheet1"]  # 特定のシート名を指定する場合

# --- ここにExcelの編集処理を書く ---

# 編集が終わったら必ず保存する
wb.save("example_updated.xlsx")

② セルの値を読み書きする

特定のセルからデータを取得したり、新しいデータを書き込んだりします。

# A1セルに値を書き込む
ws["A1"] = "売上金額"

# セル番地を指定して値を読み込む
price = ws["B2"].value
print(f"B2セルの値は: {price}")

# 行番号・列番号(数字)で指定して書き込む(ループ処理で便利です)
# row=2 (2行目), column=3 (3列目 = C列)
ws.cell(row=2, column=3, value=1500)

③ 行や列を挿入・削除する

データの追加スペースを作ったり、不要な行を消したりする操作です。

# 3行目の「上に」新しく1行挿入する
ws.insert_rows(idx=3, amount=1)

# B列の「左に」新しく2列挿入する
ws.insert_cols(idx=2, amount=2)

# 5行目を削除する
ws.delete_rows(idx=5, amount=1)

④ データを繰り返し処理する(ループ処理)

これが自動化の真骨頂です。データの入っている最終行まで自動で判定し、1行ずつ処理を行います。

# データの入っている最終行と最終列を自動取得
max_row = ws.max_row
max_col = ws.max_column

# 2行目から最終行までを順番に処理する(1行目はヘッダーと仮定)
for r in range(2, max_row + 1):
    # 各行のA列(商品名)とB列(単価)を取得
    item_name = ws.cell(row=r, column=1).value
    price = ws.cell(row=r, column=2).value
    
    # 例:単価が1,000円以上のものだけ、C列に「要チェック」と書き込む
    if price and price >= 1000:
        ws.cell(row=r, column=3, value="要チェック")

⑤ セルに色を塗る・文字装飾をする

レポートを見やすくするために、セルの背景色やフォントを変更します。

from openpyxl.styles import PatternFill, Font

# 文字を太字にする
bold_font = Font(name="Meiryo UI", size=11, bold=True)
ws["A1"].font = bold_font

# 背景色を薄い黄色にする (ARGBの16進数で指定。先頭のFFは不透明度)
yellow_fill = PatternFill(start_color="FFFFE0", end_color="FFFFE0", fill_type="solid")
ws["A1"].fill = yellow_fill

4. 実務でよくあるパターン:データ転記の自動化コード例

最後に、実務でよくある「売上データから特定の商品だけを抽出して、別の新規Excelシートに転記する」という一連の流れをプログラムにしてみました。

実装コード例

import openpyxl
from openpyxl.styles import Font, PatternFill

# 1. 元データを開く
source_wb = openpyxl.load_workbook("sales_data.xlsx")
source_ws = source_wb.active

# 2. 転記先の新しいブックを作る
new_wb = openpyxl.Workbook()
new_ws = new_wb.active
new_ws.title = "抽出結果"

# 3. 転記先にヘッダー(見出し行)を書き込む
headers = ["日付", "商品名", "金額"]
for col_idx, header in enumerate(headers, 1):
    new_ws.cell(row=1, column=col_idx, value=header)
    # 見出しを少し綺麗にする
    new_ws.cell(row=1, column=col_idx).font = Font(bold=True)
    new_ws.cell(row=1, column=col_idx).fill = PatternFill(start_color="E0F7FA", fill_type="solid")

# 4. ループ処理で特定データを抽出・転記する
# 元データの2行目からスキャン
write_row = 2  # 転記先の書き込み開始行
for r in range(2, source_ws.max_row + 1):
    item = source_ws.cell(row=r, column=2).value  # B列: 商品名
    
    # 商品名が「Python入門書」のデータだけを抽出
    if item == "Python入門書":
        date = source_ws.cell(row=r, column=1).value   # A列: 日付
        price = source_ws.cell(row=r, column=3).value  # C列: 金額
        
        # 新しいシートに書き込み
        new_ws.cell(row=write_row, column=1, value=date)
        new_ws.cell(row=write_row, column=2, value=item)
        new_ws.cell(row=write_row, column=3, value=price)
        write_row += 1

# 5. 保存
new_wb.save("filtered_sales.xlsx")
print("転記作業が完了しました!")

まとめ

今回は、エクセル業務を劇的に効率化するためのPythonライブラリ「openpyxl」の基本的な使い方を解説しました。

最初は1行書くだけでも難しく感じるかもしれませんが、チートシートを手元に置いて少しずつ試してみてください。「これまで手作業で30分かかっていたコピペ作業が、ボタンひとつで1秒で終わる」という感動を体験すると、もう手作業には戻れなくなります。

Pythonを使ってルーティンワークをサクッと自動化し、ゆとりのあるワークライフを手に入れましょう!

コメント

タイトルとURLをコピーしました