当前位置: 首页 > 知识库问答 >
问题:

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

包唯
2023-03-14

Excel单元格的日期格式为m/d/yyyy,显示日期为4位年份。然而,POI以另一种格式m/d/yy返回日期。单元格样式返回相同的格式,带有2位yearcell.GetCellStyle().GetDataFormatString()

有没有可能用POI获得与我在Excel中看到的格式相同的格式?

共有1个答案

管和志
2023-03-14

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

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

使用Apache POIDataFormatter我们可以通过自定义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
 类似资料:
  • 问题内容: 我试图查询包含年份列的表,并以逗号分隔的年份范围的字符串形式返回这些年份。年份范围将由数组中出现的连续年份确定,非连续年份/年份范围应以逗号分隔。 而不是数据类型的原因是,其中一些值包含而不是年份列表。我们可以忽略这些结果。 到目前为止,我几乎没有运气解决这个问题,因为我什至不知道从哪里开始。 有人可以给我一些指导或提供一些有用的示例来说明如何解决诸如挑战之类的问题吗? 例子 产出目标

  • 正如本答案中所述,当日期模式(这里是ddMMyy)已知时,构建很容易。 但是由于用户输入模式,我不知道如何正确构建。我不能硬编码。 我必须自己解析模式并按正确的顺序调用和吗?还是有一个内置的解决方案?

  • Java8的类有一个方法,,它允许您从、字母字符串中定义格式。这些示例没有阐明,年-纪元和,周-年之间的区别。是什么?

  • 问题内容: 我正在使用Jodatime格式化日期,并使用语言环境来格式化特定于语言环境的日期。我希望将日期格式设置为“ 17/06/2013”​​(分隔符必须取决于语言环境), 几乎 可以通过以下方式实现 它给出“ 17/06/13”(2位数字的年份)。样式“ M-”表示“ 17 juin 2013”​​(法语区域设置),这也不是我想要的。 当然,我可以使用“ dd / MM / yyyy”之类的

  • 问题内容: 用户将以不同的模式向我的应用程序输入日期。对于两位数的年份,他还必须确定关键日期。 示例: pattern = yy-MM-dd 枢轴日期= 70 (我以编程方式添加了当前的千年和上个世纪,以获得更多动态=> 1970 ) 69-04-22 变为 2069-04-22 70-04-22 变为 1970-04-22 像此答案中所述,很容易在已知日期模式(此处为 ddMMyy )时构建一个