趣味で計算流砂水理

趣味で計算流砂水理 Computational Sediment Hydraulics for Fun Learning

数値計算とか河川工学とかプログラミングのことを書いています

MENU

Excelのパスワード付きシートの保護、ブックの保護をpythonで一気解除する

スポンサーリンク

以前の記事備忘録: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)

参考サイト