【業務自動化】チャプター1-4|Excelシートにデータを書き込もう

ながみえ

一つ前のページでは シートからデータを読み込む方法 について学習しました。

今回は シートにデータを書き込む方法 について見ていきましょう。

Chapter1:PythonでExcelを操作しよう
 ・Chapter1-1:openpyxlとは何か|インストールと動作確認
 ・Chapter1-2:PythonでExcelファイルを作成しよう
 ・Chapter1-3:Excelシートからデータを読み込もう
 ・Chapter1-4:Excelシートにデータを書き込もう ◁今回はここ
 ・Chapter1-5:データを新規シートへ自動振り分けしよう
 ・Chapter1-6:簡単なExcel自動化を体験しよう
Chapter2:PyInstallerで自動化ツール(.exe)を作ろう
Chapter3:ファイル・フォルダを操作しよう
Chapter4:メール送信を自動化しよう
Chapter5:Webスクレイピング

前回の記事では、Excel シートから既存のデータを読み取る方法を学びました。

今回はさらに一歩進めて、Pythonを使ってExcelシートに新しいデータを書き込む方法を学びます。

単にデータを読み込むだけでなく、条件に応じて新しい情報を計算し、自動的にセルへ書き込めるようになると、日々の作業効率は大きく向上します。

<<前のページ

業務自動化の記事一覧

次のページ>>

Excelにデータを書き込む方法|セル指定と保存の基本

Excel のシートに新しい値を入力する作業は、openpyxl を使えば Python から簡単に実現できます。

cell()メソッド でセルを指定して値を代入し、最後に saveメソッド でファイルを保存するだけで、Excel 上に結果が反映されます。

ここでは実際に、年齢データをもとに「未成年」「成人」「シニア」といった区分を自動的に書き込む方法を学んでいきましょう。

前回使用したExcel資料「chapter1-3.xlsx」を引き続き使用します。

資料がない方は↓↓のダウンロードリンクからファイルをダウンロードし、workbooksフォルダ内に保存してください。

Q
Excelファイルの保存場所について

ダウンロードしたExcelファイルは以下の階層になるように保存して下さい。

この理由については、Chapter1-2 の記事で詳しく解説しています。

Excel自動化学習					   # 学習フォルダ
 ├── Chap1/						 # チャプター1の保存フォルダ
 │   ├── app1-1.py
 │   ├── app1-2.py
 │   ├── ・・・
 │   └── workbooks/				# チャプター1のエクセルファイルの保存フォルダ
 │       ├── sample1-1.xlsx 
 │       ├── sample2-1.xlsx
 │       ├── ・・・
 │
 ├── Chap2/						 # チャプター2の保存フォルダ
 │   ├── app2-1.py
 │   ├── ・・・
 │   └── workbooks/				# チャプター2のエクセルファイルの保存フォルダ
 │       ├── ・・・
【Python】勉強猫がノートパソコンを前にして学習を始める様子。記事内の学習スタート用イラスト

サンプルコード|年齢から区分を判定して書き込む

以下のコードでは、Excel ファイルから年齢データを読み取り、条件に応じて「未成年」「成人」「シニア」という区分を自動で判定し、その結果を新しい列に書き込みます。

最後にファイルを保存することで、Excel 上で確認できるようになります。

import openpyxl, pathlib    # openpyxlとpathlibのインポート
file_path = pathlib.Path(__file__).parent / "workbooks" # エクセルファイルの保存フォルダの相対パスを作成

book = openpyxl.load_workbook(file_path / "Chapter1-3.xlsx") # ワークブックの読み込み
sheet = book.active # アクティブなシートを取得

START_ROW_NO = 3        # データ入力を開始する行
AGE_COL_NO = 4          # 年齢の列
CATEGORY_COL_NO = 5     # 年齢区分の列
max_row = sheet.max_row

for row_no in range(START_ROW_NO, max_row+1):
    age = sheet.cell(row_no, AGE_COL_NO).value
    category = ""   # 空の変数を作成
    if age < 20:
        category = "未成年"
    elif 20 <= age <= 60:
        category = "成人"
    else:
        category = "シニア"
    sheet.cell(row_no, CATEGORY_COL_NO).value = category    # セルにデータの書き込み

book.save(file_path / "Chapter1-4.xlsx")

このコードを実行すると、chapter1-3.xlsx内の空欄部分(年齢区分)が埋められた新規ブックchapter1-4.xlsxが作成されます。

ブックを直接開き、結果を確認して下さい。

サンプルコードの解説|セル参照・条件分岐・保存の流れ

このコードの流れを順番に確認してみましょう。

ライブラリの準備とExcelファイルの読み込み|load_workbook関数

