今回はエクセルファイル内にある画像を抜き出してみます。前回、ZIPファイルについて扱いました。エクセルファイルは古い形式も含めていくつかありますが、ここでは拡張子が.xlsxのものを扱うことにします。
今回もこれまでのようにサンプルで利用するファイル・ディレクトリはデスクトップのsampleディレクトリとしています。デスクトップにsampleディレクトリがない場合は作成しておいてください。(コマンド入力ならmkdir ~/Desktop/sampleとして作成することができます)
また、カレントディレクトリも上記の場所になります。cd ~/Desktop/sampleのようにコマンドを入力してカレントディレクトリを変更しておけばよいでしょう。
なお、WindowsではWSL2で実行してください。
xlsxはzipファイル
初期のエクセルはMacintosh用で保存されるファイル形式もバイナリファイルで拡張子は.xlsでした。(Macintosh SEでハードディスクがないと何度もシステムディスクとエクセルのフロッピーディスクを出し入れしないといけませんでした)
その後エクセルはWindowsに移植されました。その後エクセルは表計算ソフトのデファクトスタンダードとなり汎用的なデータフォーマットとしてのxlsx形式になりました。
xlsx形式がどのようになっているかは以下のURLで公開されておりドキュメント等で確認することができます。
ECMA-376
https://ecma-international.org/publications-and-standards/standards/ecma-376/
Open XML SDK for Office へようこそ
https://learn.microsoft.com/ja-jp/office/open-xml/open-xml-sdk
スプレッドシート
https://learn.microsoft.com/ja-jp/office/open-xml/spreadsheet/overview
xlsx形式はXMLデータや画像データなどを特定のディレクトリに入れてZIP圧縮した形式です。つまりZIP解凍すればエクセルデータで使われている画像を取り出すことができます。ここでは以下の内容のエクセルファイルの画像を取り出してみます。シートは2つあり、それぞれに画像が貼り付けてあります。
それでは、手軽な方法でxlsx形式をZIP解凍して画像を取り出してみましょう。今ではMac/WindowsともZIP圧縮/解凍する機能が標準で用意されています。Linux/FreeBSDなど他の環境ではzip/unzipが標準で入ってないことがあります。その場合は別途インストールしてください。
Windowsで簡単にxlsx形式を解凍するにはファイル名の拡張子を.zipに変更します。(このWindowsにはエクセルは入っていませんので白紙アイコンになっています。ちなみにエクセルがインストールされていなくても画像データなどは取り出すことができます)
拡張子が.zipになったらZIPファイルとして認識されるので解凍します。
解凍すると以下のようなディレクトリ構成になります。
macOSの場合は拡張子を.zipにしても正しく解凍できない場合があります。
そのような場合はターミナルで以下のようにコマンドを入力します。なお、カレントディレクトリになっている~/Desktop/sample/にエクセルファイルがあるものとします。コマンドを実行するとsaple.xlsxファイルが解凍され図のようなディレクトリが生成されます。
unzip sample.xlsx
画像ファイルだけ抜き出す
それでは画像ファイルだけ抜き出してみます。
解凍されたエクセルファイルの内容をすべてリストすると以下の図のような構成になります。
画像ファイルはxlディレクトリ内にあるmediaディレクトリ内に入っています。
場所が確認できれば後はExplorerやFinderで一般的なファイルと同じようにコピーすることができます。
この連載はコマンドを使うということで、JPEGファイルだけをデスクトップのsampleフォルダにコピーしてみます。
コピーするにはcpコマンドを使います。*.jpegまたは.jpgのようにワイルドカードを使えばJPEGファイルだけをコピーすることができます。今回の場合は拡張子が.jpegなので以下のようにコマンドを入力します。
cp xl/media/*.jpeg ./
解凍せずに中身を確認する
次に解凍せずに中身を確認してみましょう。ZIP圧縮されたファイルはunzipコマンドでlオプションを指定すると解凍せず中身のファイルパスだけ表示してくれます。
unzip -l sample.xlsx
ここでJPEGファイルがあるか確認する場合はパイプとgrepを組み合わせます
unzip -l sample.xlsx | grep ".jpeg"
PNG画像の場合は以下のように指定します。
unzip -l sample.xlsx | grep ".png"
ちなみにファイルがたくさんあるかもしれない場合は以下のようにwcコマンドを使って何個あるか調べる方が良いでしょう。
unzip -l sample.xlsx | grep ".jpeg" | wc -l
画像の差し替え
画像を取り出すことができるなら画像を差し替えることもできるのではないか、と考える人もいるでしょう。同じファイル名で画像を差し替えてから再度ZIP圧縮して、拡張子を.xlsxに変更してみましょう。
今回のsample.xlsxのシート2には画面キャプチャーした画像が貼り付けてありますので、これを以下のターミナル画面をキャプチャーした画像に差し替えてみます。
差し替え画像はimage3.pngというファイル名でxl/mediaディレクトリ内にあります。この画像を削除して差し替えます。
次にファイル/ディレクトリを選択してZIP圧縮します。
ファイル名を変更します。拡張子は.xlsxにします。ここではsample2.xlsxとしています。
それでは実際に開いてみましょう。すると、図のようなダイアログが表示されます。単純差し替えでは問題があるようです。が、ここは「はい」をクリックして修復することにします。
さらにダイアログが表示されます。ここは「表示」を選択します。
するとエクセルファイルが開かれ画面が表示されます。シート2を表示すると、画像が差し代わっているのが確認できます。
このようなダイアログを表示させないようにするには・・・こういう場合はAIに聞いた方が早い時代ですので素直に聞いてみましょう。すると以下のような回答が来ました。
差し替え画像が1つ2つなら良さそうですが、数が多くなると大変そうです。素直にエクセルに修復してもらうのが簡単でしょう。 それでは、また。
著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。




































