4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PythonでExcel操作(読み書き編集編)

Last updated at Posted at 2022-05-06

経緯

自社でプログラミングに興味を持っているい人向けに
馴染みのあるExcelの操作で触れることができるように書いてみようと思いました!
今回はPythonを用いたExcelへの書き込みについて書きました。
なお使用するモノ、環境、ブックの取得、シートの取得等については
前回までの記事PythonでExcel操作(読み込み編)PythonでExcel操作(書き込み編)
ご参照ください

フォルダ階層

execel-controller/
 ├ excel_read.py
 └ Books/
   └ Book_read.xlsx
   └ Book_write.xlsx

実行方法

cd C:\???\execel-controller

実行する際にはPythonファイルが置いてあるexecel-controllerフォルダに移動

python excel.py

コマンドプロンプトで実行する際は
「python [実行するpythonファイル名].py」
で実行できる。
今回は「excel.py」の中身を変更して実行していく。

成果物

前回、前々回とopenpyxlでExcelへの読み書きを行ったので今回はそれらを組み合わせたものを
作りたいと思います。

概要(仮設定)

 1日の商品の売れた個数をまとめる「1日小計.xlsx」
 商品の情報をまとめる「商品情報.xlsx」
 「1日小計.xlsx」と「商品情報.xlsx」を元に一日の売り上げを
 「売り上げ.xlsx」に書き込む
 ※そもそも「1日小計.xlsx」でまとめておけよという
  ツッコミは受け付けませんので悪しからず、、、

1日小計.xlsx

スクリーンショット 2022-05-06 115619.jpg
商品名とその日売れた個数が記載されている

商品情報.xlsx

スクリーンショット 2022-05-06 120002.jpg
商品名と値段が記載されている

売り上げ.xlsx

スクリーンショット 2022-05-06 125245.jpg
最後に売り上げの結果を書き込む為何も書かれていない

one_day_subtotal.py

one_day_subtotal.py
# 売上小計オブジェクトクラス
class OneDaySubtotal:
    # 商品名
    product_name = None
    # 売上個数
    number_of_units_sold = None
    # 値段
    price = 0

    def __init__(self, value_list) :
        self.product_name  = value_list[0]
        self.number_of_units_sold = value_list[1]

せっかくなんでオブジェクトも使ってみたいと思います!
商品名と売上個数、値段を持ちコンストラクタでリストを
受け取ると商品名と売上個数を設定する。

excel.py

excel.py
# openpyxlをimport
import openpyxl
# one_day_subtotalをimport
import one_day_subtotal

# 1日小計.xlsxを1行ずつ読み込む
# セルの値(中身)を取得する
# ブックを変数に格納
one_day_subtotal_wb = openpyxl.load_workbook("Books/1日小計.xlsx", data_only=True)
# シートを変数に名前で格納
one_day_subtotal_ws = one_day_subtotal_wb["小計"]
# 行毎のデータを格納するリストを
row_list = []
# for分で1行づつ読み取り行リストに格納する
for row in one_day_subtotal_ws.iter_rows(min_row=2, min_col=1):
    # 空のリストを作成
    value_list = []
    # 1行分のデータをリストに格納する。
    for c in row:
        value_list.append(c.value)
    # 売上小計インスタンス
    ods = one_day_subtotal.OneDaySubtotal(value_list)
    # データリストを行リストに格納
    row_list.append(ods)

# 商品情報.xlsxを1行ずつ読み込む
# セルの値(中身)を取得する
# ブックを変数に格納
product_info_wb = openpyxl.load_workbook("Books/商品情報.xlsx", data_only=True)
# シートを変数に名前で格納
product_info_ws = product_info_wb["商品情報"]

# 行のリストをfor文で回す
for ods in row_list:
    # for分で1行づつ読み取り
    for i in range(1,10):
        if product_info_ws.cell(row=i, column=1).value == ods.product_name:
            ods.price = product_info_ws.cell(row=i, column=2).value


# 読み込んだリストをリストを書き込む
# ブックを変数に格納
write_wb = openpyxl.load_workbook("Books/売り上げ.xlsx")
# シートを変数に名前で格納
write_ws = write_wb["売り上げ"]
# ヘッダーの書き込み
h1 = write_ws["A1"]
h1.value = "商品名"
h2 = write_ws["B1"]
h2.value = "売上個数"
h3 = write_ws["C1"]
h3.value = "値段"
h4 = write_ws["D1"]
h4.value = "一日売上"

# 書き込みを開始する行番号
row_num = 2
#  読み取ったデータをBook_write.xlsxに書き込む
for ods in row_list:
    c1 = write_ws["A" + str(row_num)]
    c1.value = ods.product_name
    c2 = write_ws["B" + str(row_num)]
    c2.value = ods.number_of_units_sold
    c3 = write_ws["C" + str(row_num)]
    c3.value = ods.price
    c4 = write_ws["D" + str(row_num)]
    c4.value = int(ods.price) * int(ods.number_of_units_sold)
    # 1行進む
    row_num = row_num + 1

# 売り上げ.xlsxに上書保存
write_wb.save("Books/売り上げ.xlsx")

それぞれのExcelから情報を取得し、編集して「売り上げ.xlsx」に書きだします。

実行結果
スクリーンショット 2022-05-06 132850.jpg

まとめ

今回3回に渡ってPythonを利用したExcelの操作について
ザックリとではありますがまとめてみました。
そもそもExcelの操作ならVBAでいいかもしれませんが、Pythonのわかりやすいコードで馴染みのあるExcelの操作が出来るというテーマで書かせていただきました。

しかしPythonでのExcel操作にもいろいろな優位な点があるみたいなんで調べてみてください。
https://fastclassinfo.com/entry/which_is_better_python_vba/

コメントでご指摘、ご意見いただけると幸いです。

参考文献

PythonでExcel、メール、webを自動化する本

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?