2016-12-27 6 views
0

Ich verwende Apache POI, um jede Formelzelle einer Arbeitsmappe zu bewerten. Wenn eine Zelle einen Aufruf der Standard-Excel-Funktion NOW() enthält, wird sie von Poi korrekt ausgewertet und ersetzt den Anruf durch die aktuelle Zeit - formatiert in der Standardzeitzone der VM. Ich möchte diese Zeitzone anpassen. Gibt es eine Möglichkeit, die Zeitzone von DateUtil zu ändern?Apache Poi Standardzeitzone

ich den Code der NOW-Implementierung in 3,14-Beta1 gefunden, lege ich es als Referenz:

/** 
* 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

Schauen Sie in org.apache.poi.util.LocaleUtil.setUserTimeZone() ', das von' DateUtil' verwendet wird. Dies muss pro Thread eingestellt werden. – kiwiwings

+0

Vielen Dank, das ist die Antwort, nach der ich gesucht habe. Warum hast du es nicht als Antwort gepostet? – Mathis

Antwort

3

Aus Gründen der Vollständigkeit füge ich die Lösung als Antwort zu ... (dh ich noch denke, ich bin jung und brauchte die Stimmen ...)

Beginnend mit POI 3.13 haben wir eine org.apache.poi.util.LocaleUtil Klasse hinzugefügt, um länderspezifische Anfragen innerhalb POI zu behandeln. Es gibt eine setUserTimeZone() Methode, um Ihr Problem zu behandeln. Dies muss pro Thread festgelegt werden. Rufen Sie diese Funktion also vor dem Öffnen oder Erstellen einer Arbeitsmappe mit Ihrem Objekt TimeZone auf. Normalerweise ist es eine gute Idee, clear ThreadLocals in the end of processing, vor allem, wenn Sie mit Thread-Pools beschäftigen, so rufen Sie bitte resetUserTimeZone() in einem finally Block.

Obwohl wir uns darum gekümmert haben, unbemerkten/standardmäßigen Umgang mit TimeZone/Locale-bezogenen Anrufen über die Forbidden Apis Tool zu verhindern - ich würde nicht wetten, dass wir alle Fälle abgedeckt haben. Wenn Sie Unregelmäßigkeiten feststellen, öffnen Sie bitte eine ticket.

+0

Das Problem ist, dass CellFormat die Instanz in einem statischen Cache zwischenspeichert, basierend auf der Formatzeichenfolge. Wer also zuerst getInstance aufruft, entscheidet, welches Gebietsschema verwendet werden soll. – Trejkaz