Wie kann ich numerische Zeichenfolge in Excel-Zellen als String lesen (keine Zahlen)?

StackOverflow https://stackoverflow.com/questions/1072561

  •  21-08-2019
  •  | 
  •  

Frage

  1. Ich habe Excel mit solchen Inhaltsdatei:

    • A1: Somestring

    • A2: 2

    Alle Felder werden auf String-Format.

  2. Wenn ich die Datei in Java unter Verwendung von POI lesen, es sagt, dass A2 in numerischem Zellenformat ist.

  3. Das Problem ist, dass der Wert in A2 2 oder 2,0 sein (und ich möchte, dass sie in der Lage sein zu unterscheiden), so kann ich nicht nur .toString() verwenden.

Was kann ich tun, um den Wert als Zeichenfolge zu lesen?

War es hilfreich?

Lösung

Ich hatte dasselbe Problem. Ich habe cell.setCellType(Cell.CELL_TYPE_STRING); vor dem String-Wert zu lesen, die das Problem gelöst, unabhängig davon, wie der Benutzer die Zelle formatierte.

Andere Tipps

Ich glaube nicht, dass wir diese Klasse hatten zurück, wenn Sie die Frage gestellt, aber heute gibt es eine einfache Antwort.

Was Sie tun möchten, ist verwenden, um die DataFormatter Klasse . Sie geben diese eine Zelle, und es tut sein Bestes Sie einen String zurück enthält, was Excel Sie für diese Zelle zeigen würde. Wenn Sie eine Zeichenfolge Zelle passieren, werden Sie die Zeichenfolge zurück. Wenn Sie es eine numerische Zelle mit Formatierungsregeln angewendet geben, wird das Zahlenformat auf ihnen basiert und geben Sie die Zeichenfolge zurück.

Für Ihren Fall, würde ich davon ausgehen, dass die numerischen Zellen eine ganze Zahl Formatierungsregel auf sich angewandt. Wenn Sie DataFormatter bitten, diese Zellen zu formatieren, wird es geben Sie in eine Zeichenfolge mit dem Integer-String zurück.

Beachten Sie auch, dass viele Leute schlagen vor, zu tun cell.setCellType(Cell.CELL_TYPE_STRING), aber die Apache POI JavaDocs ganz klar sagen, dass Sie diese nicht tun sollten! den setCellType Aufruf tun verliert Formatierung, wie der javadocs erklären der einzige Weg, um eine Zeichenfolge zu konvertieren mit der Formatierung verbleibenden ist die DataFormatter Klasse .

Der Code unten arbeitet für mich für jede Art von Zelle.

InputStream inp =getClass().getResourceAsStream("filename.xls"));
Workbook wb = WorkbookFactory.create(inp);
DataFormatter objDefaultFormat = new DataFormatter();
FormulaEvaluator objFormulaEvaluator = new HSSFFormulaEvaluator((HSSFWorkbook) wb);

Sheet sheet= wb.getSheetAt(0);
Iterator<Row> objIterator = sheet.rowIterator();

while(objIterator.hasNext()){

    Row row = objIterator.next();
    Cell cellValue = row.getCell(0);
    objFormulaEvaluator.evaluate(cellValue); // This will evaluate the cell, And any type of cell will return string value
    String cellValueStr = objDefaultFormat.formatCellValue(cellValue,objFormulaEvaluator);

}

würde ich die folgende Vorgehensweise empfehlen, wenn Zelltyp zu modifizieren ist unerwünscht:

if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
    String str = NumberToTextConverter.toText(cell.getNumericCellValue())
}

NumberToTextConverter kann double-Wert auf einen Text mit Hilfe von Excel-Regeln ohne Präzisionsverlust richtig konvertieren.

Wie bereits in den Orten JavaDocs erwähnt ( https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType%28int%29 ) nicht verwenden:

cell.setCellType(Cell.CELL_TYPE_STRING);

aber die Verwendung:

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

Weitere Beispiele auf http://massapi.com/class/da/DataFormatter.html

Ja, das funktioniert perfekt

empfohlen:

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

alt:

cell.setCellType(Cell.CELL_TYPE_STRING);

auch wenn Sie ein Problem haben mit einem Wert von cell mit der Formel abrufen, noch das funktioniert.

Versuchen:

