回答編集履歴

2

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

2021/01/09 19:47

投稿

退会済みユーザー
test CHANGED
@@ -129,3 +129,277 @@
129
129
  デバッグという機能を使えばコードの処理を1行ずつ確認することができます。
130
130
 
131
131
  もしお使いのエディタまたはIDEにデバッグ機能がついているなら、意図しない動作をした際はデバッグして1行ずつ確認することをお勧めします。
132
+
133
+
134
+
135
+ ___
136
+
137
+ #####追記(コメントの質問について)
138
+
139
+
140
+
141
+
142
+
143
+ > ```python
144
+
145
+ for a, tf_clb_list in enumerate(tf_clb, start = 1):
146
+
147
+ for i in range(1,3):
148
+
149
+ for j in range(1,6):
150
+
151
+ ws.cell(row = i, column = j,value = tf_clb_list)
152
+
153
+ > ```
154
+
155
+
156
+
157
+ このコードではリストの最初の要素が指定したすべてのセルに書き込まれ、次の要素がすべてのセルに書き込まれ、その次の要素が・・・となってしまっています。
158
+
159
+
160
+
161
+ 方法としてはいくつか方法がありますが、上のコードを生かすなら以下のようにカウンタ変数を利用する感じでしょうか。
162
+
163
+
164
+
165
+ ```python
166
+
167
+ counter = 0
168
+
169
+ for i in range(1, 3):
170
+
171
+ for j in range(1, 6):
172
+
173
+ ws.cell(row=i, column=j, value=tf_clb[counter])
174
+
175
+ counter += 1
176
+
177
+ ```
178
+
179
+
180
+
181
+ ただカウンタ変数を使うのはあまりよくありませんし、データの数が変わったらrange()の部分をいちいち変更する必要がります。
182
+
183
+
184
+
185
+ 個人的には以下のように行のデータをappend()で各要素に格納して二次元のリストにしてからセルに書き込む方がいいと思います。
186
+
187
+ 上の方法では同じ部活に所属している人のデータが一列の格納されていましたが、この方法では行ごとにデータがきちんと分けられているのでお行儀がいいですし、カウンタ変数は必要ありません。
188
+
189
+
190
+
191
+ ```python
192
+
193
+ for row in active_sheet_1.iter_rows(min_row=5, values_only=True):
194
+
195
+ if all(is_empty(c) for c in row):
196
+
197
+ break
198
+
199
+ if "野球部" in row[4]:
200
+
201
+ bb_clb.append(row)
202
+
203
+ elif "陸上部" in row[4]:
204
+
205
+ tf_clb.append(row)
206
+
207
+ elif "写真クラブ" in row[4]:
208
+
209
+ pic_clb.append(row)
210
+
211
+
212
+
213
+ print("")
214
+
215
+ print("-------------------------------------------------")
216
+
217
+ print("")
218
+
219
+ print("< 実行結果 >")
220
+
221
+ print("")
222
+
223
+
224
+
225
+
226
+
227
+ for i, row in enumerate(tf_clb, 1):
228
+
229
+ for j, elem in enumerate(row, 1):
230
+
231
+ ws.cell(row=i, column=j, value=elem)
232
+
233
+ ```
234
+
235
+
236
+
237
+ 最終行に書き込んでもいいなら以下のようにワークシートオブジェクトの`append()`を使うこともできます。
238
+
239
+
240
+
241
+ ```python
242
+
243
+ for row in sheet_1.iter_rows(min_row=5, values_only=True):
244
+
245
+ if all(is_empty(c) for c in row):
246
+
247
+ break
248
+
249
+ if "野球部" in row[4]:
250
+
251
+ bb_clb.append(row)
252
+
253
+ elif "陸上部" in row[4]:
254
+
255
+ tf_clb.append(row)
256
+
257
+ elif "写真クラブ" in row[4]:
258
+
259
+ pic_clb.append(row)
260
+
261
+
262
+
263
+ print("")
264
+
265
+ print("-------------------------------------------------")
266
+
267
+ print("")
268
+
269
+ print("< 実行結果 >")
270
+
271
+ print("")
272
+
273
+
274
+
275
+
276
+
277
+ for bb_clb_elem in bb_clb:
278
+
279
+ ws.append(bb_clb_elem)
280
+
281
+ ```
282
+
283
+
284
+
285
+ 新しいシートに書き込むサンプルも載せておきます(少し修正加えてます)。
286
+
287
+ 参考にしてみてください。
288
+
289
+
290
+
291
+ ```python
292
+
293
+ import openpyxl as px
294
+
295
+
296
+
297
+
298
+
299
+ # シートのデータをすべて表示
300
+
301
+ def print_ws_data(ws):
302
+
303
+ for row in ws.iter_rows(values_only=True):
304
+
305
+ print(row)
306
+
307
+
308
+
309
+
310
+
311
+ # 空行かどうか判定
312
+
313
+ def is_empty(cell):
314
+
315
+ return cell is None or not str(cell).strip()
316
+
317
+
318
+
319
+
320
+
321
+ print("< Sheet1 に入っているセルの文字列 >")
322
+
323
+ print("")
324
+
325
+
326
+
327
+ file_name = r"C:\Users\---\Desktop\MyPandas\test.xlsx"
328
+
329
+ wb = px.load_workbook(file_name)
330
+
331
+
332
+
333
+ sheet_1 = wb.worksheets[0]
334
+
335
+
336
+
337
+ print_ws_data(sheet_1)
338
+
339
+
340
+
341
+ # 格納するリスト
342
+
343
+ bb_clb = []
344
+
345
+ tf_clb = []
346
+
347
+ pic_clb = []
348
+
349
+
350
+
351
+ # Excelシートで一列ごとに対応するリストへ格納
352
+
353
+ # 部活で格納するリストを分ける
354
+
355
+ for row in sheet_1.iter_rows(min_row=5, values_only=True):
356
+
357
+ if all(is_empty(c) for c in row):
358
+
359
+ break
360
+
361
+ if "野球部" in row[4]:
362
+
363
+ bb_clb.append(row)
364
+
365
+ elif "陸上部" in row[4]:
366
+
367
+ tf_clb.append(row)
368
+
369
+ elif "写真クラブ" in row[4]:
370
+
371
+ pic_clb.append(row)
372
+
373
+
374
+
375
+ print("")
376
+
377
+ print("-------------------------------------------------")
378
+
379
+ print("")
380
+
381
+ print("< 実行結果 >")
382
+
383
+ print("")
384
+
385
+
386
+
387
+ ws_2 = wb.create_sheet()
388
+
389
+
390
+
391
+ for tf_clb_elem in tf_clb:
392
+
393
+ ws_2.append(tf_clb_elem)
394
+
395
+
396
+
397
+ wb.save(file_name)
398
+
399
+
400
+
401
+ print_ws_data(ws_2)
402
+
403
+
404
+
405
+ ```

1

微修正

2021/01/09 19:47

投稿

退会済みユーザー
test CHANGED
@@ -1,6 +1,8 @@
1
1
  以下の質問の続きですね。
2
2
 
3
3
  [[openpyxl] Excelシート内で任意の文字と完全一致するセルが存在する列を格納したい | teratail](https://teratail.com/questions/314754)
4
+
5
+ ___
4
6
 
5
7
 
6
8
 
@@ -44,7 +46,7 @@
44
46
 
45
47
  しかし上のコードの5,7,9行目では1行のデータが格納された変数を事前に作成したリストに`append()`を使ってリストに追加してしまっています。
46
48
 
47
- そのため行のデータがまるまる一つの要素に入ってしまい、そのまま一つのセルに書き込まれています。
49
+ そのため行のデータがまとめて一つの要素に入ってしまい、そのまま一つのセルに書き込まれています。
48
50
 
49
51
 
50
52
 
@@ -118,7 +120,7 @@
118
120
 
119
121
 
120
122
 
121
-
123
+ ___
122
124
 
123
125
  > 内容の理解不足もあり、どこが間違っていてこの出力結果になるのか分からないため質問させていただきます。
124
126