回答編集履歴

3

依頼により編集

2022/06/22 01:55

投稿

TakaiY
TakaiY

スコア12666

test CHANGED
@@ -36,14 +36,14 @@
36
36
  ```python
37
37
  for mail_file_path in glob.glob('./mail/*'):
38
38
  # ブックを取得
39
- book = openpyxl.load_workbook(r'C:\Users\mediamagic\Desktop\SES\SES.xlsx')
39
+ book = openpyxl.load_workbook(r'C:\Users\')
40
40
  # シートを取得
41
41
  sheet = book['Sheet1']
42
42
  # セルへ書き込む
43
43
  sheet['A1'] = 'ナンバー'
44
44
  sheet['B1'] = 100
45
45
  # 保存する
46
- book.save(r'C:\Users\mediamagic\Desktop\SES\SES.xlsx')
46
+ book.save(r'C:\Users\')
47
47
  result = MailParser(mail_file_path).get_attr_data()
48
48
  print(result)
49
49
  ```
@@ -51,7 +51,7 @@
51
51
  まずは、Excelの処理をループの外に出します。
52
52
  ```python
53
53
  # ブックを取得
54
- book = openpyxl.load_workbook(r'C:\Users\mediamagic\Desktop\SES\SES.xlsx')
54
+ book = openpyxl.load_workbook(r'C:\Users\')
55
55
  # シートを取得
56
56
  sheet = book['Sheet1']
57
57
 
@@ -63,7 +63,7 @@
63
63
  print(result)
64
64
 
65
65
  # 保存する
66
- book.save(r'C:\Users\mediamagic\Desktop\SES\SES.xlsx')
66
+ book.save(r'C:\Users\')
67
67
  ```
68
68
 
69
69
  ループの中では sheet 変数が見えますが、これはエクセルのSheet1を保持しています。
@@ -80,7 +80,7 @@
80
80
 
81
81
  ```python
82
82
  # ブックを取得
83
- book = openpyxl.load_workbook(r'C:\Users\mediamagic\Desktop\SES\SES.xlsx')
83
+ book = openpyxl.load_workbook(r'C:\Users\')
84
84
  # シートを取得
85
85
  sheet = book['Sheet1']
86
86
 
@@ -92,14 +92,14 @@
92
92
  sheet.cell(raw=i, col=2).value = <メアド>
93
93
  sheet.cell(raw=i, col=2).value = <内容>
94
94
 
95
- book.save(r'C:\Users\mediamagic\Desktop\SES\SES.xlsx')
95
+ book.save(r'C:\Users\')
96
96
  ```
97
97
 
98
98
  これで書き込めるのですが、このままだと「i」 が無い状態です。 iは行番号で、行はメールファイルごとに1つですから、ループが回るごとに1つ増やします。
99
99
 
100
100
  ```python
101
101
  # ブックを取得
102
- book = openpyxl.load_workbook(r'C:\Users\mediamagic\Desktop\SES\SES.xlsx')
102
+ book = openpyxl.load_workbook(r'C:\Users\')
103
103
  # シートを取得
104
104
  sheet = book['Sheet1']
105
105
 
@@ -112,7 +112,7 @@
112
112
  sheet.cell(raw=i, col=2).value = <メアド>
113
113
  sheet.cell(raw=i, col=2).value = <内容>
114
114
  i += 1
115
- book.save(r'C:\Users\mediamagic\Desktop\SES\SES.xlsx')
115
+ book.save(r'C:\Users\')
116
116
  ```
117
117
  これで、ループが回るごとに違う行にデータを書き込むことができます。
118
118
 
@@ -121,7 +121,7 @@
121
121
 
122
122
  ```python
123
123
  # ブックを取得
124
- book = openpyxl.load_workbook(r'C:\Users\mediamagic\Desktop\SES\SES.xlsx')
124
+ book = openpyxl.load_workbook(r'C:\Users\')
125
125
  # シートを取得
126
126
  sheet = book['Sheet1']
127
127
 
@@ -134,7 +134,7 @@
134
134
  sheet.cell(raw=i, col=2).value = <メアド>
135
135
  sheet.cell(raw=i, col=2).value = result.body
136
136
  i += 1
137
- book.save(r'C:\Users\mediamagic\Desktop\SES\SES.xlsx')
137
+ book.save(r'C:\Users\')
138
138
  ```