new java.text.DecimalFormat("0").format( cell.getNumericCellValue() )

Wenn Sie die Nummer richtig formatiert werden.

Solange die Zelle im Textformat ist, bevor der Benutzer tippt in der Anzahl, POI können Sie den Wert als String erhalten. Ein Schlüssel ist, dass, wenn es ein kleines grünes Dreieck in der oberen linken Ecke der Zelle, die als Text formatiert ist, werden Sie in der Lage sein, seinen Wert als Zeichenfolge abgerufen werden (das grüne Dreieck erscheint, wenn etwas, das eine Zahl zu sein scheint wird in ein Textformat dazu gezwungen). Wenn Sie Text formatierten Zellen haben, die Zahlen enthalten, aber POI lassen Sie nicht diese Werte holen als Strings, gibt es ein paar Dinge sind, können Sie auf die Tabelle Daten tun, um das zu erlauben:

  • Klicken Sie doppelt auf die Zelle, so dass die Bearbeitungscursor in der Zelle vorhanden ist, dann auf Enter klicken (die nur eine Zelle zu einem Zeitpunkt durchgeführt werden kann).
  • Verwenden Sie die Excel 2007 Textkonvertierungsfunktion (die auf einmal auf mehreren Zellen durchgeführt werden kann).
  • die beanstandeten Werte an einem anderen Ort ausgeschnitten, um die Kalkulationstabelle Zellen als Text formatiert, dann repaste die vorher ausgeschnittenen Werte als Unformatted Werte wieder in den richtigen Bereich.

Eine letzte Sache, die Sie tun können, ist, dass, wenn Sie POI verwenden Daten aus einer Excel 2007-Tabelle zu erhalten, können Sie die Zelle Klasse ‚getRawValue ()‘ Methode. Diese kümmert sich nicht darum, was das Format ist. Es wird einfach eine Zeichenkette mit den Rohdaten zurück.

Wenn wir die MS Excel numerischen Zellenwert mit Apache POI Bibliothek lesen, lesen sie es als numerische. Aber irgendwann wollen wir es als Zeichenfolge (z Telefonnummern, etc.) zu lesen. Dies ist, wie ich tat es:

  1. Setzen Sie eine neue Spalte mit der ersten Zelle = CONCATENATE ( "!", D2). Ich gehe davon aus D2 Zellen-ID Ihrer Telefonnummer Spalte ist. Ziehen Sie neue Zelle bis zu beenden.

  2. Nun, wenn Sie die Zelle mit POI lesen, es wird die Formel anstelle von berechnetem Wert lesen. Nun gehen Sie wie folgt:

  3. Fügen Sie eine weitere Spalte

  4. Wählen Sie komplette Spalte in Schritt 1 erstellt und wählen Sie Bearbeiten> Kopieren

  5. Nach oben Zelle der Spalte in Schritt 3 erstellt und Wählen Sie Bearbeiten-> Inhalte einfügen

  6. Im geöffneten Fenster wählen Sie "Werte" Optionsfeld

  7. Wählen Sie "OK"

  8. Jetzt mit POI API liest ... nach in Java zu lesen ... entfernen Sie einfach das erste Zeichen d "!"

Ich habe auch ein ähnliches Problem auf einem Datensatz von Tausenden von Zahlen hat und ich denke, dass ich eine einfache Art und Weise zu lösen, gefunden zu haben. Ich brauchte das Apostroph vor einer Reihe eingefügt zu erhalten, so dass eine separate DB Import immer die Zahlen als Text sieht. Vor diesem die Zahl 8 würde als 8.0 importiert werden.

Lösung:

  • Halten Sie alle Formatierungen als General.
  • Hier sind Ich gehe davon aus Zahlen in Spalte gespeichert A ab Zeile 1.
  • in der "in Spalte B Setzen und kopieren Sie so viele Zeilen wie nötig. Nichts erscheint in dem Arbeitsblatt, sondern auf der Zelle klicken, können Sie die apostophe in der Bearbeitungsleiste sehen.
  • In Spalte C: = B1 & A1.
  • Wählen Sie alle Zellen in Spalte C und führen Sie die Werte Option, um eine Paste Special in Spalte D verwendet wird.

Hey Presto alle Zahlen, sondern als Text gespeichert.