import openpyxl, pathlib    # openpyxlとpathlibのインポート
file_path = pathlib.Path(__file__).parent / "workbooks" # エクセルファイルの保存フォルダの相対パスを作成

book = openpyxl.load_workbook(file_path / "Chapter1-3.xlsx") # ワークブックの読み込み
sheet = book.active # アクティブなシートを取得

この部分は過去のチャプターで学習したコードと同一です。

必要なライブラリのインポート、ワークブックの保存場所のパス作成、そして実際にワークブックを開く処理をしています。

この部分に分からないところがある人は、Chapter1-2 の記事に戻って復習しましょう。

データ処理の開始位置と列番号を設定

START_ROW_NO = 3        # データ入力を開始する行
AGE_COL_NO = 4          # 年齢の列
CATEGORY_COL_NO = 5     # 年齢区分の列
max_row = sheet.max_row

この部分では、Excel シートを処理するときに必要となる「基準」と「範囲」を決めています。

  • START_ROW_NO = 3 :データの処理をどの行から始めるかを指定
  • AGE_COL_NO = 4 :年齢が入力されている列を指定
  • CATEGORY_COL_NO = 5 :処理結果である「年齢区分」を書き込む列を指定

最後の max_row = sheet.max_row という行では、シートに入力されているデータの最終行の番号を取得しています。

これによって、シートに何行データが入っていても、その最後の行まで自動的に処理を繰り返すことができるようになります。

こうして、どの範囲を対象にして処理を行うのかをあらかじめ定義しているのです。

年齢データを判定して区分をセルに書き込む

for row_no in range(START_ROW_NO, max_row+1):
    age = sheet.cell(row_no, AGE_COL_NO).value
    category = ""   # 空の変数を作成
    if age < 20:
        category = "未成年"
    elif 20 <= age <= 60:
        category = "成人"
    else:
        category = "シニア"
    sheet.cell(row_no, CATEGORY_COL_NO).value = category    # セルにデータの書き込み

ここからがプログラムの本番で、実際にシートのデータを読み取り、条件に応じた判定を行っています。

for row_no in range(START_ROW_NO, max_row+1): の行で、指定した開始行から最終行までを順番に処理するループを作っています。

この仕組みにより、Excel の各行を一つずつ処理できるようになります。

次に age = sheet.cell(row_no, AGE_COL_NO).value で、その行の年齢データを取得しています。

その後if文で年齢区分を判定し、結果を変数categoryに代入。

最後に sheet.cell(row_no, CATEGORY_COL_NO).value = category の行で、判定した結果を Excel シートの対応するセルに書き込んでいます。

以上の動作により、元の年齢データの横に新しい列が作られ、そこに「未成年」「成人」「シニア」といった文字が自動的に入力される仕組みになっています。

結果を新しいファイルとして保存|saveメソッド

book.save(file_path / "Chapter1-4.xlsx")

プログラムの最後では、処理した結果を保存する必要があります。

この一行のおかげで、処理した結果を実際に Excel 上で確認できるようになります。

プログラムの最後に必ず保存処理を入れておくのが、Excel 自動化の基本的な流れです。

まとめ|Excelへの書き込みで押さえる基本

この記事では、Python と openpyxl を使って Excel シートに新しいデータを書き込む方法を学びました。

ポイントは次の通りです。

  • sheet.cell(row, col).value で、特定のセルに値を代入
  • book.save() でファイルを保存

これで、単なる読み取りだけでなく「Excel ファイルにデータを書き込む」スキルを身につけられました。

次回はさらに応用し、大量のコピー&ペーストの自動化に挑戦していきましょう。

練習問題|Excelへのデータの書き込みを体験しよう

今回学習した内容を復習する練習問題に挑戦しましょう。

【Python】勉強猫がノートパソコンに向かい、練習問題に挑戦する様子。記事内の休憩用イラスト

問題|新しいExcelブックを作成して書き込み、出力しよう

新規にExcelファイルを作成し、シートにデータを書き込んで保存したあと、その内容を取得して画面に出力するプログラムを作成してください。

以下の要件に従ってコードを完成させて下さい。

  • 新規ブックを作成し、シート名を変更すること(.titleプロパティで指定)
    例:sheet.title = “練習問題1-4”
  • cell() メソッドを用いて、複数のセルにデータを書き込むこと
  • 作成したExcelファイルを、training1-4.xlsxという名前で保存すること
  • 保存した内容をシートから読み取り、printで出力すること

ヒント|コードの構成と穴埋め問題化

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

Q
ヒント① コードの構成を見る

正解のコードは上から順に以下のような構成となっています。

1.ライブラリの読み込みとファイル保存先の指定
 ・Excelを操作するために使うライブラリを準備する
 ・フォルダやファイルの場所を扱いやすくするために道具を使う
 ・保存先のパスを変数に入れておく

