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

一つ前のページでは シートからデータを読み込む方法 について学習しました。
今回は シートにデータを書き込む方法 について見ていきましょう。
Chapter1:PythonによるExcel自動化の基本を身につけよう
・Chapter1-1:openpyxlとは何か|インストールと動作確認
・Chapter1-2:PythonでExcelファイルを作成しよう
・Chapter1-3:Excelシートからデータを読み込もう
・Chapter1-4:Excelシートにデータを書き込もう ◁今回はここ
・Chapter1-5:データを新規シートへ自動振り分けしよう
・Chapter1-6:簡単なExcel自動化を体験しよう
Chapter2:自動化ツールを.exe化して配布しよう
Chapter3:現場で使える便利な自動化ツールを4つ作ろう
Chapter4:Webスクレイピングでデータを自動で集めよう
Chapter5:自動化ツールを作ってお金を稼ごう
前回の記事では、Excel シートから既存のデータを読み取る方法を学びました。
今回はさらに一歩進めて、Excelシートに新しいデータを書き込む方法を学びます。
単にデータを読み込むだけでなく、条件に応じて新しい情報を計算し、自動的にセルへ書き込めるようになると、日々の作業効率は大きく向上します。

Excelにデータを書き込む方法|セル指定と保存の基本
Excel のシートに新しい値を入力する作業は簡単に実現できます。
cell()メソッド でセルを指定して値を代入し、最後に saveメソッド でファイルを保存するだけで、Excel 上に結果が反映されます。
今回は年齢データをもとに「未成年」「成人」「シニア」といった区分を自動的に書き込む方法を学んでいきましょう。
前回使用したExcel資料「Chapter1-3.xlsx」を引き続き使用します。
資料がない方は↓↓の「make_workbook1-3.py」をコピーして適切な場所(※)に保存し、実行してください。
- make_workbook1-3.py
-
import pathlib from openpyxl import Workbook from openpyxl.styles import Font, PatternFill, Border, Side, Alignment from openpyxl.styles.colors import Color def create_chapter1_3_workbook(): file_path = pathlib.Path(__file__).parent / "workbooks" file_path.mkdir(exist_ok=True) save_path = file_path / "Chapter1-3.xlsx" workbook = Workbook() sheet = workbook.active sheet.title = "Sheet1" # 元ファイルに合わせた設定 sheet.sheet_format.defaultRowHeight = 18.75 sheet.sheet_format.defaultColWidth = 9 sheet.column_dimensions["B"].width = 11.625 sheet.column_dimensions["D"].width = 11.375 # データ rows = [ ["名前", "性別", "年齢", "年齢区分"], ["吉田 彩花", "女", 45, None], ["小林 翔太", "男", 21, None], ["長谷川 清", "男", 80, None], ["山田 大輔", "男", 40, None], ["佐藤 陽翔", "男", 1, None], ["渡辺 亮", "男", 50, None], ["伊藤 陽菜", "女", 12, None], ["木村 智子", "女", 75, None], ["鈴木 結衣", "女", 3, None], ["松本 健太", "男", 30, None], ["石井 誠", "男", 70, None], ["中村 莉子", "女", 18, None], ["高橋 悠真", "男", 6, None], ["田中 美月", "女", 9, None], ["岡田 隆", "男", 60, None], ["藤田 美穂", "女", 55, None], ["山本 大和", "男", 15, None], ["村上 幸子", "女", 65, None], ["佐々木 真由", "女", 35, None], ["加藤 愛美", "女", 25, None], ] # スタイル base_font = Font(name="游ゴシック", size=11) header_fill = PatternFill( patternType="solid", fgColor=Color(theme=5, tint=0.4) ) thin = Side(style="thin", color=Color(auto=1)) header_border = Border(left=thin, right=thin, top=thin, bottom=thin) first_row_border_bd = Border(left=thin, right=thin, bottom=thin) first_row_border_c = Border(left=thin, bottom=thin) body_border_bd = Border(left=thin, right=thin, top=thin, bottom=thin) body_border_c = Border(left=thin, top=thin, bottom=thin) body_border_e = Border(left=thin, right=thin, top=thin, bottom=thin) header_alignment = Alignment(vertical="center") body_alignment = Alignment(vertical="center", wrap_text=True) empty_alignment = Alignment(vertical="center") start_row = 2 start_col = 2 # B列 for row_index, row_values in enumerate(rows, start=start_row): for col_index, value in enumerate(row_values, start=start_col): cell = sheet.cell(row=row_index, column=col_index, value=value) cell.font = base_font if row_index == 2: cell.fill = header_fill cell.border = header_border cell.alignment = header_alignment else: if col_index in (2, 4): # B列、D列 cell.border = first_row_border_bd if row_index == 3 else body_border_bd cell.alignment = body_alignment elif col_index == 3: # C列 cell.border = first_row_border_c if row_index == 3 else body_border_c cell.alignment = body_alignment elif col_index == 5: # E列 cell.border = body_border_e cell.alignment = empty_alignment workbook.save(save_path) print(f"{save_path} を作成しました。") if __name__ == "__main__": create_chapter1_3_workbook()
- (※)コードの保存場所について
-
コピーしたコードは以下の階層になるように保存して下さい。
この理由については、Chapter1-2 の記事で詳しく解説しています。
業務自動化学習/ # 学習フォルダ ├── Chap1/ # チャプター1の保存フォルダ │ ├── Chap1-4/ # チャプター1-4の保存フォルダ │ │ ├── Chapter1-4.py │ │ ├── make_workbook1-3.py # ☆ここに保存 │ │ └── workbooks/ │ │ ├── Chapter1-3.xlsx │ │ └── Chapter1-4.xlsx

