# Java Excel bestimmte Zellen auslesen (POI HSSF)



## Stefan2902 (22. Jul 2009)

Hallo,

ich würde gerne ganz bestimmte Zellen einer Exceldatei auslesen. Teile dieser Zellen kann ich über den Zellennamen identifizieren. Von den anderen habe ich Zeilen- und Spaltennummer.

Daher meine Fragen:

a) Wie kann ich den Zelleninhalt einer benamten Zelle auslesen?
b) Wie kann ich den Zelleninhalt einer Zelle auslesen, deren Zeile und Spalte ich kenne, ohne durch das gesamte Sheet zu iterieren.

Hier mein Code:


```
package com.eet.lexifi;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.poi.hssf.usermodel.HSSFName;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class ReadNominations {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		InputStream input = new FileInputStream("H:/LexiFi/test.xls");
		HSSFWorkbook wb = new HSSFWorkbook(input);
		HSSFSheet sheet = wb.getSheet("EON VPP Nomination");
		HSSFRow row = sheet.getRow(0);
		row.getCell(0).getNumericCellValue();

     
		HSSFName hssfn = wb.getName("customerid");
		System.out.print(hssfn.getRefersToFormula());
		
		
	}

}
```

Vielen Dank und Gruß
Stefan


----------



## SlaterB (22. Jul 2009)

b)
scheint einfach, du musst doch eh row und cell per Index auswählen, also genau die richtigen Indexe verwenden,

inwieweit benannte Zellen unterstützt werden, weiß ich nicht,
falls man wenigestens pro Zelle den Namen auslesen kann, würde es reichen, einmal über alle Zellen zu iterieren und eine Map Name -> Zelle aufzubauen


----------



## Stefan2902 (22. Jul 2009)

> b)
> scheint einfach, du musst doch eh row und cell per Index auswählen, also genau die richtigen Indexe verwenden,



Kannst du mir mal einen Beispielcode dafür schicken, wie ich eine Zelle über Zeile und Spalte referenzieren kann?


----------



## SlaterB (22. Jul 2009)

Cell gesucht = sheet.getRow(rowNumber).getCell(column);

evtl. +-1, 
und wenn du in Excel nur Spalte E kennst, dann musst du das erst in 5 umrechnen usw.


----------



## Stefan2902 (24. Jul 2009)

Danke SlaterB. Das hat schonmal prima geholfen.

Ich habe zu diesem Thema noch zwei Fragen:

1. Ich lese eine Excelzelle aus, in der der Wert 06:00 steht. Die Zelle ist formatiert als Custom hh:mm. Wenn ich den Inhalt dieser Zelle mit 


```
sheet.getRow(i + 33).getCell(4).toString()
```

auslese erhalte ich 31-Dec-1899. Wie ist es möglich den angezeigten Wert der Zelle (hier: 06:00) auszulesen?

2. Die folgenden Codezeilen


```
HSSFName hssfn = wb.getName("customerid");
        System.out.print(hssfn.getRefersToFormula());
```

liefern mir die Referenz auf eine Zelle - in Form von $F$3 - die benamt ist. Ist es darüber hinaus möglich festzustellen, welche workbook names vergeben sind? In Excel sieht man diese unter: Insert > Names > Define.

Vielen Dank und Gruß
Stefan


----------



## faetzminator (24. Jul 2009)

Zu 1.:
Falls du das Format per POI auslesen kannst (hab ich noch nie benötigt), kannst du den String evtl. mit SimpleDateFormat formatieren, in dem du jenes als Format verwendest. Ansonsten müsstest du es hardcoden.


----------



## SlaterB (24. Jul 2009)

was genau in der Excel-Datei steht und wie man es auslesen könnte, kann ich ansonsten auch nicht erahnen,
bitte Test-Excel-Datei und Test-Programm posten, möglichst kurz ohne irgendwelche anderen Sachen

zu benannten Zellen weiß ich immer noch nix, falls die Frage (auch) an mich gerichtet war


----------



## velaluka (24. Jul 2009)

Hallo,
wenn du die Zelle am Wickel hast und den Typen nicht kennst, musst du erst getCelltype aufrufen um danach die richtige Methode für den konkreten Typen aufzurufen.


----------



## Stefan2902 (24. Jul 2009)

Hier ein Minimalbeispiel


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

		InputStream input = new FileInputStream("H:/LexiFi/test123.xls");
		HSSFWorkbook wb = new HSSFWorkbook(input);
		HSSFSheet sheet = wb.getSheet("EON VPP Nomination");
		FileWriter writer = new FileWriter("H:\\LexiFi\\nominations.csv");

		System.out.print(sheet.getRow(2).getCell(3));
	}
```

Und im Anhang die Exceldatei.

Stefan


----------



## SlaterB (24. Jul 2009)

```
for (int k = 2; k < 5; k++)
        {
            System.out.println("\nk: " + k);
            HSSFCell cell = sheet.getRow(k).getCell((short)3);
            System.out.println("d: " + cell.getNumericCellValue());
        }
```


```
k: 2
d: 0.25

k: 3
d: 0.6666666666666666

k: 4
d: 0.0
```
6.00 entspricht 0.25
16.00 entspricht 0.66

die Umrechnung dürfte doch klar sein, oder nicht?

was du mit 31-Dec-1899 meinst, kann ich nicht nachvollziehen, die Zelle ausgegeben ergibt bei mir
org.apache.poi.hssf.usermodel.HSSFCell@12d3205
vielleicht ne andere POI-Version


----------



## Stefan2902 (24. Jul 2009)

Danke sehr. Ich erhalte die Doublewerte nun auch und kann diese mit folgendem Code auf einen Integer umwandeln:


```
int value = new Double(sheet.getRow(33).getCell(4).getNumericCellValue() * 24).intValue();
		
		System.out.println(value);
```

Hat jemand noch eine Idee, wie ich nun das folgende Format hh:mm:ss bzw. aus diesem Integer "zaubern" kann? 

Stefan


----------



## SlaterB (24. Jul 2009)

wenn du auf int rundest, können es ja nur ganze Stunden sein,
also
value +":00:00";
am Anfang evtl. noch ne 0, wenn value < 10,
fertig

oder etwas Date-mäßiger:
aus value*3600*1000 also long ein Date erstellen und an ein SimpleDateFormat zur Formatierung übergeben,
könnte allerdings aufwendig werden mit Zeitzone usw.

ich gehe dabei davon aus, dass die die Grundbegriffe von Date in Java bekannt sind (ms, 1970 usw), sonst im Lehrbuch nachzuschlagen


----------

