Lesen aus einem Excel File

rafi072001

Mitglied
Hi ich benötige Hilfe bei meinem Code.

Alle anderen Methoden außer die findAdressByName funktionieren. Es wird die ganze Zeit der leere String returned, aber wich weiß nicht warum..

[CODE lang="java" title="Main"]package utils;

public class Main {

public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub


ExcelUtils eu = new ExcelUtils("./data/Test.xlsx");
eu.findAddressByName("Henry");
eu.getCellData();

}

}[/CODE]
[CODE lang="java" title="ExcelUtils"]package utils;

import java.io.File;
import java.io.IOException;

import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


public class ExcelUtils {

static XSSFWorkbook workbook;
static XSSFSheet sheet;


public ExcelUtils(String excelPath) throws IOException{

workbook = new XSSFWorkbook(excelPath);
sheet = workbook.getSheet("Tabelle1");

}







public static void getCellData() throws IOException{




DataFormatter formatter = new DataFormatter();

Object value = formatter.formatCellValue(sheet.getRow(1).getCell(0));

System.out.println(value);





}



public static void getRowCount() throws IOException {




int rowCount = sheet.getPhysicalNumberOfRows();
System.out.println("Number of Row Count" + rowCount);






}



public static String findAddressByName(String nameToSearch) throws IOException {



for (int rowIndex = 0; rowIndex < sheet.getLastRowNum(); rowIndex++) {
XSSFRow row = sheet.getRow(rowIndex);
if (row != null && row.getCell(0).getStringCellValue().equals(nameToSearch)) {
return row.getCell(1).getRawValue();

}
}
return "";
}
}
[/CODE]
 
Was die Methode eu.findAddressByName("Henry"); zurück gibt, weisst Du ja nicht, denn mit der Rückgabe machst du ja nichts!

Und das, was Du dann ausgibst (getCellData), ist einfach nur die erste Zelle in der zweiten Zeile. Das ist vollkommen unabhängig von der ersten Methode ....

Generell sollte man bei Methoden, die etwas zurück geben, dies auch speichern / verwerten.
Bei den Namen sollte man auch aufpassen: getIrgendwas sollte Irgendwas zurück geben. Da ist also ein Typ von void falsch, Das wäre dann eher ein printIrgendwas, wenn Irgendwas nur ausgegeben wird (Bezieht sich auf getRowCount).
 
Was die Methode eu.findAddressByName("Henry"); zurück gibt, weisst Du ja nicht, denn mit der Rückgabe machst du ja nichts!

Und das, was Du dann ausgibst (getCellData), ist einfach nur die erste Zelle in der zweiten Zeile. Das ist vollkommen unabhängig von der ersten Methode ....

Generell sollte man bei Methoden, die etwas zurück geben, dies auch speichern / verwerten.
Bei den Namen sollte man auch aufpassen: getIrgendwas sollte Irgendwas zurück geben. Da ist also ein Typ von void falsch, Das wäre dann eher ein printIrgendwas, wenn Irgendwas nur ausgegeben wird (Bezieht sich auf getRowCount).
Oh mann. Stimmt das habe ich voll vergessen
 
Was die Methode eu.findAddressByName("Henry"); zurück gibt, weisst Du ja nicht, denn mit der Rückgabe machst du ja nichts!

Und das, was Du dann ausgibst (getCellData), ist einfach nur die erste Zelle in der zweiten Zeile. Das ist vollkommen unabhängig von der ersten Methode ....

Generell sollte man bei Methoden, die etwas zurück geben, dies auch speichern / verwerten.
Bei den Namen sollte man auch aufpassen: getIrgendwas sollte Irgendwas zurück geben. Da ist also ein Typ von void falsch, Das wäre dann eher ein printIrgendwas, wenn Irgendwas nur ausgegeben wird (Bezieht sich auf getRowCount).
Hallo,

ich habe nun nochmal um meinem Methodenaufruf eine System.out.println gebaut. Jedoch kommt immer noch kein Rückgabewert.
 
Dann gib uns doch bitte die genauen Details:
- Wie sieht Dein Code jetzt genau aus?
- Wie sieht die Datei aus, auf der Du das anwendest?
 
Dann gib uns doch bitte die genauen Details:
- Wie sieht Dein Code jetzt genau aus?
- Wie sieht die Datei aus, auf der Du das anwendest?122.PNG
Tut mir leid, dass ich so spät antworte... mir wurde irgendwie nicht angezeigt, dass ich eine Nachricht bekommen habe.
Der Aufruf sieht nun so aus. Der Rest ist immer noch gleich.




[CODE lang="java" title="Main"]package utils;

import java.io.IOException;

public class Main {

public static void main(String[] args) throws IOException {


ExcelUtils eu = new ExcelUtils("./data/Test.xlsx");
System.out.println( eu.findAddressByName("Henry"));

// TODO Auto-generated method stub

}

}
[/CODE]
 
