2017-09-20 2 views
0

Ich benutze das HSSFWorkbook in Apache Poi 3.12 mit Java 1.6, um .xls-Dateien in Tab-getrennte Textdateien zu verwandeln. In meiner processRecord Methode, die ich erhalte Werte von Nummernfeldern eines FormatTrackingHSSFListener auf einem NumberRecord, numrec Verwendung in dem folgenden Code:Apache POI Java 6 bis 8 Unterschied

String value = formatListener.getFormatString(numrec);

Dies nimmt einen Wert, wie 21,9, und rundet es auf die nächste ganze Zahl. Mein Problem ist, dass wenn ich auf einen neuen Server mit Java 1.8 geändert habe, der Wert abgeschnitten statt gerundet wird, so dass 21.9 zu 21 anstatt 22. Ich habe die Poi-Dokumente von Apache durchgesehen und sie erwähnen keine Änderung in Verhalten, also frage ich nach Antworten auf die folgenden Fragen:

  • Warum passiert das? (am wenigsten wichtig)
  • Gibt es eine Möglichkeit, den Wert abzurunden, so dass es in Java 1.8 rundet und nicht abschneidet?
  • Gibt es eine Möglichkeit, den Wert in seiner ursprünglichen Form ohne Rundung oder Kürzung abzurufen?

Ich habe bereits einen anderen Weg, um den Wert aus der xls-Datei versucht:

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

aber ich das gleiche Verhalten zu bekommen.

+0

Was passiert, wenn Sie die neueste Version von Apache POI, derzeit 3.17, ausprobieren? – Gagravarr

+0

Wahrscheinlich haben Sie bereits überprüft, aber können Sie bestätigen, dass der numrec-Wert zwischen den Java-Versionen immer gleich ist? Sie können einen Unit Test Case dafür schreiben. – Anon

+0

Aktualisierung auf den neuesten Poi (3.17) hat den Job gemacht, danke an alle – user3813942

Antwort

0

Ich habe kein Java 8, aber mit Java 7 und den folgenden Apache Poi Bibliotheken habe ich kein Problem (ich denke, das Problem ist seine Apache Poi Version).

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 poi Bibliotheken:

enter image description here

Ergebnis:

enter image description here

Excel-Datei:

enter image description here