PHPExcelのバージョン 1.8.1。
現象
PHPExcelでxlsmを読み込んでそれに修正を加えて保存したファイルを保存した場合、そのファイルをExcelで開こうとすると破損ファイルだと言われて開けない。
この現象は2018年1月頃のバージョンのExcelでは発生していなかったが、その後のExcelアップデートで発生するようになった。
原因
PHPExcelでxlsmを読み込んで保存すると、デジタル署名がされていないマクロが入ったファイルを読んだ場合でも、必ずVBAマクロ署名用のファイル「xl/vbaProjectSignature.bin」が作成されてしまっている。
(作成されたxlsmをzipファイルとして解凍すると、このファイルが作成されているのが確認できる)
以前は、デジタル署名がされていないマクロから作成した vbaProjectSignature.bin が存在していても問題なかったが、現在はそれがあると破損したファイルとして扱われてしまう。
対策パターン1
以下のように、ファイルを読み込んだ直後にデジタル署名を強制的に無効化する。
当然だが、この対策を行うと本当にデジタル署名が存在する場合でもそれが無効化されてしまうので注意。
$book = PHPExcel_IOFactory::load($readFile); $book->setMacrosCertificate(null); // ●この行を追加
対策パターン2
上では問題がある場合、PHPExcelで読み込むxlsmファイルのマクロにデジタル署名をつける。
(VBAウインドウのメニューから、ツール→デジタル署名で追加)