Excel单元格的日期格式为m/d/yyyy
,并显示4位数字的年份。但是,POI会以另一种格式m/d/yy
返回日期。单元格样式返回相同的格式,年份为cell.getCellStyle().getDataFormatString()
,为2位数字。
是否可以通过POI获得与Excel中相同的格式?
答案 0 :(得分:3)
在Excel Cell Style issue中,我证明了如果Excel
中使用默认日期格式(Short Date
)格式化的日期仅具有ID 0xE
的格式(14)存储在文件中,并且没有格式存储在任何地方。因此,Short Date
在Excel中的显示方式取决于系统的区域设置。
该答案中还显示了如何在不使用apache poi
的{{1}}的情况下解决此问题。
使用DataFormatter
的{{1}},可以通过自定义apache poi
来解决此问题。
示例:
Excel:
代码:
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