139
139
 
140
140
  ちなみに、

2

さらに追記

2022/06/21 14:08

投稿

TakaiY
TakaiY

スコア12666

test CHANGED
@@ -32,6 +32,7 @@
32
32
  > こんな感じですかね?!?!
33
33
  まだまだですね。
34
34
 
35
+ 最初のコードからいきましょう。
35
36
  ```python
36
37
  for mail_file_path in glob.glob('./mail/*'):
37
38
  # ブックを取得
@@ -47,7 +48,6 @@
47
48
  print(result)
48
49
  ```
49
50
 
50
- ここからいきましょう。
51
51
  まずは、Excelの処理をループの外に出します。
52
52
  ```python
53
53
  # ブックを取得
@@ -59,14 +59,94 @@
59
59
  # セルへ書き込む
60
60
  sheet['A1'] = 'ナンバー'
61
61
  sheet['B1'] = 100
62
- # 保存する
63
62
  result = MailParser(mail_file_path).get_attr_data()
64
63
  print(result)
64
+
65
+ # 保存する
66
+ book.save(r'C:\Users\mediamagic\Desktop\SES\SES.xlsx')
67
+ ```
68
+
69
+ ループの中では sheet 変数が見えますが、これはエクセルのSheet1を保持しています。
70
+ このシートの列にメールファイルごとに情報を書き込むわけですから、基本的な処理はこれでだいたいできているのです。
71
+ あとは、どこからどこへデータを移すかということだす。
72
+ ```python
73
+ sheet.cell(raw=i, col=0).value = <日付>
74
+ sheet.cell(raw=i, col=1).value = <名前>
75
+ sheet.cell(raw=i, col=2).value = <メアド>
76
+ sheet.cell(raw=i, col=2).value = <内容>
77
+ ```
78
+
79
+ 日付などを取得するには、前に書いたように resultが必要だから、まずはresult取得して、この処理ですね。
80
+
81
+ ```python
82
+ # ブックを取得
83
+ book = openpyxl.load_workbook(r'C:\Users\mediamagic\Desktop\SES\SES.xlsx')
84
+ # シートを取得
85
+ sheet = book['Sheet1']
86
+
87
+ for mail_file_path in glob.glob('./mail/*'):
88
+ result = MailParser(mail_file_path).get_attr_data()
89
+ # セルへ書き込む
90
+ sheet.cell(raw=i, col=0).value = <日付>
91
+ sheet.cell(raw=i, col=1).value = <名前>
92
+ sheet.cell(raw=i, col=2).value = <メアド>
93
+ sheet.cell(raw=i, col=2).value = <内容>
65
94
 
66
95
  book.save(r'C:\Users\mediamagic\Desktop\SES\SES.xlsx')
67
96
  ```
68
97
 
