首页 文章

Apache Poi默认时区

提问于
浏览
0

我正在使用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 回答

  • 6

    为了完整起见,我也将解决方案添加为答案......(即我仍然认为我很年轻,需要投票...)

    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 .

相关问题