使用POI在非日期格式化单元格中丢失日期准确性

时间:2016-12-21 20:15:16

标签: java date apache-poi cell

我有一张日期为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

电子表格中相关单元格的屏幕截图(我无法上传整个电子表格):

0 个答案:

没有答案