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

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

詳細はこちら
openpyxl

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

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

解決済

1回答

6538閲覧

[openpyxl] 所定セル列において、空白に至るまでセル数をカウント

daichiddd

総合スコア9

openpyxl

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

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

0グッド

0クリップ

投稿2021/01/14 16:25

前提・実現したいこと

python初学者です。
python,openpyxlを用いてExcel作業の自動化について取り組んでいます。

指定した列において、ある単語(要素を取りまとめるグループのような意味を持つ)が入ったセルから何かデータが記入されたセルが続きます。(下記コード参照)
セルが続いていくと最後は空白セルに到着します。

到着した際、ある単語が入ったセル行から空白までの数をカウントしたいです。
このときある単語と空白は除きます。

実際にコードを書き予想した結果は得られたのですが冗長なものになってしまいました
何か別のやり方等あれば、後学のために参考にしたいです。

恐らく関数を作ってあげればよいのですが、、、有識者の方のご意見をお聞きしたいです。
ところどころ危ない所がありますが、ぜひ良ければ添削の程よろしくお願いいたします。

ソースコード

import os import openpyxl as px import re #--------------------------------------------------------------- # 出力結果の参考 #-------------------------------------------------------------- print("陸上部/出力してほしい数 : 7") print("野球部/出力してほしい数 : 4") print("写真部/出力してほしい数 : 2") in_path = r"C:\Users\---\Desktop\MyPandas\book.xlsx" wb = px.load_workbook(in_path) ws = wb["Sheet1"] # シート内のデータ確認 def print_data(ws): print("") for row in ws.iter_rows(values_only=True): print(row) print("") print_data(ws) #------------------------------- # 名前欄に入っている各部活の人数をカウント #-------------------------------- # 用語の定義 col_start_idx = 2# B列を探索 # それぞれの部員数 # 空白が含まれるため、その分引く tf_counter = 0 - 1 bb_counter = 0 - 1 pic_counter = 0 - 1 # 2列目で陸上部の部員数をカウント for a in range(1,30): name_list = ws.cell(row = a, column = col_start_idx).value if "陸上部" == name_list: start_tf = a + 2# 部活名と名前分,+ 2 を加える for a_tf in range(start_tf, 30): name_list_tf = ws.cell(row = a_tf, column = col_start_idx).value tf_counter += 1 if name_list_tf is None: print("陸上部員数↓") print(tf_counter) print("") break elif "野球部" == name_list: start_bb = a + 2 for a_bb in range(start_bb, 30): name_list_bb = ws.cell(row = a_bb, column = col_start_idx).value bb_counter += 1 if name_list_bb is None: print("野球部員数↓") print(bb_counter) print("") break elif "写真部" == name_list: start_pic = a + 2 for a_pic in range(start_pic, 30): name_list_pic = ws.cell(row = a_pic, column = col_start_idx).value pic_counter += 1 if name_list_pic is None: print("写真部員数↓") print(pic_counter) print("") break

出力結果

陸上部/出力してほしい数 : 7 野球部/出力してほしい数 : 4 写真部/出力してほしい数 : 2 (None, '陸上部') (None, '名前') (None, '布川') (None, '結城') (None, '溝井') (None, '福田') (None, '儀藤') (None, '加藤') (None, '熊田') (None, None) (None, '野球部') (None, '名前') (None, '矢部') (None, '相川') (None, '高田') (None, '郡山') (None, None) (None, '写真部') (None, '名前') (None, '高山') (None, '不見維持') 陸上部員数↓ 7 野球部員数↓ 4 写真部員数↓ 2

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

win 10
python 3.8.3
openpyxl 3.0.5

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

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

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

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

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

guest

回答1

0

ベストアンサー

ご自分で作って動いているのですね。
添削するのは時間がかかりますので、参考プログラムだけ載せておきます。

python

1import openpyxl as px 2 3wb = px.load_workbook('book.xlsx') 4ws = wb["Sheet1"] 5 6def split_list(lst): 7 s_list = [] 8 part = [] 9 for x in lst: 10 if x == None: 11 s_list.append(part) 12 part = [] 13 else: 14 part.append(x) 15 s_list.append(part) 16 return s_list 17 18clubs = split_list([x for _, x in ws.iter_rows(values_only=True)]) 19 20for club in clubs: 21 if club[1] == '名前': 22 print(club[0] + '員数') 23 print(len(club) - 2) 24 else: 25 print('データが間違っています')

投稿2021/01/14 23:16

ppaul

総合スコア24670

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問