Chapter1-3から続けて学習している人は、ExcelファイルをコピーしてChapter1-4のworkbooksフォルダに貼り付けよう!
Excelファイルに書き込む方法|サンプルコードの紹介

以下のコードでは、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文の行で指定した開始行から最終行までを順番に処理するループを作り、Excel の各行を一つずつ処理できるようになります。
次に age = ... の行で cellメソッドとvalueプロパティ を用いてその行の年齢データを取得し、その後if文で年齢区分を判定 ⇒ 結果を変数categoryに代入。
最後にまた cellメソッドとvalueプロパティ を使って、判定結果を対応するセルに書き込んでいます。
以上の動作により、元の年齢データの横に新しい列が作られ、そこに「未成年」「成人」「シニア」といった文字が自動的に入力される仕組みになっています。
結果を新しいファイルとして保存|saveメソッド
book.save(file_path / "Chapter1-4.xlsx")
プログラムの最後では、処理した結果を保存する必要があります。
この一行のおかげで、処理した結果を実際に Excel 上で確認できるようになります。
プログラムの最後に必ず保存処理を入れておくのが、Excel 自動化の基本的な流れです。
まとめ|Excelへの書き込みで押さえる基本
この記事では、Python と openpyxl を使って Excel シートに新しいデータを書き込む方法を学びました。
ポイントは次の通りです。
sheet.cell(row, col).valueで、特定のセルに値を代入book.save()でファイルを保存
これで、単なる読み取りだけでなく「Excel ファイルにデータを書き込む」スキルを身につけられました。
次回はさらに応用し、大量のコピー&ペーストの自動化に挑戦していきましょう。
練習問題|Excelへのデータの書き込みを体験しよう
今回学習した内容を復習する練習問題に挑戦しましょう。

