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

回答編集履歴

4

追加

2021/05/21 08:11

投稿

退会済みユーザー
answer CHANGED
@@ -90,4 +90,44 @@
90
90
  ```
91
91
 
92
92
  大変参考にさせていただいた情報:
93
- https://stackoverflow.com/questions/36122496/password-protecting-excel-file-using-python
93
+ https://stackoverflow.com/questions/36122496/password-protecting-excel-file-using-python
94
+
95
+
96
+ -----
97
+
98
+ # 別のやり方
99
+ 下記のようにwin32com.clientを使うとだいぶシンプルになります。
100
+ (ただ、簡単なデータ編集程度であればopenpyxl無しでデータ操作できますが、
101
+ もっと込み入ったことをopenpyxlでやろうとした場合、「パスワード解除して開いたデータをそのままopenpyxlに渡して加工する」ということはできないようです。
102
+ ・win32com.clientでパスワードを解除して開く
103
+ ・一時的に別ファイル名でパスワード無しで保存
104
+ ・一時ファイルをopenpyxlで開きなおして、openpyxlを使ってデータ操作して保存。
105
+ ・一時ファイルをもう一度
106
+ win32com.clientで開いて、パスワードつきで正式なファイル名で保存、
107
+ という流れにならざるを得ないかと。)
108
+ ```
109
+ # 事前に pip install pywin32 が必要
110
+ import win32com.client
111
+
112
+ def sub():
113
+ # フルパス必須
114
+ xlpath = r"C:\Docs\test.xlsx"
115
+ password = 'abcd'
116
+ XL_OPENXML_WORKBOOK = 51
117
+ xlApp = win32com.client.Dispatch("Excel.Application")
118
+ # 確認ダイアログ抑止
119
+ xlApp.DisplayAlerts = False
120
+ # パスワードを解除して開く (なお、読み取りパスワードが設定されていなくてもエラーにならない模様)
121
+ wb = xlApp.Workbooks.Open(xlpath, False, False, None, password)
122
+ # データ編集
123
+ sheet = wb.Worksheets(1)
124
+ sheet.Activate()
125
+ sheet.Range("A4").Value = "1"
126
+
127
+ # パスワード付きで保存する。
128
+ wb.SaveAs(xlpath, FileFormat=XL_OPENXML_WORKBOOK, Password=password)
129
+ wb.Close()
130
+ xlApp.DisplayAlerts = True
131
+
132
+
133
+ ```

3

2021/05/21 08:11

投稿

退会済みユーザー
answer CHANGED
@@ -89,5 +89,5 @@
89
89
  print("終了しました。")
90
90
  ```
91
91
 
92
- 長時間かけて調べた結果たどりついた、大変参考にさせていただいた情報:
92
+ 大変参考にさせていただいた情報:
93
93
  https://stackoverflow.com/questions/36122496/password-protecting-excel-file-using-python

2

2021/05/21 05:19

投稿

退会済みユーザー
answer CHANGED
@@ -79,6 +79,7 @@
79
79
 
80
80
  sheet = book.active
81
81
  sheet["B2"].value = 2
82
+ # いったんパス無しで保存。
82
83
  book.save("test.xlsx")
83
84
  # パスワード付きで保存する。 フルパス指定しないとエラー。
84
85
  set_password(r"C:\Docs\test.xlsx", "abcd")

1

2021/05/21 05:18

投稿

退会済みユーザー
answer CHANGED
@@ -12,7 +12,7 @@
12
12
  ・msoffcrypto-toolは読み取りパスワードの解除だけに使用
13
13
  ・パスワードが解除されたファイルは一時ファイルで保存
14
14
  ・読み取りパスワードが設定されていないときは例外処理でトラップしそのまま開く
15
- ・**パスワード付き保存はVBScriptで脳筋で保存**
15
+ ・**パスワード付きエクセルとしてVBScriptで脳筋で保存**
16
16
 
17
17
  という戦略を提案します。
18
18
 
@@ -61,9 +61,9 @@
61
61
  try:
62
62
  with open("test.xlsx","rb") as fin:
63
63
  msfile = msoffcrypto.OfficeFile(fin)
64
- # パスワードを指定
64
+ # パスワードを指定
65
65
  msfile.load_key(password="abcd")
66
- # 復号ファイルを一時保存
66
+ # 復号ファイルを一時ファイル名で保存
67
67
  with open("__temp.xlsx","wb") as f:
68
68
  msfile.decrypt(f)
69
69
  # 一時ファイルを開く