我有一张日期为20160831的电子表格。
到目前为止我一直在使用:
if (Cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
if (DateUtil.isCellDateFormatted(cell)) {
// parse the date (irrelevant to this question as ^^ is false)
} else {
Cell.setCellType(Cell.CELL_TYPE_STRING);
// do some work with Cell.getStringCellValue();
}
}
但是,在这种情况下,从Cell.getStringCellValue()返回的字符串不是“20160831”,而是“20160930”。
我已经打印过cell.getNumericCellValue();返回2.016093E7。这导致我在转换为String时失去“31”中的“1”。
我尝试使用DataFormatter希望显示“与Excel中显示的数据完全相同的数据”。 (https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/DataFormatter.html#formatCellValue(org.apache.poi.ss.usermodel.Cell))
我试图使用cell.getCellDateValue(),但效果更差。
我试图将DecimalFormat用于同样的效果。
我试图使用NumberToTextConverter达到同样的效果。
我总是在“31”中失去“1”。我发现这是目前最麻烦的问题,虽然我也在这个日期找回了不正确的月份值(任何有关这方面的见解也是最有帮助的。)
除了在解析之前手动将电子表格导出到csv文件之外,我找不到解决此问题的方法。同时,由于DateUtils通常返回true,因此其他大量文件与上面的代码完美配合。
编辑:
我正在添加完整的块(不超过我最初发布的内容,以及电子表格的屏幕截图和打印输出的副本。
private Transitional parseValueForTransitionalWithPropertyAndVector(Cell cell,
Transitional transitional, Property property, Vector vector) {
if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
if (DateUtil.isCellDateFormatted(cell)) {
logger.log(Level.INFO,
"parseValueForTransitionalWithPropertyAndVector() | cellDeterminedToHoldASerialiazedDate");
Calendar calendar = new GregorianCalendar();
Date date = null;
try {
date = cell.getDateCellValue();
calendar.setTime(date);
if (property.getPropTypeKey() == TransitionalHelper.PROP_TYPE_KEY.PAYSTART) {
transitional.setPayPeriodStart(calendar);
logger.log(Level.INFO,
"parseValueForTransitionalWithPropertyAndVector() payStart[MM/DD/YYYY]: "
+ calendar.get(Calendar.MONTH) + "/" + calendar.get(Calendar.DAY_OF_MONTH) + "/"
+ calendar.get(Calendar.YEAR));
} else if (property.getPropTypeKey() == TransitionalHelper.PROP_TYPE_KEY.PAYEND) {
transitional.setPayPeriodEnd(calendar);
logger.log(Level.INFO,
"parseValueForTransitionalWithPropertyAndVector() payEnd[MM/DD/YYYY]: "
+ calendar.get(Calendar.MONTH) + "/" + calendar.get(Calendar.DAY_OF_MONTH) + "/"
+ calendar.get(Calendar.YEAR));
} else if (property.getPropTypeKey() == TransitionalHelper.PROP_TYPE_KEY.PAYDATE) {
transitional.setPayDate(calendar);
logger.log(Level.INFO,
"parseValueForTransitionalWithPropertyAndVector() payDate[MM/DD/YYYY]: "
+ calendar.get(Calendar.MONTH) + "/" + calendar.get(Calendar.DAY_OF_MONTH) + "/"
+ calendar.get(Calendar.YEAR));
}
} catch (IllegalStateException e) {
e.printStackTrace();
}
} else {
// Added to debug >>
System.out.println("cell.getNumericCellValue(): " + cell.getNumericCellValue());
DataFormatter formatter = new DataFormatter();
System.out.println("DataFormatter output: " + formatter.formatCellValue(cell));
System.out.println("DecimalFormat output: " + new DecimalFormat("0").format( cell.getNumericCellValue()));
System.out.println("NumberToTextConverter output: " + NumberToTextConverter.toText(cell.getNumericCellValue()));
cell.setCellType(Cell.CELL_TYPE_STRING);
System.out.println("cell.getStringCellValue(): " + cell.getStringCellValue());
// <<
transitional = parseValueForTransitionalWithPropertyAndVector(cell.getStringCellValue(),
transitional, property, vector);
}
} else {
cell.setCellType(Cell.CELL_TYPE_STRING);
transitional = parseValueForTransitionalWithPropertyAndVector(cell.getStringCellValue(),
transitional, property, vector);
}
return transitional;
}`
澄清:
Transitional是解析值附加到的对象。属性定义如何解析单元格中的值。 Vector是一个显示值的位置的地图。
输出:
cell.getNumericCellValue(): 2.016093E7
DataFormatter output: 20160930
DecimalFormat output: 20160930
NumberToTextConverter output: 20160930
cell.getStringCellValue(): 20160930
电子表格中相关单元格的屏幕截图(我无法上传整个电子表格):