69
- このとき、sheet 変数エクセのSheet1を保持ています。
98
+ れで書き込めるですが、このままだ「i」 が無い状態です。 i行番号で、行はメーファイルごとに1つですから、ループが回るごとに1つ増やします。
70
- このシートのi列に情報を書き込むのはこういう処理ですよね
99
+
71
100
  ```python
101
+ # ブックを取得
102
+ book = openpyxl.load_workbook(r'C:\Users\mediamagic\Desktop\SES\SES.xlsx')
103
+ # シートを取得
104
+ sheet = book['Sheet1']
105
+
106
+ i = 0
107
+ for mail_file_path in glob.glob('./mail/*'):
108
+ result = MailParser(mail_file_path).get_attr_data()
109
+ # セルへ書き込む
72
- sheet.cell(raw=i, col=0) = <
110
+ sheet.cell(raw=i, col=0).value = <日付>
111
+ sheet.cell(raw=i, col=1).value = <名前>
112
+ sheet.cell(raw=i, col=2).value = <メアド>
113
+ sheet.cell(raw=i, col=2).value = <内容>
114
+ i += 1
115
+ book.save(r'C:\Users\mediamagic\Desktop\SES\SES.xlsx')
116
+ ```
117
+ これで、ループが回るごとに違う行にデータを書き込むことができます。
118
+
119
+ あとは、 <日付> などですね。 <日付> は result.date に入ってますよね。 本文は、 body です。
120
+ 名前とメアドは from_address にまとめて入っているので自分で分解して入れてみてください。
121
+
122
+ ```python
123
+ # ブックを取得
124
+ book = openpyxl.load_workbook(r'C:\Users\mediamagic\Desktop\SES\SES.xlsx')
125
+ # シートを取得
126
+ sheet = book['Sheet1']
127
+
128
+ i = 0
129
+ for mail_file_path in glob.glob('./mail/*'):
130
+ result = MailParser(mail_file_path).get_attr_data()
131
+ # セルへ書き込む
132
+ sheet.cell(raw=i, col=0).value = result.date
133
+ sheet.cell(raw=i, col=1).value = <名前>
134
+ sheet.cell(raw=i, col=2).value = <メアド>
135
+ sheet.cell(raw=i, col=2).value = result.body
136
+ i += 1
137
+ book.save(r'C:\Users\mediamagic\Desktop\SES\SES.xlsx')
138
+ ```
139
+
140
+ ちなみに、
141
+ 質問に出ていたコードは
142
+ ``python
143
+ i = 1
144
+ for row in ws.iter_rows():
145
+ for cell in row:
146
+ sheet.cell(row=i, column=1).value = "日付"
147
+ i = i + 1
148
+ ```
149
+ これでrowがぐるぐる回って、カラムもぐるぐる回っていますが、これにあわせて、メールを 読んだり、そのなかのデータを適切に取得したりしなければなりません。
150
+ もともと、複数あるファイルをループ回していて、1ファイル1行なのだから、エクセルの行やカラムで回す必要はないのです。
151
+
152
+

1

追記

2022/06/21 13:48

投稿

TakaiY
TakaiY

スコア12666

test CHANGED
@@ -26,6 +26,47 @@
26
26
 
27
27
  とりあえず、アドバイスしてみました。
28
28
 
29
+ ---
30
+ 追記
29
31
 
32
+ > こんな感じですかね?!?!
33
+ まだまだですね。
30
34
 
35
+ ```python
36
+ for mail_file_path in glob.glob('./mail/*'):
37
+ # ブックを取得
38
+ book = openpyxl.load_workbook(r'C:\Users\mediamagic\Desktop\SES\SES.xlsx')
39
+ # シートを取得
40
+ sheet = book['Sheet1']
41
+ # セルへ書き込む
42
+ sheet['A1'] = 'ナンバー'
43
+ sheet['B1'] = 100
44
+ # 保存する
45
+ book.save(r'C:\Users\mediamagic\Desktop\SES\SES.xlsx')
46
+ result = MailParser(mail_file_path).get_attr_data()
47
+ print(result)
48
+ ```
31
49
 
50
+ ここからいきましょう。
51
+ まずは、Excelの処理をループの外に出します。
52
+ ```python
53
+ # ブックを取得
54
+ book = openpyxl.load_workbook(r'C:\Users\mediamagic\Desktop\SES\SES.xlsx')
55
+ # シートを取得
56
+ sheet = book['Sheet1']
57
+
58
+ for mail_file_path in glob.glob('./mail/*'):
59
+ # セルへ書き込む
60
+ sheet['A1'] = 'ナンバー'
61
+ sheet['B1'] = 100
62
+ # 保存する
63
+ result = MailParser(mail_file_path).get_attr_data()
64
+ print(result)
65
+
66
+ book.save(r'C:\Users\mediamagic\Desktop\SES\SES.xlsx')
67
+ ```
68
+
69
+ このとき、sheet 変数はエクセルのSheet1を保持しています。
70
+ このシートのi列に情報を書き込むのはこういう処理ですよね
71
+ ```python
72
+ sheet.cell(raw=i, col=0) = <