読者です 読者をやめる 読者になる 読者になる

POIを使ってExcelの不要な名前定義を削除する

Java POI

以前vbaを使った参照できなくなった名前定義の削除を作ったが、
お粗末なものだったのと、JavaExcelを操作する練習も兼ねて
Apache POIを利用したものを作成してみた。

JavaのライブラリでExcelを扱うものはJExcelApiApache POIがある。

今回はApache POIを使って作成した。
# というか最初はJExcelApiで作っていたのだが不要な(参照できない)名前定義を読み込めないようなので断念した。

実装した仕様としては下記。
・エクセルの名前定義を読込み、参照できないもの(#REF)を削除して、ファイルを保存する。
・名前定義を削除しない場合はファイルの保存を行わない。
・ディレクトリ指定をすると、xls拡張子のファイルを探し出し、処理を行う。(サブディレクトリを含む)
・削除した名前定義を標準出力してログとする。


で、結局簡単にできた。
vbaで作成した時と違うのはどうもPOIでは別ファイルへの参照はnullになってしまうようだ。
# vbaで"Document ant Setting"のパスを意識して削除していたが、そこがnull。
# なので特に名前定義の参照先を意識せずに"参照できなかったら削除"というロジックになっている。


まぁ使いたいだけの人には不要な説明はソースを配布することで置いておいて、
実行の仕方について説明する。

1. 名前定義削除JarファイルをDL。ここからDLできます。
2. Apache POIをDL。最新は3.8だが、3.7を使用。
3. ファイル操作で使用するApache Commons IOライブラリ。ver.2.0.1。
# また、このプログラムは現時点で最新のJava7で作成されているため、JREのVersionUpも必要かもしれない。


上記3つのJarファイルをクラスパスに入れて
excel.poi.ExcelRmRefNamesPoiを実行する。
その際に引数として、処理させたいディレクトリパスを指定する。
# 注意点:Windowsの場合はパス区切り文字を円マーク"\"ではなく、スラッシュ"/"へ変換してください。

java -cp "ExcelRmRefNames.jar;poi-3.7-20101029.jar;commons-io-2.0.1.jar" excel.poi.ExcelRmRefNamesPoi [TargetDir]

また、読み込み専用ファイルやPOIで読み込めないファイルであった場合は失敗し、エラーログを吐いたのち、そのまま次のファイルを続けて処理する。
使用にあるとおりサブディレクトリも全て走査し.xlsファイルを処理する。
注意:必ずバックアップを取った後に実行することをお勧めします。

ライセンスは、GPLとします。
# ライセンスについて触れたのは初めてのことなのでなにか不備があるかもしれません。
# コメントで指摘してもらえると助かります。