Ich habe eine Excel-Datei mit solchen Inhalten:
A1: SomeString
A2: 2
Alle Felder sind auf das String-Format eingestellt.
Wenn ich die Datei in Java mit POI lese, wird angezeigt, dass A2 im numerischen Zellenformat vorliegt.
- Das Problem ist, dass der Wert in A2 2 oder 2,0 sein kann (und ich möchte sie unterscheiden können), also kann ich nicht einfach verwenden
.toString()
.
Was kann ich tun, um den Wert als Zeichenfolge zu lesen?
java
excel
apache-poi
Joycollector
quelle
quelle
Ich glaube nicht, dass wir diese Klasse hatten, als Sie die Frage gestellt haben, aber heute gibt es eine einfache Antwort.
Sie möchten die DataFormatter-Klasse verwenden . Sie übergeben dieser Zelle eine Zelle, und es ist am besten, Ihnen eine Zeichenfolge zurückzugeben, die enthält, was Excel Ihnen für diese Zelle anzeigen würde. Wenn Sie eine Zeichenfolgenzelle übergeben, erhalten Sie die Zeichenfolge zurück. Wenn Sie eine numerische Zelle mit angewendeten Formatierungsregeln übergeben, wird die darauf basierende Zahl formatiert und die Zeichenfolge zurückgegeben.
Für Ihren Fall würde ich annehmen, dass auf die numerischen Zellen eine ganzzahlige Formatierungsregel angewendet wird. Wenn Sie DataFormatter bitten, diese Zellen zu formatieren, erhalten Sie eine Zeichenfolge mit der Ganzzahlzeichenfolge zurück.
Beachten Sie auch, dass viele Leute dies vorschlagen
cell.setCellType(Cell.CELL_TYPE_STRING)
, aber die Apache POI JavaDocs geben ganz klar an, dass Sie dies nicht tun sollten ! Wenn Sie densetCellType
Aufruf ausführen, verliert die Formatierung, da die Javadocs erklären, dass die einzige Möglichkeit zum Konvertieren in einen String mit verbleibender Formatierung die Verwendung der DataFormatter-Klasse ist .quelle
When passed a null or blank cell, this method will return an empty String (""). Formulas in formula type cells will not be evaluated.
Der folgende Code funktionierte für mich für jeden Zelltyp.
quelle
getCreationHelper().createFormulaEvaluator()
Methode einen Formelauswerter . Auf diese Weise wird Ihr Code nicht mit der HSSFFormulaEvaluator-Klasse gekoppelt.FormulaEvaluator
einfach aus dieser Lösung entfernt werden? Hat es einen Zweck?Ich würde den folgenden Ansatz empfehlen, wenn das Ändern des Zelltyps unerwünscht ist:
NumberToTextConverter kann Doppelwerte mithilfe von Excel-Regeln ohne Genauigkeitsverlust korrekt in einen Text konvertieren.
quelle
Wie bereits in den JavaDocs des Poi erwähnt ( https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType%28int%29 ), verwenden Sie nicht:
aber benutze:
Weitere Beispiele unter http://massapi.com/class/da/DataFormatter.html
quelle
Ja, das funktioniert perfekt
empfohlen:
alt:
Selbst wenn Sie ein Problem beim Abrufen eines Werts aus
cell
einer Formel haben, funktioniert dies dennoch.quelle
Versuchen:
Sollte die Nummer richtig formatieren.
quelle
2
und unterscheiden können2.0
. Ihre Lösung würde dies nicht tun. (Aber trotzdem willkommen bei Stack Overflow!)Solange die Zelle im Textformat vorliegt, bevor der Benutzer die Nummer eingibt, können Sie den Wert über den POI als Zeichenfolge abrufen. Ein Schlüssel ist, dass Sie, wenn sich in der oberen linken Ecke der Zelle ein kleines grünes Dreieck befindet, das als Text formatiert ist, dessen Wert als Zeichenfolge abrufen können (das grüne Dreieck wird immer dann angezeigt, wenn es sich um eine Zahl handelt wird in ein Textformat gezwungen). Wenn Sie textformatierte Zellen haben, die Zahlen enthalten, der POI jedoch nicht zulässt, dass Sie diese Werte als Zeichenfolgen abrufen, können Sie einige Schritte mit den Tabellenkalkulationsdaten ausführen, um Folgendes zu ermöglichen:
Als letztes können Sie die Methode 'getRawValue ()' der Zellenklasse verwenden, wenn Sie POI verwenden, um Daten aus einer Excel 2007-Tabelle abzurufen. Es ist egal, wie das Format ist. Es wird einfach eine Zeichenfolge mit den Rohdaten zurückgegeben.
quelle
Wenn wir den numerischen Zellenwert von MS Excel mithilfe der Apache POI-Bibliothek lesen, wird er als numerisch gelesen. Aber manchmal möchten wir, dass es als Zeichenfolge gelesen wird (z. B. Telefonnummern usw.). So habe ich es gemacht:
Fügen Sie eine neue Spalte mit der ersten Zelle = CONCATENATE ("!", D2) ein. Ich gehe davon aus, dass D2 die Zellen-ID Ihrer Telefonnummernspalte ist. Ziehen Sie die neue Zelle bis zum Ende.
Wenn Sie nun die Zelle mit POI lesen, wird die Formel anstelle des berechneten Werts gelesen. Gehen Sie nun wie folgt vor:
Fügen Sie eine weitere Spalte hinzu
Wählen Sie die in Schritt 1 erstellte vollständige Spalte aus und wählen Sie Bearbeiten-> KOPIEREN
Gehen Sie zur obersten Zelle der in Schritt 3 erstellten Spalte und wählen Sie Bearbeiten-> Inhalte einfügen
Wählen Sie im geöffneten Fenster das Optionsfeld "Werte"
Wählen Sie "OK"
Lesen Sie jetzt mit der POI-API ... nach dem Lesen in Java ... entfernen Sie einfach das erste Zeichen, dh "!"
quelle
Ich hatte auch ein ähnliches Problem mit einem Datensatz von Tausenden von Zahlen und ich denke, dass ich einen einfachen Weg gefunden habe, um es zu lösen. Ich musste den Apostroph vor einer Zahl einfügen, damit ein separater DB-Import die Zahlen immer als Text sieht. Zuvor wurde die Nummer 8 als 8.0 importiert.
Lösung:
Hey Presto alle Zahlen aber als Text gespeichert.
quelle
getStringCellValue gibt NumberFormatException zurück, wenn der Zelltyp numerisch ist. Wenn Sie den Zelltyp nicht in Zeichenfolge ändern möchten, können Sie dies tun.
quelle
Viele dieser Antworten beziehen sich auf alte POI-Dokumentationen und -Klassen. Im neuesten POI 3.16 ist Cell mit den int-Typen veraltet
Stattdessen kann die CellType-Aufzählung verwendet werden.
Aktualisieren Sie Ihren POM nur mit der Poi-Abhängigkeit sowie der Poi-Ooxml-Abhängigkeit auf die neue Version 3.16, da sonst weiterhin Ausnahmen auftreten. Ein Vorteil dieser Version besteht darin, dass Sie den Zelltyp zum Zeitpunkt der Erstellung der Zelle angeben können, wodurch alle in den vorherigen Antworten beschriebenen zusätzlichen Schritte entfallen:
quelle
Ich würde viel lieber den Weg der Antwort von Wil oder Vinayak Dornala gehen, leider haben sie meine Leistung viel zu sehr beeinflusst. Ich habe mich für eine HACKY- Lösung für implizites Casting entschieden:
Ich schlage nicht vor, dass Sie dies tun, da es in meiner Situation aufgrund der Funktionsweise des Systems funktioniert hat und ich eine zuverlässige Dateiquelle hatte.
Fußnote: numericColumn Ist ein int, das aus dem Lesen des Headers der verarbeiteten Datei generiert wird.
quelle
Ich habe es versucht und es hat bei mir funktioniert
quelle
Kontrollieren Sie das Excel-Arbeitsblatt trotzdem? Gibt es eine Vorlage, über die die Benutzer Ihnen die Eingabe geben können? In diesem Fall können Sie die Eingabezellen für Sie im Codeformat formatieren.
quelle
Es sieht so aus, als ob dies in der aktuellen Version von POI nicht möglich ist, basierend auf der Tatsache, dass dieser Fehler:
https://issues.apache.org/bugzilla/show_bug.cgi?id=46136
ist noch ausstehend.
quelle
cell.setCellType (Cell.CELL_TYPE_STRING); funktioniert gut für mich
quelle
Das hat perfekt für mich funktioniert.
quelle
Wir hatten das gleiche Problem und zwangen unsere Benutzer, die Zellen vor der Eingabe des Werts als "Text" zu formatieren . Auf diese Weise speichert Excel gerade Zahlen korrekt als Text. Wenn das Format danach geändert wird, ändert Excel nur die Art und Weise, wie der Wert angezeigt wird, aber nicht die Art und Weise, wie der Wert gespeichert wird, es sei denn, der Wert wird erneut eingegeben (z. B. durch Drücken der Eingabetaste in der Zelle).
Ob Excel den Wert korrekt als Text gespeichert hat oder nicht, wird durch das kleine grüne Dreieck angezeigt, das Excel in der linken oberen Ecke der Zelle anzeigt, wenn es glaubt, dass die Zelle eine Zahl enthält, aber als Text formatiert ist.
quelle
Wirke zu einem Int und mache dann einen
.toString()
. Es ist hässlich, aber es funktioniert.quelle