Excel 单元格具有日期格式m/d/yyyy并以 4 位年份显示日期。但是 POI 以另一种格式返回日期m/d/yy。单元格样式返回与 2 位数 year 相同的格式cell.getCellStyle().getDataFormatString()。
是否可以使用 POI 获得与我在 Excel 中看到的格式相同的格式?
在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)