2016-07-14 29 views
0

Apache POIからxlsファイルを生成するJavaクラスを開発中です。このクラスをいくつか実行して、生成されたファイルを1日に数回開く必要があります。ファイルがまだExcelで開いているときにプログラムを実行すると、プログラムはエラーを発生させませんが、ファイルは更新されません(閉じて再度開き、それは同じです)。不思議なことに、私はthis questionで報告されたような例外はありません。xlsファイルをExcelで開いている間にApache POIで更新する

開いているExcelファイルを強制的に更新する方法はありますか?それ以外の場合は、ファイルを書き込む前にシステムコールを使用してExcelのウィンドウを強制終了できますか(私はWindowsを使用しています)?

答えて

2

いいえ。ファイルシステム上のブックがソフトウェアライブラリによって変更された場合、Excelに通知する必要があります。 Excelは、ファイルシステム自体を監視するか、またはオペレーティングシステムに変更の通知を要求することによって、これを達成することができます。その後、Excelはこのイベントにどのように応答するかを知る必要があります。 Excelは、異なるコンピュータ上のExcelの複数のインスタンスによって同時にアクセスされているネットワーク共有上のファイルに対して、このような処理を行いますが、どのように処理するのかはわかりません。 答えは、Excelのコントロール/知識の外にあるブックを変更し、POIに固有ではない他のライブラリでも同じです。

Excelは、通常、スプレッドシートに排他的なOSレベルの書き込みロックを取得するため、Excelにデスグリップがあるブックを書き込もうとすると、IOException Permission Denied例外が発生します。

Linux上のLibreOfficeはファイルシステム上にロックファイルを作成します。このファイルは無視され、ファイルに書き込むことができます。 LibreOfficeにはFile> Reload機能があり、ディスク上の内容を再読み込みしますが、手動で処理します。

さらに、POIは、ブックが読み込まれたのと同じファイルの場所に書き込む作業にあまり適していません。オプションは次のとおりです。 1)ファイルを一時的な場所にコピーしてから、 2)FileInputStreamの入力ファイルをバッファし、読み込んだのと同じ場所に書き出します(これは、FileInputStreamを閉じるまで、最初の読み込み中に多くのメモリを消費します)。 3)一時ファイルの場所に書き込み、ディスク上のファイルの名前を変更します。

COM接続またはActiveXサーバー経由でExcelと通信できるソフトウェアを見つける方が良いかもしれません。これは、Excelがサーバーとして動作し、アプリケーションが軽量クライアント。

関連する問題