【问题标题】:POI DataFormatter returns 2 digits year instead of 4 digits year for date cells [duplicate]POI DataFormatter 为日期单元格返回 2 位数年份而不是 4 位数年份 [重复]
【发布时间】:2018-11-09 15:08:31
【问题描述】:

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

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

【问题讨论】:

标签: java apache-poi


【解决方案1】:

Excel Cell Style issue 中,我已经证明,如果 Excel 中使用默认日期格式(短日期)格式化的日期只有格式 id 0xE (14) 存储在文件中并且在任何地方都没有存储格式模式。那么短日期在 Excel 中的显示方式取决于系统的区域设置。

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

使用 Apache POI 的 DataFormatter,我们可以通过自定义 DataFormatter 来解决这个问题。

例子:

Excel:

代码:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多