問題|新しいExcelブックを作成して書き込み、出力しよう
新規にExcelファイルを作成し、シートにデータを書き込んで保存したあと、その内容を取得して画面に出力するプログラムを作成してください。
以下の要件に従ってコードを完成させて下さい。
- 新規ブックを作成し、シート名を変更すること(.titleプロパティで指定)
例:sheet.title = “練習問題1-4” cell()メソッドを用いて、複数のセルにデータを書き込むこと- 作成したExcelファイルを、training1-4.xlsxという名前で保存すること
- 保存した内容をシートから読み取り、printで出力すること
ヒント|コードの構成と穴埋め問題化
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
- ヒント① コードの構成を見る
-
正解のコードは上から順に以下のような構成となっています。
1.ライブラリの読み込みとファイル保存先の指定
・Excelを操作するために使うライブラリを準備する
・フォルダやファイルの場所を扱いやすくするために道具を使う
・保存先のパスを変数に入れておく2.新しいExcelブックとシートの準備
・新しいExcelファイルを作る(Workbook()クラスをインスタンス生成)
・最初に用意されているシートを取り出す(.activeプロパティを使用)
・シートに名前をつける(.titleプロパティを使用)3.セルにデータを書き込む
・セルの場所は行番号と列番号で決める
・sheet.cell(row, column, value=値)4.Excelファイルを保存する
・保存するには「ブックを保存する命令」を使う
・保存場所とファイル名を指定する
・拡張子は.xlsxにする5.シートからデータを読み取り出力する
・行と列を順番に調べる
・セルの中身を取り出す命令を使う
・取り出した値を画面に表示する
- ヒント② 穴埋め問題にする
-
以下のコードをコピーし、穴埋め部に適切なコードを書きこんで下さい。
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)
正解コードと詳細解説
例えば以下のようなプログラムが考えられます。
- 正解コード例
-
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)
- 正解コードの解説
-
ライブラリの読み込みとファイル保存先の指定
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)保存したシートの中を順番に調べて、入っている値を取り出しています。
見つけたデータを画面に表示することで、実際に正しく書き込まれているかを確認できます。
よくある質問(FAQ)|Excelシートにデータを書き込もう
Q1. 元データを壊したくありません。上書き保存ではなく「新規ファイルとして保存」する理由と運用のコツは?
本記事の手順では、読み取った元ブックとは別名で新しいブックを作成して保存しています。
これにより、処理結果を検証して問題があっても元データへ影響を与えません(例:入力は前章のブック、出力は本章のブックという分離)。
保存は処理の最後に行い、完成物だけを出力するのが安全です。
元ブックの所在は学習用の規定フォルダ(workbooks)にまとめ、入出力を明確に分けると管理しやすくなります。
Q2. 日本語ラベルや数値・日付を書き込むと、Excel上の見た目が想定と違うことがあります。データ型と表示形式の考え方は?
本章では条件に応じて文字列ラベルを新しい列へ書き込む例を扱っています。
Excelはセルの値(データ型)と表示形式の組み合わせで見た目が決まるため、数値や日付を書き込む場面では、Excel側の表示形式が想定どおりかも合わせて確認しましょう。
文字列ラベルはそのまま表示されますが、数値は小数点や桁区切り、日付は表示形式によって見え方が変わります。
見た目の揺れがある場合は、入力値の型が適切か、対象列が文字列扱いになっていないか、といった観点で点検すると原因を切り分けやすくなります。
Q3. 多くの行に書き込むときの注意点は?開始行の決め方、最終行まで回すコツ、欠損値や境界値の扱いは?
本章では「処理の開始行・対象列」を先に定義し、シートの最終行まで繰り返すという考え方を採っています。
開始行を固定しておくと見出し行を誤って上書きする事故を防ぎ、最終行はシートの最大行を基準に、上下端を含む範囲で回すのがポイントです。
欠損値や想定外の型が混ざる実務データでは、空欄行をそのまま書き換えない方針や、判定できない値に「未分類」を入れるといった防衛的なルールを決めておくと安定します。
年齢区分のように閾値の境界(例:20歳ちょうど)がある条件判定では、どちらに含めるかを明示し、処理対象列に結果だけを書き込む流れにすると、後工程の検証がしやすくなります。
最後に保存を忘れないことも基本です。