Bitte immer das Verhalten, das Du bekommen hast, genau beschreiben!

Das Problem bei dem Code ist also, dass Du keinen Ort ausgegeben bekommst sondern eine Zahl.

Dies ist einfach erklärbar, wenn man sich einmal die Beschreibung von getRawValue anschaut:
"If the cell contains a string, then this value is an index into the shared string table, pointing to the actual string value. Otherwise, the value of the cell is expressed directly in this element. Cells containing formulas express the last calculated result of the formula in this element."

Du willst ja Strings auslesen - und du hast es ja in der Zeile drüber auch schon richtig gemacht. Nutz einfach auch dort getStringCellValue.
 
Bitte immer das Verhalten, das Du bekommen hast, genau beschreiben!

Das Problem bei dem Code ist also, dass Du keinen Ort ausgegeben bekommst sondern eine Zahl.

Dies ist einfach erklärbar, wenn man sich einmal die Beschreibung von getRawValue anschaut:
"If the cell contains a string, then this value is an index into the shared string table, pointing to the actual string value. Otherwise, the value of the cell is expressed directly in this element. Cells containing formulas express the last calculated result of the formula in this element."

Du willst ja Strings auslesen - und du hast es ja in der Zeile drüber auch schon richtig gemacht. Nutz einfach auch dort getStringCellValue.

Hi , stimmt.

Ehrlich gesagt finde ich es gar nicht so blöd eine Adresse zurück zu bekommen. Wie müsste ich dann aber den Rückgabetyp der der Methode festlegen ?
 
Auf StackOverflow habe ich noch folgendes gefunden:
Das Problem ist, dass es bei mir den Datentyp cell nicht gibt. Ich habe auch jegliche Sachen importiert die mir vorgeschlagen wurde. Muss ich da manuell irgendwas importieren ? Wenn ja wie funktioniert das ?

Java:
private static int findRow(HSSFSheet sheet, String cellContent) {
    for (Row row : sheet) {
        for (Cell cell : row) {
            if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
                if (cell.getRichStringCellValue().getString().trim().equals(cellContent)) {
                    return row.getRowNum(); 
                }
            }
        }
    }               
    return 0;
}
 
Ehrlich gesagt finde ich es gar nicht so blöd eine Adresse zurück zu bekommen. Wie müsste ich dann aber den Rückgabetyp der der Methode festlegen ?
Was nützt Dir denn die interne Adresse des Strings in der internen String Tabelle des Dokumentes?

Außen in Deinem Code ist das doch nicht wirklich von Wert.

Und was den anderen Code angeht: Zumindest in der Apache POI Version würde ich etwas wie dies erwarten:

Java:
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;



    private static int findRow(HSSFSheet sheet, String cellContent) {
        for (Row row : sheet) {
            for (Cell cell : row) {
                if (cell.getCellType() == CellType.STRING) {
                    if (cell.getRichStringCellValue().getString().trim().equals(cellContent)) {
                        return row.getRowNum();
                    }
                }
            }
        }
        return -1;
    }

Aber da hast Du auch extrem viel mit static in Deinem Code - das ist ja unnötig. So eine Textklasse könnte also so aussehen:
Java:
import java.io.File;
import java.io.IOException;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;



public class ExcelUtils {
    XSSFWorkbook workbook;
    XSSFSheet sheet;

    public ExcelUtils(String excelPath) throws IOException{
        workbook = new XSSFWorkbook(excelPath);
        sheet = workbook.getSheet("Tabelle1");
    }

    public static void main(String[] args) throws Exception {
        ExcelUtils eu = new ExcelUtils("./Addressen.xlsx");
        System.out.println(eu.findRow("Henry"));
    }

    public String findAddressByName(String nameToSearch) {
        for (int rowIndex = 0; rowIndex < sheet.getLastRowNum(); rowIndex++) {
            XSSFRow row = sheet.getRow(rowIndex);
            if (row != null && row.getCell(0).getStringCellValue().equals(nameToSearch)) {
                System.out.println("Found: " + row.getCell(1).getStringCellValue());
                System.out.println("Raw: " + row.getCell(1).getRawValue());
                return row.getCell(1).getRawValue();
            }
        }
        return "";
    }

    private int findRow(String cellContent) {
        for (Row row : sheet) {
            for (Cell cell : row) {
                if (cell.getCellType() == CellType.STRING) {
                    if (cell.getRichStringCellValue().getString().trim().equals(cellContent)) {
                        return row.getRowNum();
                    }
                }
            }
        }
        return -1;
    }
}

Edit: Ach ja - ich hatte gar nicht erwähnt: Der default Wert, der zurück gegeben wird, wurde von 0 auf -1 geändert. 0 könnte eine valide Rückgabe sein wenn der Text in der ersten Zeile gefunden wird ...
 

Neue Themen


Zurück
Oben