Ich arbeite an einer Funktion, wo ich Nummern gespeichert über eine Excel-Datei hochladen muss. Es ist in Java geschrieben, mit Apache Poi-Bibliothek, unter Spring-Framework (was irrelevant ist).Apache POI liest Textspalte als numerisch
Die Datei, die ich (Beachten Sie, dass die Spalte bereits auf Text eingestellt wurde) zu laden bin versucht:
-Code ist wie folgt:
// function accepts "MultipartFile inputFile"
InputStream is = inputFile.getInputStream();
StreamingReader reader = StreamingReader.builder().rowCacheSize(100).bufferSize(4096).sheetIndex(0)
.read(is);
for (Row row : reader) {
System.out.println("Reading next row.");
System.out.println("row[0] is of type " + row.getCell(0).getCellType());
Cell cell = row.getCell(0);
String value = "";
if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
value = cell.getStringCellValue().replaceAll("[\\D]", "");
} else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
value = NumberToTextConverter.toText(cell.getNumericCellValue());
}
System.out.println("Value is " + value);
}
Und ich m unter Ausgabe bekommen:
Reading next row.
row[0] is of type 0 // Which is equals to Cell.CELL_TYPE_NUMERIC
Value is 166609647
I ssue ist, dass ich es als '0166609647' anstelle von '166609647' lesen müsste, komischerweise passiert dies nur mit xlsx-Datei, wenn ich es als XLS-Format speichern und die Datei erneut hochladen, habe ich kein Problem mit der Erkennung seiner Zelltyp. Irgendwelche Ideen?
Herausgegeben für die Vervielfältigung markiert werden:
- Gegeben Antwort https://stackoverflow.com/a/19401902/1131470 DataFormatter-Klasse verwendet, die nicht unterstützt wird, wenn wir das Blatt strömen, wie das Objekt Handy abgerufen wird ein StreamingCell Objekt sein, die löst eine Ausnahme aus, wenn wir die Funktion getCellStyle() aufrufen.
Ab dem 29. Mar 2016
Es scheint, dass die Klasse StreamingCell nicht DataFormatter nicht unterstützt, wo DataFormatter die einzige Klasse im Moment zur Verfügung steht, was Excel zeigt zu greifen. Die aktuelle Lösung würde also darin bestehen, die gesamte Excel-Datei in den Speicher einzulesen. Wenn jemand in Zukunft eine Antwort finden sollte, könntest du bitte eine Antwort hier posten, ich würde das sehr schätzen, da die derzeitige Lösung eine absolut schreckliche Lösung ist.
Zum 31. Mar 2016
Besonderen Dank geht an Axel, der seine Bibliothek Version Ausgabe darauf hingewiesen, Streamer JAR-Datei 0.2.12 Aktualisierung löst das Problem. Vielen Dank!
Ich vermute, dass es an der https://github.com/monitorjbl/excel-streaming-reader liegen. Stellen Sie also sicher, dass Sie die neueste Version verwenden. –
@AxelRichter Vielen Dank für den Hinweis, ja, wenn ich in die Klasse von StreamingCell schaue https://github.com/monitorjbl/excel-streaming-reader/blob/master/src/main/java/com/monitorjbl /xlsx/impl/StreamingCell.java, scheint es, dass die meisten Funktionen UnsupportedException werfen. Keine Wahl, aber ich müsste wieder die gesamte Datei lesen und dabei die Upload-Größe begrenzen. –
Was Sie sagen, kann nicht wahr sein. Wenn die Zelle als 'Text' formatiert ist, dann ist der Typ der Zelle bei OpenXML 't =" s "' und der Wert der Zelle zeigt auf 'sharedStrings.xml'. So kann 'row.getCell (0) .getCellType()' nicht 0 sein und der Wert kann nicht 166609647 sein. Das kann nur sein, wenn die Zelle ** nicht ** als 'Text' formatiert ist. Dann und nur dann würden Sie einen Formatierer benötigen. –