Могу ли я получить Date in Java как TYPED INTO excel cell? - PullRequest
0 голосов
/ 08 января 2019

У меня есть Java-программа, которая использует apache-poi 3.17 для чтения и редактирования книг xlsx. Я пытаюсь прочитать дату, и формат важен. Мне нужна оригинальная дата, как тот, кто ее создал, набрал ее. Я много исследовал и обнаружил, что даты хранятся в Excel как целые числа, а десятичные числа - это время. Так, например, человек вводит «01.01.1947», а Excel хранит его внутри как «17168», а затем отображает в ячейке как «01-Jan-47». Я не могу изменить оригинальную рабочую книгу. Есть ли способ получить тот оригинал "01.01.1947", который был набран при использовании apache poi в java-программе? Когда я делаю:

Cell cell = row.getCell(cellColumn, MissingCellPolicy.CREATE_NULL_AS_BLANK); String value = dataFormatter.formatCellValue(cell);

Значение отображается как отображаемое значение «01-Jan-47». Когда я делаю:

Cell cell = row.getCell(cellColumn, MissingCellPolicy.CREATE_NULL_AS_BLANK); cell.setCellType(CellType.STRING); String value = cell.getStringCellValue();

Я получаю внутреннее значение "17168". Кто-нибудь знает, как (или если это возможно) получить оригинал, набранный в значении? Он определенно хранится в книге Excel, поскольку отображается при нажатии на ячейку. В качестве альтернативы, если я отлаживаю программу в Eclipse и щелкаю на объекте ячейки, показанном выше, дата отображается в формате отображения, но у нее полный год из 4 цифр; "01-Jan-1947". Я также мог бы использовать это, если исходный формат не возможен, поэтому, если кто-то знает, как передать это в строку, это также поможет. Спасибо.

Ответы [ 3 ]

0 голосов
/ 08 января 2019

Как объяснил в комментариях Аксель Рихтер, оригинальный формат никогда не сохраняется. То, что я думал, был оригинальный формат на самом деле формат по умолчанию для моей ОС. Я буду использовать числовой формат из Excel или Cell.getDateCellValue, чтобы получить полную дату и переформатировать ее. Спасибо всем за комментарии.

0 голосов
/ 08 января 2019

Я помню, пробовал то же самое.

Cell cell = ...
int format = cell.getCellStyle().getDataFormat();
String formatPattern = cell.getCellStyle().getDataFormatString(); // ddmm

Теперь formatPattern может помочь преобразовать его в форматировщик даты Java. (Код format нумерует некоторые стандартные значения (с константами в API) и пользовательские.) В то время я воздерживался от этого, поскольку решение было неудовлетворительным.

Может быть, у вас больше успеха, поэтому я упоминаю об этом.

0 голосов
/ 08 января 2019

(продолжение комментария)

На основании этого кода вы включили:

Cell cell = row.getCell(cellColumn, MissingCellPolicy.CREATE_NULL_AS_BLANK);
cell.setCellType(CellType.STRING);
String value = cell.getStringCellValue();

Вот пример функции, которая может возвращать управляемое значение String для представления цели, которую вы ищете:

private static String returnOrig(String value) {

   String mth;
   String[] parts = value.split("-");
   String day = parts[0];

   if (day.substring(0,1).equals("0")) {
       day = day.substring(1,2);
   } 

   switch(parts[1]) {
       case "Jan": mth = "1"; break;
       case "Feb": mth = "2"; break;
       case "Mar": mth = "3"; break;
       case "Apr": mth = "4"; break;
       case "May": mth = "5"; break;
       case "Jun": mth = "6"; break;
       case "Jul": mth = "7"; break;
       case "Aug": mth = "8"; break;
       case "Sep": mth = "9"; break;
       case "Oct": mth = "10"; break;
       case "Nov": mth = "11"; break;
       case "Dec": mth = "12"; break;
       default: mth = "0";
   }

   String original = mth + "/" + day + "/" + parts[2];

   return original;
 }

Что возвращает:

"1/1/47"

...