🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4603閲覧

[openpyxl] Excelシート内で任意の文字と完全一致するセルが存在する列を格納したい

daichiddd

総合スコア9

openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/01/08 06:41

編集2021/01/08 06:43

###実現したいこと

excelのシート内で、ある文字列と完全一致するセルがある列を格納するコードについて

コピーしたいものはセル列で、それの区別分けをE列のセルに入っている文字列でしたいです。
下記のコードでは区別分けがうまくできませんでした。

最後ですべての列がコピーされるのですが、この部分がよく分かりません。
検索したものをそのまま使い、いろいろいじってみましたがうまくいかないので有識者の方、ご意見いただければ幸いです。

恐らく初歩的な問題だと思いますが、よろしくお願いいたします。
参照ページ『https://gammasoft.jp/support/openpyxl-iter-rows/』

発生している問題・エラーメッセージ

Excelシートに入っているセルの文字列 [None, None, None, None, None] [None, None, None, None, None] [None, None, None, None, None] ['名前', '年齢', '性別', '出身', '部活'] ['佐藤', 12, '男', '福島', '写真クラブ'] ['渡辺', 23, '女', '愛媛', '陸上部'] ['山田', 22, 'なし', '京都', '野球部'] ['相田', 111, '男', '鹿児島', '陸上部'] ------------------------------------------------- 実行結果 ['山田', 22, 'なし', '京都', '野球部'] ['渡辺', 23, '女', '愛媛', '陸上部', '相田', 111, '男', '鹿児島', '陸上部'] ['佐藤', 12, '男', '福島', '写真クラブ', '渡辺', 23, '女', '愛媛', '陸上部', '山田', 22, 'なし', '京都', '野球部', '相田', 111, '男', '鹿児島', '陸上部']

該当のソースコード

python

1 2import os 3import openpyxl as px 4import re 5 6wb = px.load_workbook(r"C:\Users\---\Desktop\MyPandas\test.xlsx") 7ws = wb["Sheet1"] 8 9print("Excelシートに入っているセルの文字列") 10print("") 11active_sheet = wb.active 12for row in active_sheet.rows: 13 excel = [] 14 for cell in row: 15 excel.append(cell.value) 16 print(excel) 17#格納するリスト 18bb_clb = [] 19tf_clb = [] 20pic_clb = [] 21 22 23#空行の定義 24def is_empty(cell): 25 return cell.value is None or not str(cell.value).strip() 26 27#Excelシートで一列ごとに対応するリストへ格納 28#部活で格納するリストを分ける 29for row in ws.iter_rows(min_row = 5): 30 if all(is_empty(c) for c in row): 31 break 32 elif (row[4].value == "野球部"): 33 for col in row: 34 bb_clb.append(col.value) 35 elif (row[4].value == "陸上部"): 36 for col in row: 37 tf_clb.append(col.value) 38 else: row[4].value == "写真クラブ" 39 for col in row: 40 pic_clb.append(col.value) 41 42print("") 43print("-------------------------------------------------") 44print("") 45print("実行結果") 46print(bb_clb) 47print(tf_clb) 48print(pic_clb) 49 50 51

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

写真クラブの判定のところがelseになっているので他の判定で省かれたデータがすべて追加されてしまっています。
以下のようにelifに修正すれば上手く条件分けできるようになります。

python

1from openpyxl import load_workbook 2 3wb = load_workbook( 4 r"C:\Users\---\Desktop\MyPandas\test.xlsx") 5ws = wb["Sheet1"] 6 7print("Excelシートに入っているセルの文字列") 8print("") 9active_sheet = wb.active 10for row in active_sheet.rows: 11 excel = [] 12 for cell in row: 13 excel.append(cell.value) 14 print(excel) 15# 格納するリスト 16bb_clb = [] 17tf_clb = [] 18pic_clb = [] 19 20 21# 空行の定義 22def is_empty(cell): 23 return cell.value is None or not str(cell.value).strip() 24 25 26# Excelシートで一列ごとに対応するリストへ格納 27# 部活で格納するリストを分ける 28for row in ws.iter_rows(min_row=5): 29 if all(is_empty(c) for c in row): 30 break 31 elif (row[4].value == "野球部"): 32 for col in row: 33 bb_clb.append(col.value) 34 elif (row[4].value == "陸上部"): 35 for col in row: 36 tf_clb.append(col.value) 37 elif (row[4].value == "写真クラブ"): # elseをelifに修正 38 for col in row: 39 pic_clb.append(col.value) 40 41print("") 42print("-------------------------------------------------") 43print("") 44print("実行結果") 45print(bb_clb) 46print(tf_clb) 47print(pic_clb) 48
追記

因みにiter_rows()の引数にvalues_only=Trueを設定すると、cellオブジェクトではなくセルの中の値を受け取るようになるので代入の部分を簡単に書くことができます。
iter_rows() | openpyxlドキュメント

python

1# 空行の定義 2def is_empty(cell): 3 return cell is None or not str(cell).strip() 4 5 6# Excelシートで一列ごとに対応するリストへ格納 7# 部活で格納するリストを分ける 8for row in active_sheet.iter_rows(min_row=5, values_only=True): 9 if all(is_empty(c) for c in row): 10 break 11 if row[4] == "野球部": 12 bb_clb.extend(row) 13 elif row[4] == "陸上部": 14 tf_clb.extend(row) 15 elif row[4] == "写真クラブ": 16 pic_clb.extend(row)

投稿2021/01/08 07:21

編集2021/01/08 08:01
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

daichiddd

2021/01/08 07:39

ありがとうございます!無事解決できました。 こんな初歩的な所でつまずいてしまいお恥ずかしい限りです。。。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2021/01/08 07:50

お役に立てたようで何よりです。 期待通りに動かなかったときはデバッグして確認してみるといいかもしれませんね。
daichiddd

2021/01/08 08:13

追記までしていただいて本当にありがとうございます。。。 pythonはおろかプログラミングも初学者なため、このような情報はとても参考になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問