以前の記事備忘録:Excelのパスワードによるシートの保護やブックの保護をさくっと解除する - 趣味で計算流砂水理の処理をpythonで行なう話です。
Excelのシート、ブックの保護にパスワードをつけるのは意味がわからないですが化石みたいな組織ではよくある話なので、pythonで一括処理しましょう。
当然ですが、xlsx、xlsm形式のみです。
ざっくりとした処理の流れは、解凍⇒xml編集⇒圧縮です。 シートの保護は、\xl\worksheets\sheet*.xmlでシートごとにファイルが存在するのでそれぞれで処理が必要です。 ブックの保護は、\xl\workbook.xmlの1ファイルのみの処理です。 xmlのタグ検索の部分がバージョン依存がありそうです。
まあ、かなり簡単なプログラムです。
import shutil from lxml import etree import glob tmpfoldername = 'tmpunzipexcel' exclefilename = '*********' shutil.unpack_archive(exclefilename, extract_dir=tmpfoldername, format= "zip") f = tmpfoldername + r'\xl\workbook.xml' tree = etree.parse(f) v = tree.find('{http://schemas.openxmlformats.org/spreadsheetml/2006/main}workbookProtection') if not v == None: v.getparent().remove(v) tree.write( f, pretty_print = False, xml_declaration = True, standalone= True, encoding = "utf-8" ) fs = glob.glob(tmpfoldername + r'\xl\worksheets\sheet*.xml') for f in fs: tree = etree.parse(f) v = tree.find('{http://schemas.openxmlformats.org/spreadsheetml/2006/main}sheetProtection') if not v == None: v.getparent().remove(v) tree.write( f, pretty_print = False, xml_declaration = True, standalone= True, encoding = "utf-8" ) shutil.make_archive(exclefilename, 'zip', root_dir=tmpfoldername) shutil.move(exclefilename + '.zip', exclefilename[:-5] + 'unlock' + exclefilename[-5:]) shutil.rmtree(tmpfoldername)