2
votes

Puis-je obtenir la date en Java comme TYPED INTO Excel Cell?

J'ai un programme java qui utilise apache-poi 3.17 pour lire et éditer les classeurs xlsx. J'essaye de lire une date et le format est important. J'ai besoin de la date d'origine de la manière dont la personne qui a créé le classeur l'a saisie. J'ai beaucoup recherché et j'ai constaté que les dates sont stockées sous forme d'entiers dans Excel, les nombres décimaux étant l'heure. Ainsi, par exemple, une personne tape "1/1/1947" et Excel le stocke en interne sous le nom "17168", puis l'affiche dans la cellule comme "01-Jan-47". Je ne peux pas modifier le classeur d'origine. Existe-t-il un moyen d'obtenir ce "1/1/1947" original qui a été tapé lors de l'utilisation d'apache poi dans un programme java? Quand je fais:

Cell cellule = row.getCell (cellColumn, MissingCellPolicy.CREATE_NULL_AS_BLANK); Valeur de chaîne = dataFormatter.formatCellValue (cellule);

La valeur est la valeur d'affichage "01-Jan-47". Quand je fais:

Cell cellule = row.getCell (cellColumn, MissingCellPolicy.CREATE_NULL_AS_BLANK); cell.setCellType (CellType.STRING); Valeur de chaîne = cell.getStringCellValue ();

J'obtiens la valeur interne "17168". Est-ce que quelqu'un sait comment (ou si c'est possible) obtenir l'original tapé en valeur? Il est définitivement stocké dans le classeur Excel car il s'affiche lorsque vous cliquez sur la cellule. Alternativement, si je débogue le programme dans Eclipse et clique sur l'objet de cellule montré ci-dessus, la date s'affiche dans le format d'affichage mais il a l'année complète à 4 chiffres; "1er janvier 1947". Je pourrais également l'utiliser si le format d'origine n'est pas possible, donc si quelqu'un sait comment obtenir cela en chaîne, cela aiderait également. Merci.


4 commentaires

Obtenez un java.util.Date en utilisant Cell.getDateCellValue puis formater cette Date si nécessaire?


Si vous obtenez la valeur de chaîne "01-Jan-47" avec le deuxième extrait de code ci-dessus, pourquoi ne pas écrire une fonction pour la diviser par - et faire une manipulation de chaîne pour retourner l'original?


"Il est définitivement stocké dans le classeur Excel car il s'affiche lorsque vous cliquez sur la cellule.": Non, il n'est définitivement pas stocké. Stocké est la valeur numérique de la date avec le format de la date. Ce que vous voyez en mode édition dans la cellule ou dans la barre de l'éditeur est la représentation de cette valeur de date numérique dans le format de date courte par défaut du système d'exploitation. Mon Excel allemand afficherait 01.01.1947 .


Axel Richter, merci je ne le savais pas. Cela change mes pensées à ce sujet.


3 Réponses :


0
votes

(suite au commentaire)

Basé sur ce code que vous avez inclus:

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;
 }

Voici un exemple de fonction qui peut renvoyer une valeur String manipulée pour représenter l'objectif que vous recherchez:

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

Qui renvoie:

"1/1/47"


0 commentaires

0
votes

Comme expliqué dans les commentaires d'Axel Richter, le format d'origine n'est jamais stocké. Ce que je pensais être le format d'origine est en fait le format par défaut de mon système d'exploitation. J'utiliserai soit le format stocké numériquement d'Excel, soit le Cell.getDateCellValue pour obtenir la date complète et la reformater. Merci pour les commentaires à tous.


0 commentaires

0
votes

Je me souviens avoir essayé la même chose.

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

Maintenant, le formatPattern pourrait aider à le convertir en un formateur de date java. (Le code format numérote certaines valeurs standard (avec des constantes dans l'API) et des valeurs personnalisées.) À l'époque, je me suis abstenu de le faire, car la solution n'était pas satisfaisante.

Peut-être que vous avez plus de succès, alors je le mentionne.


0 commentaires