2017-09-20 5 views
0

J'utilise le HSSFWorkbook dans Apache Poi 3.12 avec Java 1.6 pour transformer les fichiers .xls en fichiers texte délimités par des tabulations. Dans ma méthode processRecord je reçois les valeurs des champs numériques à l'aide d'un FormatTrackingHSSFListener sur un NumberRecord, numrec, dans le code suivant:Apache POI Java 6 à 8 Différence

String value = formatListener.getFormatString(numrec);

Cela prend une valeur, comme 21.9, et il arrondit au nombre entier le plus proche. Mon problème est que lorsque je suis passé à un nouveau serveur qui exécute Java 1.8, la valeur est tronquée au lieu d'être arrondie, donc 21.9 devient 21 au lieu de 22. J'ai parcouru les documents poi d'Apache et ils ne mentionnent pas de changement dans comportement, donc je demande des réponses aux questions suivantes:

  • Pourquoi cela se produit-il? (le moins important)
  • Existe-t-il un moyen d'extraire la valeur pour arrondir au lieu de tronquer dans Java 1.8?
  • Existe-t-il un moyen de récupérer la valeur dans sa forme d'origine sans arrondir ou tronquer?

J'ai déjà essayé une autre façon d'obtenir la valeur du fichier xls:

String value = new DataFormatter().formatCellValue(cell);

mais je reçois le même comportement.

+0

Que se passe-t-il si vous essayez la dernière version d'Apache POI, actuellement 3.17? – Gagravarr

+0

Vous avez probablement déjà vérifié, mais pouvez-vous confirmer que la valeur de numrec était toujours la même entre les versions java? Vous pouvez écrire un test élémentaire pour cela. – Anon

+0

mise à jour à la dernière poi (3.17) a fait le travail, merci à tous – user3813942

Répondre

0

Je n'ai pas java 8, mais avec java 7 et les librairies apache poi suivantes je n'ai aucun problème (je pense que le problème est sa version apache poi).

public static void main(String[] args) { 

    try { 
     FileInputStream is = new FileInputStream(new File("C:\\ook.xls")); 
     HSSFWorkbook wb = new HSSFWorkbook(is); 
     HSSFSheet sheet = wb.getSheet("Sheet1"); 

     Row row = sheet.getRow(0); 
     Cell cell = row.getCell(0); 

     System.out.println(cell.getNumericCellValue());//returns a double value so its ok 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    finally{ 

    } 
} 

Apache bibliothèques poi:

enter image description here

Résultat:

enter image description here

fichier Excel:

enter image description here