BLOGサブスレッドの日常

2023.05.27

Apache Tikaを使った2つのExcelの内容を差分表示する方法

s.kono

むおおおお!

経緯とか

私は普段プログラムを書くなどの開発作業を行っていますが、テストの作成や実施といった作業をすることもあります。
以前、「システムから出力された2つのExcelファイルの違いがないことを確認する」必要性が出てきました。

最初、「全く同じファイルであれば、それぞれのExcelファイルからSHA-1ハッシュを取り出して突合すればよいのでは?」と思っていたのですが、Excelファイルはシート内のデータが全く同じでも異なるSHA-1ハッシュになることがあることがわかりました。(おそらく時刻といったメタデータの違いがあるものと思います。)

~/Downloads❯ shasum before.xlsx
b24f9856a24e73ccef34fbac16ca91ad5b316232  before.xlsx
~/Downloads❯ shasum after.xlsx
0db61e6cca37b3324f54b1f7cb85865662ef85da  after.xlsx

ExcelでExcelファイル開いて保存し直すだけでもSHA-1ハッシュが変わりますし、
これでは本当に確認したいことである「シート内の内容に差分があるか」を検証することができません。

確認したいこと(要件)

  • 2つのExcelの内容に差分があるかどうかを確認したい
  • 確認したいのは2つのExcelのうち、入力されているデータ部分である
    • 背景色や文字の大きさといったスタイルの違いを比較する必要はない
  • できるだけ目視での確認はしたくない
    • 見間違いが発生する可能性があるため

この要件を考えた時、そういえば以前# git diff で Office ファイルの差分を見るという記事で、Apache Tikaを使えばExcel内のデータをテキストで出力できることを思い出しました。
これが使えるのでは!?

結論

以下の手順を実行することで比較ができました。

  • https://tika.apache.org/download.html からApache Tikaをダウンロードする
    • Mirrors for tika-app-2.8.0.jar (runnable jar, PGP signature, SHA512) を選択して、tika-app-2.8.0.jarをダウンロード
    • 仮にホームディレクトリにダウンロードしたものとします
  • 比較したい2つのExcelファイルを、ダウンロードした tika-app-2.8.0.jar と同じ場所に置きます
    • それぞれのファイル名を before.xlsxafter.xlsxとします
  • ターミナルを立ち上げて、以下のコマンドを実行します。
diff <(java -jar ./tika-app-2.8.0.jar -t ./before.xlsx) <(java -jar ./tika-app-2.8.0.jar -t ./after.xlsx)

確認結果

確認のため、以下の様なExcelファイルを作成しました(before.xlsx)。

ファイルをコピーして少し内容を変更したものを作成します(after.xlsx)。

コマンドを実行してみると…

いい感じですね!

この記事を書いた人

s.kono