getStringCellValue gibt Number, wenn der Zelltyp numerisch ist. Wenn Sie nicht über den Zellentyp-String ändern mögen, können Sie dies tun.

String rsdata = "";
try {
    rsdata = cell.getStringValue();
} catch (NumberFormatException ex) {
    rsdata = cell.getNumericValue() + "";
}

Viele dieser Antworten verweisen alte POI Dokumentation und Klassen. In dem neuesten POI 3.16 Zelle mit den int-Typen veraltet ist

Cell.CELL_TYPE_STRING

Statt der Zelltyp Enum können verwendet werden.

CellType.STRING 

Nur sicher sein, Ihre pom mit der poi Abhängigkeit sowie die Poi-OOXML Abhängigkeit zu der neuen 3.16-Version zu aktualisieren, sonst werden Sie weiterhin Ausnahmen erhalten. Ein Vorteil dieser Version ist, dass Sie den Zellentyp zu dem Zeitpunkt angeben, kann die Zelle erzeugt Beseitigung aller zusätzlichen Schritte in früheren Antworten beschrieben:

titleRowCell = currentReportRow.createCell(currentReportColumnIndex, CellType.STRING);

würde ich viel lieber geht die Route der Antwort des wil oder Vinayak Dornala leider bewirkt sie meine Leistung viel zu viel. Ich ging für eine HACKY Lösung von implizitem Casting:

for (Row row : sheet){
String strValue = (row.getCell(numericColumn)+""); // hack
...

ich nicht vorschlagen, dass Sie dies tun, für meine Situation war es wegen der Art, wie das System funktioniert und ich hatte eine zuverlässige Datenquelle.

Fußnote:     numericColumn Ist ein int, die sich beim Lesen der Header der Datei verarbeitet erzeugt wird.

public class Excellib {
public String getExceldata(String sheetname,int rownum,int cellnum, boolean isString) {
    String retVal=null;
    try {
        FileInputStream fis=new FileInputStream("E:\\Sample-Automation-Workspace\\SampleTestDataDriven\\Registration.xlsx");
        Workbook wb=WorkbookFactory.create(fis);
        Sheet s=wb.getSheet(sheetname);
        Row r=s.getRow(rownum);
        Cell c=r.getCell(cellnum);
        if(c.getCellType() == Cell.CELL_TYPE_STRING)
        retVal=c.getStringCellValue();
        else {
            retVal = String.valueOf(c.getNumericCellValue());
        }

Ich habe versucht und es funktionierte für mich

Wir hatten das gleiche Problem und gezwungen, unsere Benutzer die Zellen als ‚Text‘ zu formatieren vor , um den Wert einzugeben. Auf diese Weise Excel speichert richtig, auch Zahlen als Text. Wenn das Format geändert wird danach nur Excel die Art und Weise ändert sich der Wert angezeigt wird, aber nicht die Art und Weise ändert sich der Wert gespeichert wird, wenn der Wert erneut eingegeben wird (beispielsweise durch die Eingabetaste drücken, wenn in der Zelle).

Ob oder nicht korrekt gespeichert Excel den Wert als Text durch das kleine grüne Dreieck gekennzeichnet ist, dass Excel zeigt in der linken oberen Ecke der Zelle, wenn sie die Zelle denken enthält eine Nummer, aber als Text formatiert.

Sie das Excel-Arbeitsblatt in irgendeiner Weise steuern Sie? Gibt es eine Vorlage die Benutzer haben für Sie die Eingabe zu geben? Wenn ja, können Sie Codeformat die Eingabezellen für Sie haben.

Es sieht aus wie dies kann nicht in der aktuellen Version von POI erfolgen, basierend auf der Tatsache, dass dieser Fehler:

https://issues.apache.org/bugzilla/show_bug.cgi? id = 46136

steht noch aus.

cell.setCellType (Cell.CELL_TYPE_STRING); für mich adaequat

gecastet in einem int tun dann ein .toString(). Es ist hässlich, aber es funktioniert.

Das ist für mich perfekt gearbeitet.

Double legacyRow = row.getCell(col).getNumericCellValue();
String legacyRowStr = legacyRow.toString();
if(legacyRowStr.contains(".0")){
    legacyRowStr = legacyRowStr.substring(0, legacyRowStr.length()-2);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top