見出し画像

Python "openpyxl" No.4 データの抽出と振り分け

1. Excelシートのデータ抽出

データは本で勉強してる分のサンプルです。

スクリーンショット 2021-03-07 23.34.36

こんな感じ。3行目からデータが入ってるのでA3からF9までのデータ抽出。
values = [cell.value for cell in row]
ってのがリスト内包表記ってやつらしい。リストの中で値を抽出していってるって感じかな。それを3行目から9行目まで繰り返してるって感じ。
とりあえずそんな仕組みだって事だ(笑)。

右端の計算式はExcel上でセル内に計算式が入ってるからそのまんま抽出しているみたい。

スクリーンショット 2021-03-07 23.58.21

load_workbookメソッドに data_only = Trueを追加してやると計算された値が抽出される。

ちなみにどこまでデータが入っているか分からない場合、データが空かどうかを調べてデータを抽出する範囲を調べて実行する。

スクリーンショット 2021-03-08 0.08.21

こんな感じ。sheetの範囲をF9999にしておいて、cellの値が空白のところで繰り返し処理が終わるって感じです。

iter_rows メソッドを使うとこんな感じ。

スクリーンショット 2021-03-08 0.15.39

引数のmaxを省略して空のセルまでのデータを抽出してる。

2.ブックとシートの操作

ブックの操作

book = excel.workbook()    #新規ワークブック作成
book = excel.load_workbook("ファイル名.xlsx")      #ブックを開く
book = excel.load_workbook("ファイル名.xlsx", date_only = True)   #セル内に計算式がある場合
book.close    #ブックを閉じる

シートの選択

sheet = book.active   #アクティブなシートの取得
sheet = book.worksheet[シート番号]    # 任意のシート番号のシートを取得
sheet = book["シート名"]         # シート名を指定して取得
print(book.sheetnames)          # ブックないのシート名の一覧を作る。

シート作成、コピー、削除とシート名変更。

sheet = book.create_sheet(title = "シート名")    # 新規シートを作成
sheet = book.copy_worksheet(book["シート名"])    # 既存のシートをコピーして得る
sheet.title = "新しい名前"             # シート名を変更する
book.remove(book["シート名"])               # シートを削除

3.項目を抽出して別ブックに保存

スクリーンショット 2021-03-08 6.50.47

本のサンプル。これを横浜と名古屋の名簿だけ抽出して別ブックに貼り付けする。

スクリーンショット 2021-03-08 6.54.22

うーん。分かりにくいので分解。

スクリーンショット 2021-03-08 7.02.35

最初の部分。ブック呼び出してシート選択。

スクリーンショット 2021-03-08 7.04.40

分かりにくいところはレッツprint(笑)
最初のcustomersに項目だけのリストを作成かな。
んでExcelのデータをvaluesに放り込むと。
そのvaluesからリストの2項目め(values[1])が横浜か名古屋のデータのみを抽出して、customersのリストに放り込んでいくと。

スクリーンショット 2021-03-08 7.12.35

んで新しいブックを作成して、A1にコメント。
んでcustomersのリストから1項目ずつ取り出してセルに書き出していくと。
最後にセーブ!

完成がこちらでございます。

スクリーンショット 2021-03-08 7.16.21

1個ずつ考えていけばよく分かるかな。んーまだまだだねw

プランごとに別シートに分ける。

スクリーンショット 2021-03-08 23.48.07

スクリーンショット 2021-03-08 23.49.14

プログラムと実行結果はこんな感じ。
一個ずつ確認指定くと、(レッツprint)

スクリーンショット 2021-03-08 23.50.27

sells に名簿のデータを書き出してるのかな。

スクリーンショット 2021-03-08 23.52.32

nameにはこんな感じ。
てか、(name,area,plan) = cells って書き方できるんやね。便利w

スクリーンショット 2021-03-08 23.54.17

snameは後ろに”プラン”をつけてるんやね。

スクリーンショット 2021-03-08 23.58.46

下の if と else でsnameに含まれるシート名があるかチェックしているんやね。なければ新しいシート作成して項目(名前、住所、プラン)を作成。あればcellsのデータを順に書き込んでいくと。
それを元の顧客データがある分くり返すと。難しい〜。
そんな感じで今回はここまで。


この記事が気に入ったらサポートをしてみませんか?