POI DataFormatter对于日期单元格返回2位数字的年份,而不是4位数字的年份

时间:2018-11-09 15:08:32

标签: java apache-poi

Excel单元格的日期格式为m/d/yyyy,并显示4位数字的年份。但是,POI会以另一种格式m/d/yy返回日期。单元格样式返回相同的格式,年份为cell.getCellStyle().getDataFormatString(),为2位数字。

是否可以通过POI获得与Excel中相同的格式?

1 个答案:

答案 0 :(得分:3)

Excel Cell Style issue中,我证明了如果Excel中使用默认日期格式(Short Date)格式化的日期仅具有ID 0xE的格式(14)存储在文件中,并且没有格式存储在任何地方。因此,Short Date在Excel中的显示方式取决于系统的区域设置。

该答案中还显示了如何在不使用apache poi的{​​{1}}的情况下解决此问题。

使用DataFormatter的{​​{1}},可以通过自定义apache poi来解决此问题。

示例:

Excel:

enter image description here

代码:

DataFormatter

设置了DataFormatter的结果:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.util.LocaleUtil;

import java.io.FileInputStream;

class ExcelDataformatterCustomized {

 public static void main(String[] args) throws Exception {

  Workbook wb  = WorkbookFactory.create(new FileInputStream("ExcelExample.xlsx"));

  LocaleUtil.setUserLocale(java.util.Locale.GERMANY);
  //LocaleUtil.setUserLocale(java.util.Locale.US);
  //LocaleUtil.setUserLocale(java.util.Locale.UK);

  DataFormatter df = new DataFormatter();
  FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();

  if (LocaleUtil.getUserLocale().equals(java.util.Locale.GERMANY)) {
   df.addFormat("m/d/yy", new java.text.SimpleDateFormat("dd.MM.yyyy"));
  } else if (LocaleUtil.getUserLocale().equals(java.util.Locale.US)) {
   df.addFormat("m/d/yy", new java.text.SimpleDateFormat("M/d/yyyy"));
  } else if (LocaleUtil.getUserLocale().equals(java.util.Locale.UK)) {
   df.addFormat("m/d/yy", new java.text.SimpleDateFormat("dd/MM/yyyy"));
  }

  Sheet sheet = wb.getSheetAt(0);
  for (Row row : sheet) {
   for (Cell cell : row) {

     String value = df.formatCellValue(cell, evaluator);
     System.out.println(value);

   }
  }
  wb.close();
 }
}

设置了java.util.Locale.GERMANY的结果:

Short Date
12.08.2018
Formatted Date
Sonntag, August 12, 2018

设置了java.util.Locale.US的结果:

Short Date
8/12/2018
Formatted Date
Sunday, August 12, 2018