通常のxlsxのファイルは拡張子をzipにし、展開するとファイルの中身が確認できます
それに対し、読み取りパスワードを設定すると、ファイル全体が暗号化されるため、同様のことはできません。
暗号化されているためzip構造になっていないということですね。
GPTの予想では、ファイル全体の暗号化/複合化の対応まで対処するのが大変なので、これらのライブラリでは読み取りパスワードの解除機能はないのではないかとのこと。
書き込みパスワードの場合はどうかというと、書き込みパスワードであれば閲覧できないわけではないので、
zip化して開いて中身をみることができます
xl/workbook.xml を開くと以下のように埋め込まれていて
<fileSharing userName="ユーザー名" algorithmName="SHA-512" hashValue="/Sjoy10H3uY10Lh1Ew7UkIlk8b6ZAVNvvpd6LUsgoFJFYrkn7QJ2e2nAgguO1gdRRWwK9NrGpaduJG5y6nZsLA==" saltValue="3GWq9TRXLA7h35x78qzkHQ==" spinCount="100000"/>
ざっくりとした解釈では、入力された書き込みパスワードにsaltをつけてハッシュ化し、
もとまった値に対してもsaltをつけてハッシュ化することを100000をくりかえした結果をhasValueに設定している
詳細の仕様については、 以下に仕様ありとのこと
MS-OFFCRYPTO
https://learn.microsoft.com/en-us/openspecs/office_file_formats/ms-offcrypto/3c34d72a-1a61-4b52-a893-196f9157f083
生成AIにいろいろ確認した内容のまとめ
ライブラリ | 読み取りパスワード解除 | 書き込みパスワード解除 | 書き込みパスワード設定 | シートの保護設定 | シート保護解除して書き込み |
---|---|---|---|---|---|
ClosedXML | ×非対応 | ×非対応 | ×非対応 | 〇対応 | 〇対応 |
EPPlus | ×非対応 | ×非対応 | 〇対応 | 〇対応 | 〇対応 |
ExcelDataReader | ×非対応 | ×非対応 | ×非対応 | ×非対応 | ×非対応 |
NPOI | ×非対応 | ×非対応 | ×非対応 | 〇対応 | 〇対応 |
EPPlusにおいては、書き込みパスワードの設定が可能であり、
シートの保護関係については、ExcelDataReader以外は対応している様子です
極論をいえば、XMLファイルを操作するだけなので、ファイル全体が暗号化されていなければ、ただの文字列が書き込まれているだけなので
ライブラリ側で無視してしまえば、書き込みパスワードもシートの保護もなかったことになってしまうという話ですが・・・
実際は、シートの保護は対応しても、書き込みパスワードについては対応していないのが現状のようです。。
生成AIの予想では倫理的なものではという話ですが、ちょっと謎です