2014-10-15 6 views
1

У меня есть xlsx с этой датой в ячейке: 03-09-2014, когда я читал xlsx-ячейку, используя apache POI, он пишет это: 41883.0.XLSX пользовательский формат даты, считанный как строка

Это так, как я могу это сделать:

while (cellIterator.hasNext()) { 
       Cell cell = cellIterator.next(); 
       cell.setCellType(Cell.CELL_TYPE_STRING); 
       System.out.print(cell.getStringCellValue() + ";"); 
      } 

Поскольку я преобразовал все клетки, чтобы стать тип String, я бы ожидать не деформации даты ...

Любое решение? apache poi DataFormatter on cell containing date Это решение :)

ответ

4

Почему? Почему, почему, почему ты написал этот код для начала? Это просто неправильно на стольких уровнях, как, вероятно, каждый третий вопрос Apache POI на Stackoverflow :(О, и это explicitly advised against in the JavaDocs ....

У вас есть два варианта. Если вы хотите иметь полный контроль над чтение значений, затем следуют instructions in the Apache POI documentation on reading cell values, и писать код что-то вроде:

for (Row row : sheet1) { 
    for (Cell cell : row) { 
     CellReference cellRef = new CellReference(row.getRowNum(), cell.getColumnIndex()); 
     System.out.print(cellRef.formatAsString()); 
     System.out.print(" - "); 

     switch (cell.getCellType()) { 
      case Cell.CELL_TYPE_STRING: 
       System.out.println(cell.getRichStringCellValue().getString()); 
       break; 
      case Cell.CELL_TYPE_NUMERIC: 
       if (DateUtil.isCellDateFormatted(cell)) { 
        System.out.println(cell.getDateCellValue()); 
       } else { 
        System.out.println(cell.getNumericCellValue()); 
       } 
       break; 
      case Cell.CELL_TYPE_BOOLEAN: 
       System.out.println(cell.getBooleanCellValue()); 
       break; 
      case Cell.CELL_TYPE_FORMULA: 
       System.out.println(cell.getCellFormula()); 
       break; 
      default: 
       System.out.println(); 
     } 
    } 
} 

с другой стороны, если вы просто хотите «дать мне ближайший строку вы можете к тому, что эта клетка выглядит как в Excel», то вам нужно используйте DataFormatter class, который предоставляет методы, которые читают правила формата Excel, применяемые к ячейке, а затем воссоздает (насколько это возможно) те, что в Java

Ваш код должен быть:

DataFormatter fmt = new DataFormatter(); 

String valueAsInExcel = fmt.formatCellValue(cell); 

Это будет форматировать число, основанное на правилах форматирования, применяемые в Excel, так что должен вернуть его смотреть, как вы ожидаете

Наконец, даты в Excel хранятся в виде плавающей с 1900 по 1904 год, поэтому вы видите номер, который вы делаете в ячейке даты.

+0

Я проверил переполнение стека, поэтому перестань быть высокомерным. Все, что я нашел, это то, как преобразовать его в формат даты, что я попробовал, и он вернул мне 00-00-000 00:00:00 Солнце ... что-то в этом роде. И мой вопрос был, почему я не могу получить нормальное значение String из ячейки. Я знаю, ячейка числовая, но если я установил тип ячейки в String, я ожидал бы получить дату как String ... –

+0

FOI Я не использовал слово WHY. –

+0

Изменение типа ячейки на строку! = Выбор значения форматирования ближайшего эквивалента к excel в виде строки, это совершенно разные вещи. – Gagravarr

Смежные вопросы