2.新しいExcelブックとシートの準備
 ・新しいExcelファイルを作る(Workbook()クラスをインスタンス生成)
 ・最初に用意されているシートを取り出す(.activeプロパティを使用)
 ・シートに名前をつける(.titleプロパティを使用)

3.セルにデータを書き込む
 ・セルの場所は行番号と列番号で決める
 ・sheet.cell(row, column, value=値)

4.Excelファイルを保存する
 ・保存するには「ブックを保存する命令」を使う
 ・保存場所とファイル名を指定する
 ・拡張子は .xlsx にする

5.シートからデータを読み取り出力する
 ・行と列を順番に調べる
 ・セルの中身を取り出す命令を使う
 ・取り出した値を画面に表示する

Q
ヒント② 穴埋め問題にする

以下のコードをコピーし、穴埋め部に適切なコードを書きこんで下さい。

import '''(穴埋め)''', pathlib
file_path = pathlib.Path(__file__).parent / "workbooks"

# --- ① 新規ブックを作成 ---
'''(穴埋め)新しいブックを作成する処理を書く '''

sheet = new_book.active
 '''(穴埋め)シートのタイトルを指定する'''

# --- ② データを書き込み ---
sheet.cell(row=1, column=1, value="こんにちは、openpyxl!")
sheet.cell(row=1, column=2, value=123)
sheet.cell(row=1, column=3, value="学習中")

# ファイル保存
new_book.save(file_path / "training1-4.xlsx")

# --- ③ 書き込んだ内容を読み込み ---
for row_no in range(sheet.min_row, sheet.max_row + 1):
    ''' (穴埋め)列を順番に処理するループを書く '''
    value = sheet.cell(row_no, col_no).value
    print(value)

正解コードと詳細解説

例えば以下のようなプログラムが考えられます。

Q
正解コード例
import openpyxl, pathlib
file_path = pathlib.Path(__file__).parent / "workbooks"

# --- ① 新規ブックを作成 ---
new_book = openpyxl.Workbook()
sheet = new_book.active
sheet.title = "練習問題1-4"

# --- ② データを書き込み ---
sheet.cell(row=1, column=1, value="こんにちは、openpyxl!")
sheet.cell(row=1, column=2, value=123)
sheet.cell(row=1, column=3, value="学習中")

# ファイル保存
new_book.save(file_path / "training1-4.xlsx")

# --- ③ 書き込んだ内容を読み込み ---
for row_no in range(sheet.min_row, sheet.max_row + 1):
    for col_no in range(sheet.min_column, sheet.max_column + 1):
        value = sheet.cell(row_no, col_no).value
        print(value)
Q
正解コードの解説

ライブラリの読み込みとファイル保存先の指定

import openpyxl, pathlib
file_path = pathlib.Path(__file__).parent / "workbooks"

Excelファイルを扱うために専用の道具を準備し、プログラムが保存する場所をあらかじめ決めています。
これによって、どこにファイルを作成するかを統一できるようになります。

新しいExcelブックとシートの準備

# --- ① 新規ブックを作成 ---
new_book = openpyxl.Workbook()
sheet = new_book.active
sheet.title = "練習問題1-4"

まっさらなExcelファイルを作り、その中で最初に使うシートを取り出し、そのシートにわかりやすい名前をつけています。

セルにデータを書き込む

# --- ② データを書き込み ---
sheet.cell(row=1, column=1, value="こんにちは、openpyxl!")
sheet.cell(row=1, column=2, value=123)
sheet.cell(row=1, column=3, value="学習中")

Excelの表の中に文字や数字を入れています。
行と列の番号を指定することで、どの場所にデータを置くかを決められます。
ここでは最初の行に3つのデータを並べて入力しています。

Excelファイルを保存する

# ファイル保存
new_book.save(file_path / "training1-4.xlsx")

作成したExcelに入力した内容を、パソコンのフォルダに保存しています。
これでファイルとして残り、あとから開いて確認したり再利用できるようになります。

シートからデータを読み取り出力する

# --- ③ 書き込んだ内容を読み込み ---
for row_no in range(sheet.min_row, sheet.max_row + 1):
    for col_no in range(sheet.min_column, sheet.max_column + 1):
        value = sheet.cell(row_no, col_no).value
        print(value)

保存したシートの中を順番に調べて、入っている値を取り出しています。
見つけたデータを画面に表示することで、実際に正しく書き込まれているかを確認できます。

もっと分かりやすい学習サイトにするために

この記事を読んで「ここが分かりにくかった」「ここが難しかった」等の意見を募集しています。

世界一わかりやすいExcel自動化学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

<<前のページ

業務自動化の記事一覧

次のページ>>

記事URLをコピーしました