2016-12-27 21 views
0

Apache POIを使用してワークブックのすべての数式セルを評価しています。 セルに標準のExcel関数NOW()への呼び出しが含まれている場合、Poiは正しく評価し、その呼び出しを現在の時刻に置き換えます(VMのデフォルトタイムゾーンでフォーマットされています)。私はこのタイムゾーンを調整したいと思います。 DateUtilのタイムゾーンを変更する方法はありますか?私は3.14-β1にNOW実装のコードを見つけApache Poiのデフォルトタイムゾーン

、私は参考のためにそれを添付:

/** 
* Implementation of Excel NOW() Function 
* 
* @author Frank Taffelt 
*/ 
public final class Now extends Fixed0ArgFunction { 
    public ValueEval evaluate(int srcRowIndex, int srcColumnIndex) { 
     Date now = new Date(System.currentTimeMillis()); 
     return new NumberEval(DateUtil.getExcelDate(now)); 
    } 
} 
+2

'DateUtil'によって使用される' org.apache.poi.util.LocaleUtil.setUserTimeZone() 'を見てください。これはスレッドごとに設定する必要があります。 – kiwiwings

+0

ありがとう、これは私が探していた答えです。なぜそれを答えとして掲示しなかったのですか? – Mathis

答えて

3

完全を期すために、私はつまり、私はまだ(...あまりにも答えとしてソリューションを追加します私は若いと思うし、投票が必要です...)

POI 3.13からは、org.apache.poi.util.LocaleUtilクラスを追加して、POI内のロケール固有の要求を処理しました。問題を処理する方法はsetUserTimeZone()です。これはスレッドごとに設定する必要があります。そのため、ワークブックを開くか作成する前に、TimeZoneオブジェクトでその関数を呼び出してください。 通常、clear ThreadLocals in the end of processingには良いアイデアです。特にスレッドプールを扱う場合は、resetUserTimeZone()finallyブロックでお電話ください。

Forbidden Apis ToolでTimeZone/Locale関連の呼び出しの気付かない/デフォルトの処理を防止するように注意しましたが、すべてのケースをカバーしています。異常が見つかった場合は、ticketを開いてください。

+0

問題は、CellFormatは、フォーマット文字列だけに基づいてインスタンスを静的キャッシュにキャッシュするため、getInstanceを最初に呼び出す人は、使用するロケールを決定する人です。 – Trejkaz