更新时间:2022-11-22 12:33:39
在 Excel Cell中样式问题我已经表明,如果Excel
中使用默认日期格式(Short Date
)格式化的日期仅在文件中存储了格式ID 0xE
(14),而没有格式模式存储在任何地方.因此Short Date
在Excel中的显示方式取决于系统的区域设置.
In Excel Cell Style issue I have shown that if a date in Excel
which is formatted using the default date format (Short Date
) only has the format id 0xE
(14) stored in the file and there is not a format pattern stored anywhere. So how Short Date
will be displayed in Excel depends on the locale settings of the system.
该答案中还显示了如何在不使用apache poi
的DataFormatter
的情况下解决此问题.
How working around this issue without using apache poi
's DataFormatter
is also shown in that answer.
使用apache poi
的DataFormatter
,我们可以通过自定义DataFormatter
来解决此问题.
Using apache poi
's DataFormatter
we can work around this issue with customizing the 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