我正在使用Apache POI来评估工作簿的每个公式单元格 . 当一个单元格包含对标准excel函数NOW()的调用时,Poi正确评估它并用当前时间替换该调用 - 格式化为VM的默认时区 . 我想调整这个时区 . 有没有办法改变DateUtil的时区?
我在3.14-beta1中找到了NOW Implementation的代码,我附上它以供参考:
/**
* 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));
}
}
1 回答
为了完整起见,我也将解决方案添加为答案......(即我仍然认为我很年轻,需要投票...)
从POI 3.13开始,我们添加了一个org.apache.poi.util.LocaleUtil类,用于处理POI中的Locale特定请求 . 有一个
setUserTimeZone()
方法来处理您的问题 . 这需要根据线程设置 - 因此在打开或创建工作簿之前,请使用TimeZone对象调用该函数 . 通常,clear ThreadLocals in the end of processing是个好主意,特别是如果你处理线程池,所以请在finally
块中调用resetUserTimeZone()
.虽然我们已经注意防止通过Forbidden Apis Tool对TimeZone / Locale相关调用进行未被注意/默认处理 - 但我不会覆盖所有情况 . 如果您发现任何违规行为,请打开ticket .