POI DataFormatter 为日期单元格返回 2 位数年份而不是 4 位数年份

Laz*_*azy 2 java apache-poi

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

是否可以使用 POI 获得与我在 Excel 中看到的格式相同的格式?

Axe*_*ter 5

Excel 单元格样式问题中,我已经表明,如果 Excel 中使用默认日期格式 ( Short Date )格式化的日期0xE在文件中存储了格式 ID (14),并且在任何地方都没有存储格式模式。因此,短日期在 Excel 中的显示方式取决于系统的区域设置。

DataFormatter该答案中还显示了如何在不使用 Apache POI 的情况下解决此问题。

使用 Apache POI,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();
 }
}
Run Code Online (Sandbox Code Playgroud)

结果java.util.Locale.GERMANY设定:

Short Date
12.08.2018
Formatted Date
Sonntag, August 12, 2018
Run Code Online (Sandbox Code Playgroud)

结果java.util.Locale.US设定:

Short Date
8/12/2018
Formatted Date
Sunday, August 12, 2018
Run Code Online (Sandbox Code Playgroud)

结果java.util.Locale.UK设定:

Short Date
12/08/2018
Formatted Date
Sunday, August 12, 2018
Run Code Online (Sandbox Code Playgroud)