【发布时间】:2018-11-09 15:08:31
【问题描述】:
Excel 单元格的日期格式为m/d/yyyy,并以 4 位数年份显示日期。但是 POI 以另一种格式返回日期 m/d/yy。单元格样式返回相同的格式,带有 2 位数字年份 cell.getCellStyle().getDataFormatString()。
是否可以获得与我在 Excel 中使用 POI 看到的格式相同的格式?
【问题讨论】:
标签: java apache-poi
Excel 单元格的日期格式为m/d/yyyy,并以 4 位数年份显示日期。但是 POI 以另一种格式返回日期 m/d/yy。单元格样式返回相同的格式,带有 2 位数字年份 cell.getCellStyle().getDataFormatString()。
是否可以获得与我在 Excel 中使用 POI 看到的格式相同的格式?
【问题讨论】:
标签: java apache-poi
在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
【讨论】: