回答編集履歴

4

追加

2021/05/21 08:11

投稿

退会済みユーザー
test CHANGED
@@ -183,3 +183,83 @@
183
183
  大変参考にさせていただいた情報:
184
184
 
185
185
  https://stackoverflow.com/questions/36122496/password-protecting-excel-file-using-python
186
+
187
+
188
+
189
+
190
+
191
+ -----
192
+
193
+
194
+
195
+ # 別のやり方
196
+
197
+ 下記のようにwin32com.clientを使うとだいぶシンプルになります。
198
+
199
+ (ただ、簡単なデータ編集程度であればopenpyxl無しでデータ操作できますが、
200
+
201
+ もっと込み入ったことをopenpyxlでやろうとした場合、「パスワード解除して開いたデータをそのままopenpyxlに渡して加工する」ということはできないようです。
202
+
203
+ ・win32com.clientでパスワードを解除して開く
204
+
205
+ ・一時的に別ファイル名でパスワード無しで保存
206
+
207
+ ・一時ファイルをopenpyxlで開きなおして、openpyxlを使ってデータ操作して保存。
208
+
209
+ ・一時ファイルをもう一度
210
+
211
+ win32com.clientで開いて、パスワードつきで正式なファイル名で保存、
212
+
213
+ という流れにならざるを得ないかと。)
214
+
215
+ ```
216
+
217
+ # 事前に pip install pywin32 が必要
218
+
219
+ import win32com.client
220
+
221
+
222
+
223
+ def sub():
224
+
225
+ # フルパス必須
226
+
227
+ xlpath = r"C:\Docs\test.xlsx"
228
+
229
+ password = 'abcd'
230
+
231
+ XL_OPENXML_WORKBOOK = 51
232
+
233
+ xlApp = win32com.client.Dispatch("Excel.Application")
234
+
235
+ # 確認ダイアログ抑止
236
+
237
+ xlApp.DisplayAlerts = False
238
+
239
+ # パスワードを解除して開く (なお、読み取りパスワードが設定されていなくてもエラーにならない模様)
240
+
241
+ wb = xlApp.Workbooks.Open(xlpath, False, False, None, password)
242
+
243
+ # データ編集
244
+
245
+ sheet = wb.Worksheets(1)
246
+
247
+ sheet.Activate()
248
+
249
+ sheet.Range("A4").Value = "1"
250
+
251
+
252
+
253
+ # パスワード付きで保存する。
254
+
255
+ wb.SaveAs(xlpath, FileFormat=XL_OPENXML_WORKBOOK, Password=password)
256
+
257
+ wb.Close()
258
+
259
+ xlApp.DisplayAlerts = True
260
+
261
+
262
+
263
+
264
+
265
+ ```

3

2021/05/21 08:11

投稿

退会済みユーザー
test CHANGED
@@ -180,6 +180,6 @@
180
180
 
181
181
 
182
182
 
183
- 長時間かけて調べた結果たどりついた、大変参考にさせていただいた情報:
183
+ 大変参考にさせていただいた情報:
184
184
 
185
185
  https://stackoverflow.com/questions/36122496/password-protecting-excel-file-using-python

2

2021/05/21 05:19

投稿

退会済みユーザー
test CHANGED
@@ -160,6 +160,8 @@
160
160
 
161
161
  sheet["B2"].value = 2
162
162
 
163
+ # いったんパス無しで保存。
164
+
163
165
  book.save("test.xlsx")
164
166
 
165
167
  # パスワード付きで保存する。 フルパス指定しないとエラー。

1

2021/05/21 05:18

投稿

退会済みユーザー
test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  ・読み取りパスワードが設定されていないときは例外処理でトラップしそのまま開く
28
28
 
29
- ・**パスワード付き保存はVBScriptで脳筋で保存**
29
+ ・**パスワード付きエクセルとしてVBScriptで脳筋で保存**
30
30
 
31
31
 
32
32
 
@@ -124,11 +124,11 @@
124
124
 
125
125
  msfile = msoffcrypto.OfficeFile(fin)
126
126
 
127
- # パスワードを指定
127
+ # パスワードを指定
128
128
 
129
129
  msfile.load_key(password="abcd")
130
130
 
131
- # 復号ファイルを一時保存
131
+ # 復号ファイルを一時ファイル名で保存
132
132
 
133
133
  with open("__temp.xlsx","wb") as f:
134
134