teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

コメントの質問について追記

2021/01/09 19:47

投稿

退会済みユーザー
answer CHANGED
@@ -63,4 +63,141 @@
63
63
  > 内容の理解不足もあり、どこが間違っていてこの出力結果になるのか分からないため質問させていただきます。
64
64
 
65
65
  デバッグという機能を使えばコードの処理を1行ずつ確認することができます。
66
- もしお使いのエディタまたはIDEにデバッグ機能がついているなら、意図しない動作をした際はデバッグして1行ずつ確認することをお勧めします。
66
+ もしお使いのエディタまたはIDEにデバッグ機能がついているなら、意図しない動作をした際はデバッグして1行ずつ確認することをお勧めします。
67
+
68
+ ___
69
+ #####追記(コメントの質問について)
70
+
71
+
72
+ > ```python
73
+ for a, tf_clb_list in enumerate(tf_clb, start = 1):
74
+ for i in range(1,3):
75
+ for j in range(1,6):
76
+ ws.cell(row = i, column = j,value = tf_clb_list)
77
+ > ```
78
+
79
+ このコードではリストの最初の要素が指定したすべてのセルに書き込まれ、次の要素がすべてのセルに書き込まれ、その次の要素が・・・となってしまっています。
80
+
81
+ 方法としてはいくつか方法がありますが、上のコードを生かすなら以下のようにカウンタ変数を利用する感じでしょうか。
82
+
83
+ ```python
84
+ counter = 0
85
+ for i in range(1, 3):
86
+ for j in range(1, 6):
87
+ ws.cell(row=i, column=j, value=tf_clb[counter])
88
+ counter += 1
89
+ ```
90
+
91
+ ただカウンタ変数を使うのはあまりよくありませんし、データの数が変わったらrange()の部分をいちいち変更する必要がります。
92
+
93
+ 個人的には以下のように行のデータをappend()で各要素に格納して二次元のリストにしてからセルに書き込む方がいいと思います。
94
+ 上の方法では同じ部活に所属している人のデータが一列の格納されていましたが、この方法では行ごとにデータがきちんと分けられているのでお行儀がいいですし、カウンタ変数は必要ありません。
95
+
96
+ ```python
97
+ for row in active_sheet_1.iter_rows(min_row=5, values_only=True):
98
+ if all(is_empty(c) for c in row):
99
+ break
100
+ if "野球部" in row[4]:
101
+ bb_clb.append(row)
102
+ elif "陸上部" in row[4]:
103
+ tf_clb.append(row)
104
+ elif "写真クラブ" in row[4]:
105
+ pic_clb.append(row)
106
+
107
+ print("")
108
+ print("-------------------------------------------------")
109
+ print("")
110
+ print("< 実行結果 >")
111
+ print("")
112
+
113
+
114
+ for i, row in enumerate(tf_clb, 1):
115
+ for j, elem in enumerate(row, 1):
116
+ ws.cell(row=i, column=j, value=elem)
117
+ ```
118
+
119
+ 最終行に書き込んでもいいなら以下のようにワークシートオブジェクトの`append()`を使うこともできます。
120
+
121
+ ```python
122
+ for row in sheet_1.iter_rows(min_row=5, values_only=True):
123
+ if all(is_empty(c) for c in row):
124
+ break
125
+ if "野球部" in row[4]:
126
+ bb_clb.append(row)
127
+ elif "陸上部" in row[4]:
128
+ tf_clb.append(row)
129
+ elif "写真クラブ" in row[4]:
130
+ pic_clb.append(row)
131
+
132
+ print("")
133
+ print("-------------------------------------------------")
134
+ print("")
135
+ print("< 実行結果 >")
136
+ print("")
137
+
138
+
139
+ for bb_clb_elem in bb_clb:
140
+ ws.append(bb_clb_elem)
141
+ ```
142
+
143
+ 新しいシートに書き込むサンプルも載せておきます(少し修正加えてます)。
144
+ 参考にしてみてください。
145
+
146
+ ```python
147
+ import openpyxl as px
148
+
149
+
150
+ # シートのデータをすべて表示
151
+ def print_ws_data(ws):
152
+ for row in ws.iter_rows(values_only=True):
153
+ print(row)
154
+
155
+
156
+ # 空行かどうか判定
157
+ def is_empty(cell):
158
+ return cell is None or not str(cell).strip()
159
+
160
+
161
+ print("< Sheet1 に入っているセルの文字列 >")
162
+ print("")
163
+
164
+ file_name = r"C:\Users\---\Desktop\MyPandas\test.xlsx"
165
+ wb = px.load_workbook(file_name)
166
+
167
+ sheet_1 = wb.worksheets[0]
168
+
169
+ print_ws_data(sheet_1)
170
+
171
+ # 格納するリスト
172
+ bb_clb = []
173
+ tf_clb = []
174
+ pic_clb = []
175
+
176
+ # Excelシートで一列ごとに対応するリストへ格納
177
+ # 部活で格納するリストを分ける
178
+ for row in sheet_1.iter_rows(min_row=5, values_only=True):
179
+ if all(is_empty(c) for c in row):
180
+ break
181
+ if "野球部" in row[4]:
182
+ bb_clb.append(row)
183
+ elif "陸上部" in row[4]:
184
+ tf_clb.append(row)
185
+ elif "写真クラブ" in row[4]:
186
+ pic_clb.append(row)
187
+
188
+ print("")
189
+ print("-------------------------------------------------")
190
+ print("")
191
+ print("< 実行結果 >")
192
+ print("")
193
+
194
+ ws_2 = wb.create_sheet()
195
+
196
+ for tf_clb_elem in tf_clb:
197
+ ws_2.append(tf_clb_elem)
198
+
199
+ wb.save(file_name)
200
+
201
+ print_ws_data(ws_2)
202
+
203
+ ```

1

微修正

2021/01/09 19:47

投稿

退会済みユーザー
answer CHANGED
@@ -1,5 +1,6 @@
1
1
  以下の質問の続きですね。
2
2
  [[openpyxl] Excelシート内で任意の文字と完全一致するセルが存在する列を格納したい | teratail](https://teratail.com/questions/314754)
3
+ ___
3
4
 
4
5
  > しかしそれを張り付ける際に元のセル行の様にではなく、一つのセルにまとめて張り付けられてしまいます。
5
6
 
@@ -21,7 +22,7 @@
21
22
 
22
23
  `append()`はリストに新しい要素を一つ作成してその要素に入力したデータを格納するメソッドです。
23
24
  しかし上のコードの5,7,9行目では1行のデータが格納された変数を事前に作成したリストに`append()`を使ってリストに追加してしまっています。
24
- そのため行のデータがまるまる一つの要素に入ってしまい、そのまま一つのセルに書き込まれています。
25
+ そのため行のデータがまとめて一つの要素に入ってしまい、そのまま一つのセルに書き込まれています。
25
26
 
26
27
  なので以前の回答でも書いていたはずですが、行のデータ(リストやタプル)を要素ごとに分けて追加したい場合はappend()ではなく`extend()`を使う必要があります。
27
28
 
@@ -58,7 +59,7 @@
58
59
  ```
59
60
 
60
61
 
61
-
62
+ ___
62
63
  > 内容の理解不足もあり、どこが間違っていてこの出力結果になるのか分からないため質問させていただきます。
63
64
 
64
65
  デバッグという機能を使えばコードの処理を1行ずつ確認することができます。