名簿や製品のリスト表で、ある行にだけ「※」や「∗」などの特定の文字でマークを付けておくことがあります。例えば、以下の社員名簿では有資格者に「∗」でマークを付けています。

members list

今回はこのマークを付けた行だけ別シートに転記する処理をPythonでプログラミングする方法をご紹介します。さらに、そのシートを別ファイルに保存する方法も説明します。

本記事の目次
本記事のプログラムは、Windows10 + Python3.7 で実行を確認しています。

プログラミングの手順

まず以下のように手順を考えておきます。ポイントは2つめです。転記する行は先に選別してリストに入れておきます。そうすれば、後はそのリストを別シートに書き込むだけになります。

  1. エクセルファイルを開く
  2. エクセルファイルを1行ずつ読み込み、マークの付いている行だけをリストに入れておく
  3. 新規シートを作成する
  4. 新規シートにリストに入れておいた行を転記する
  5. エクセルファイルを保存する

プログラミング

Pythonでエクセルファイルを操作するには、OpenPyXL という外部ライブラリがよく利用されます。OpenPyXLはpipというツールで簡単にインストールできます。

今回の処理はこのOpenPyXLを用いて以下のようにプログラミングできます。

# masters_copy.py
import openpyxl

# 1) エクセルファイルを開く
wb = openpyxl.load_workbook("company_members_cert.xlsx")
ws = wb["社員名簿"]

# 有資格者の行
masters_rows = []

# 2) エクセルファイルを1行ずつ読み込み(2行目から)、
for row in ws.iter_rows(min_row=2):
    # マークの付いている行だけをリストに入れておく
    if row[6].value == "*":
        masters_rows.append(row)

# 3) 新規シートを作成する
ws2 = wb.create_sheet(title="有資格者")

# 4) 新規シートにリストに入れておいた行を転記する
for master_row in masters_rows:
    ws2.append([r.value for r in master_row])

# 5) エクセルファイルを保存する
wb.save("company_members_cert.xlsx")
サンプルデータ : company_members_cert.zip

プログラムを実行すると以下のように「有資格者」というシートが新規に追加され、そこにマーク「∗」が付いた行だけが転記されます。

members list after

ここでポイントになるのは、OpenPyXLライブラリの使い方に関する以下の2点です。

ポイント1:エクセルのシートを1行ずつ読み込む方法

データが入力されている「社員名簿」シートを変数wsに代入しました。そこから、1行ずつ読み込むにはiter_rows()メソッドを用います。今回は1行目がヘッダーになっているので、min_row=2をカッコ内に指定して2行目から読み込んでいます。

ポイント2:エクセルのシートに1行ずつ書き込む方法

シートに行のデータを1行ずつ書き込むには、append()メソッドを用います。1行分のデータをリストやタプルで追加できます

wst = wb.create_sheet("Test")

r1 = ["a1", "b1", "c1"]
r2 = ("a2", "b2", "c2")

wst.append(r1)
wst.append(r2)

上のようにシートに行データのr1,r2を追加すると以下のように書き込まれます。

worksheet append row

今回のコードでは、以下の[r.value for r in master_row]のようにリスト内包表記という方法で1行分のデータをリストにして、シートに追加しています。

for master_row in masters_rows:
    ws2.append([r.value for r in master_row])

リスト内包表記に慣れない場合は、以下のようにコーディングしても構いません。実務のプログラミングでは冗長さを気にする必要はありません

# リスト内包表記を使わない場合
for master_row in masters_rows:
    values = []
    for c in master_row:
        values.append(c.value)
    ws2.append(values)

転記したシートだけを別ファイルに保存する場合

転記したシートだけを別ファイルに保存したい場合は、以下のように元データのシートを削除し、読み込んだファイルと違う名前で保存します。

...
wb = openpyxl.load_workbook("company_members_cert.xlsx")
ws = wb["社員名簿"]
...
# 5) エクセルファイルを保存する
# 社員名簿シートを削除
wb.remove(ws)
# 違うファイル名で保存
wb.save("company_members_cert_sheet.xlsx")

ここで、シートを削除するには、ワークブックの変数wbからremove()メソッドを呼び出します。カッコ内に「社員名簿」シートを示す変数wsを指定すればワークブックから削除されます。

プログラムを実行すると以下のように転記したシートだけのワークブックが保存されます。

member list copied sheet

このようにすれば、元データのワークブックはそのままの状態に保てます

最後に

エクセルのデータを転記するには、元のセルから読み取った値を転記先のセルに書き込みます。ここで、「元のセルから値を読み取るタイミング」はプログラムで異なります。

例えば、以前ご紹介した以下のページでは、社員IDが一致するデータを転記しました。そこでは、まず元のデータを最初にすべて読み込み、書き込む時にデータをフィルタリングしました。この方法なら、必要な項目だけ選びながらデータを書き込むことも簡単にできます。

no image
VLOOKUPはビジネスで頻繁に使うエクセルの関数の一つです。この関数を使えば、他の表から行データを検索して転記できます。 例えば、以下のような社員名簿から社内資格保有者のデータを別シートに転記…

一方、今回の場合は、最初にマークがある行だけをフィルタリングして行ごとリストに入れています。そのためコードは短くシンプルになっていますが、書き込む項目を選びたい場合は処理を加える必要があります。

プログラミングしたい処理に応じて、ぜひどちらもエクセルファイルをPythonで転記する時の参考にしてください。