# Aus Excel Tabelle lesen und Werte in Array speichern



## MoinMoin (27. Aug 2012)

Hallo liebe Java-Forum Community,

ich bin neu hier und trete gleich mit einer Problemstellung an euch heran.

Ich habe eine Aufgabenstellung bekommen, die wiefolgt ist:

Es gibt einen Webservice, wo Vorgänge hinterlegt sind. Meine Aufgabe ist es, einige dieser Vorgänge zu löschen. Dafür gibt es eine Excel Tabelle, die mir Vorgangs IDs und den dazugehörigen Referenzschlüssel übergibt. Mit diesen Daten greife ich auf die Vorgänge zu und lösche diese. 
Bis jetzt habe ich auch schon einen Client geschrieben, der auf den Webservice zugreift und nach Vorgängen suchen kann. Jetzt kommt die Problematik: 
Da ich noch Student bin und gerade erst die Grundlagen der OOP erlernt habe, weiß ich nicht 
wie ich folgendes implementiere:

1. Connect to Webservice (läuft per Client)
2. Öffne Excel Dokument (läuft, aber bis jetzt kann ich nur in der Excel-Tabelle selbst löschen, statt zu lesen und in ein Array zu speichern)
3. Nehme erste VorgangsID und ersten Referenzschlüssel (Speichere in Array oder Arraylist ???)
4. Übertragen an Webservice -> Vorgang existent?
5. Ja -> Vorgang löschen
6. Nehme nächste VorgangsID und nächsten Referenzschlüssel
7. Fahre mit schritt ( 4. ) fort, solange Excel-Tabelle not null.

Dies soll alles automatisch passieren und es soll nicht jede VorgangsID und jeder ReferenzSchlüssel per Hand eingegeben werden.

Ich habe mich schon mit *APACHE POI* vertraut gemacht und arbeite so auf dem Excel Dokument. 

Ich hoffe ihr könnt mir da ein wenig weiterhelfen!

Lieben Gruß


----------



## Templarthelast (27. Aug 2012)

Warum erstellt du kein Objekt für jede excel zeile und speicherst diese in einer Liste. 

Dann durchläufst du diese Liste und falls der eintrag existierst, löscht du den Eintrag.


----------



## ARadauer (27. Aug 2012)

Ja wir können sicher weiterhelfen?
Wie ist deine Frage?

Wie du über die Zeilen von einem Excel mit Apache Poi iterierst? Welche Version nimmst du die alte? oder die neu für xslx?


----------



## MoinMoin (27. Aug 2012)

Danke erstmal für die schnelle Antwort.

Ich habe die aktuellste Version von Apache Poi installiert. Nochmal zur Verfeinerung meiner Frage:

Ich bekomme eine Excel-Tabelle mit Vorgangs ID's und einem Referenzschlüssel. Mit diesen Werten greife ich auf Vorgänge zu, die auf einer Datenbank in einem angebotenem Webservice zugreifen. Mit Hilfe der IDs und der Referenzschlüssel bin ich berechtigt, diese Vorgänge zu löschen. Mal ein Auszug meines Clients :


```
public static void main(String[] args) throws Exception{
	       DefaultHttpClient httpclient = new DefaultHttpClient();
	        try {
	            HttpHost target = new HttpHost("XXXXXXXXX", 80, "http");
	        	HttpEntity entity = null;
	            HttpPost req = new HttpPost("XXXXXXXXXXX");

	            String username = "XXXXXXX";
	            String password = "XXXXXXX";
	            String authorizationHeaderValue = username + ":" + password;
	            BASE64Encoder encoder = new BASE64Encoder();
	            authorizationHeaderValue = "Basic " + encoder.encode(authorizationHeaderValue.getBytes());
	            Header authorizationHeader = new BasicHeader("Authorization", authorizationHeaderValue);
	            req.addHeader(authorizationHeader);
	            
	            String soapActionHeaderValue = "XXXXXXXXXX";
	            Header soapActionHeader = new BasicHeader("SOAPAction", soapActionHeaderValue);
	            req.addHeader(soapActionHeader);
	            
	            InputStream is = com.generali.test.Main.class.getClassLoader().getResourceAsStream("templateRequest");
	            String templateString = IOUtils.toString(is, "UTF-8");
	            
	            String hisVorgangsIdentifikation = JOptionPane.showInputDialog("Geben Sie bitte eine VorgangsID ein: ");
	            String referenzschluesselMeldung = JOptionPane.showInputDialog("Geben Sie einen Referenzschlüssel zur Bestätigung der Löschung an: " );
	            String referenzschluesselLoeschung = "L1";
	            String content = MessageFormat.format(templateString, hisVorgangsIdentifikation, referenzschluesselMeldung, referenzschluesselLoeschung);
	            
	            StringEntity stringEntity = new StringEntity(content);
	            stringEntity.setContentType("application/xml");
	            req.setEntity(stringEntity);

	            entity = req.getEntity();
	            if (entity != null) {
	                System.out.println(EntityUtils.toString(entity));
	            }

	            System.out.println("executing request to " + target);
	            HttpResponse rsp = httpclient.execute(target, req);

	            System.out.println("----------------------------------------");
	            System.out.println(rsp.getStatusLine());
	            Header[] headers = rsp.getAllHeaders();
	            for (int i = 0; i < headers.length; i++) {
	                System.out.println(headers[i]);
	            }
	            System.out.println("----------------------------------------");

	            entity = rsp.getEntity();
	            if (entity != null) {
	                System.out.println(EntityUtils.toString(entity));
	            }

	        } finally {
	            // When HttpClient instance is no longer needed,
	            // shut down the connection manager to ensure
	            // immediate deallocation of all system resources
	            httpclient.getConnectionManager().shutdown();
	        }	
	 	}
```

Hier hab ich es momentan so eingerichtet, dass ich einen bestimmten Vorgang mittels ID und Referenzschlüssel manuell suche. Dies soll aber automatisiert passieren, also mit Hilfe der Excel Tabelle. 

- ID und Schlüssel aus Excel Tabelle nehmen
- Werte an den Webservice schicken
- Vorgang löschen
- Nächste ID und Schlüssel nehmen
- Werte an Webservice schicken
- Vorgang löschen
- alles solange, bis die Excel Tabelle durch ist

und genau da liegt mein Problem. Wie lese ich die einzelnen Werte aus der Excel Tabelle, speichere sie und schicke sie an den Webservice? Welche Vorgehensweise empfielt sich da? 

Bin in meinem Studium noch nicht so weit, und da mich gerade in einem Praktikum befinde und diese von mir gerne eine Lösung dieser Aufgabenstellung hätten, möchte ich sie natürlich nicht enttäuschen! 

Lieben Gruß !


----------



## Templarthelast (27. Aug 2012)

Ich würde dir statt POI das jexcel framework vorschlagen, solange es sich um .xls Datein handelt. 

Das Auslesen funktioniert so wie in diesem Tutorial beschrieben. 


```
List<AbfrageObjekt> objekte = new ArrayList()<>;
for(int i=0; i < sheet.getRows(); i++) {
AbfrageObjekt ab = new AbfrageObjekt();
ab.setReferenzId(sheet.getCell(i, 1)); // Wenn die ReferenzId in der 2. Spalten liegen würde;
ab.setSchluessel(sheet.getCell(i, 2)); 
objekte.add(ab);
}

// Führe Webserviceanfrage mit List durch

for(AbfrageObjekt a : objekte) {
if(gefunden) {
objekte.remove(a);
}
 // ...
}
```

AbfrageObjekt.java


```
public class AbfrageObjekt() {
private int referenzId;
private String schluessel;

// Getter & Setter
```


----------



## MoinMoin (27. Aug 2012)

ich probiers mal eben aus ! Danke Templarthelast ...


----------



## MoinMoin (27. Aug 2012)

Bei mir kommt jetzt immer die fehlermeldung: ArrayOutOfBounds...
So wie ich deinen Code verstanden habe, nimmste dir jede Zeile vor, nimmst dort dann die erste und zweite Zelle und speicherst diese. Nur warum dann der Fehler.. Er geht doch eigentlich soweit, bis keine Rows mehr belegt sind. Aber nur jeweils die erste und zweite Zelle. Geht er da etwa weiter?


Auszug des Codes: 


```
.....................

                                      Workbook workbook = Workbook.getWorkbook(new File("d:/test.xls")); 

	    		Sheet sheet = workbook.getSheet(0);
	    		
	    		List<AbfrageObjekt> objekte = new ArrayList<AbfrageObjekt>();
	    		
	    		AbfrageObjekt ao = new AbfrageObjekt();
	    		
	    		for (int i=0; i < sheet.getRows(); i++) {
	    		ao.setVorgangsID(sheet.getCell(i, 1)); // Wenn die VorgangsId in der 2. Spalten liegen würde;
	    		ao.setSchluessel(sheet.getCell(i, 2)); 
	    		objekte.add(ao);	            
	    		}   

	            
	            Cell hisVorgangsIdentifikation =  ao.getVorgangsID(); 
	            Cell referenzschluesselMeldung = ao.getSchluessel();
	            String referenzschluesselLoeschung = "L1";

                 ........................
```

Vielen Dank bis dahin,  Templar !


----------



## Templarthelast (27. Aug 2012)

Du solltest ein neues Objekt in der Schleife erzeugen. Es macht hier keinen Unteschied, könnte dir aber helfen, falls du Funktionalität im Konstruktor der AnzeigeObjektklasse einbaust. Ansonsten sieht das schonmal ganz gut aus.


----------



## SlaterB (27. Aug 2012)

die Spalten zählt man mit 0, 1, 2, ..


----------



## MoinMoin (27. Aug 2012)

Danke euch, ich werd mal noch ein wenig daran rumbauen und mich danach nochmal melden! :rtfm:


----------



## Templarthelast (28. Aug 2012)

Falls du nochmal auf ein solches (eigentlich primitves) Problem stoßen solltest, würde ich an deiner Stelle, mir einfach die Zeit nehmen, um kurz Google danach zu fragen. 

z.B. bei "read xls java" bekomme ich direkt einen Tutorial link von Lars Vogel. 

Dieser Beitrag soll keine Kritik an deiner Frage sein, sondern dir nur eine Möglichkeit zeigen, ohne direkte Hilfe Probleme lösen zu können.


----------



## MoinMoin (28. Aug 2012)

Es ist ja nicht so, dass ich nicht im Google Jungle war .. Ich habe Tage damit verbracht um zu suchen. Nur leider erstmal nach Tutorials von Apache POI zu dieser Sache. Aber ich finde, dass man mit JExcel schon etwas angenehmer arbeiten kann. Ich danke dir für den Tipp, versuche durch den Code mal durchzusteigen. Da es hier in der Firma immernoch keinen Testfall gibt,
hab ich also noch Zeit etwas rumzuwerkeln. 

Vielleicht kannst du mir ja dann bei meiner zweiten Frage helfen.. und zwar : 

Wenn ich es jetzt geschafft habe, dass er die Spalten einliest und sich zum Webservice connected um es zu löschen, wie lösche ich diesem moment dann dieses gefundene File? Das hab ich auch nochnicht implementiert.  Kennst du dich damit vielleicht aus?

Vielen Dank bis dahin Templar...

Lieben Gruß !


----------



## Templarthelast (28. Aug 2012)

Da du keinen gleichzeitigen Schreib- und Lesezugriff haben kannst, wäre es wohl das einfachste die Datei mit den noch vorhandenen Daten zu überschreiben. Falls deine xls besondere Formatierung haben, kannst du eine muster.xls laden. 
	
	
	
	





```
Workbook.createWorkbook(new File(Speicherdatei), writeableworkbook)
```


----------



## MoinMoin (28. Aug 2012)

Ich glaub ich hab meine Aufgabenstellung etwas falsch erläutert.. Ich soll nicht die VorgangsIDs und den Schlüssel in der Excel Tabelle selbst löschen, sondern den Vorgang, den ich mit der VorgangsID und dem Schlüssel erreiche. 

Man muss sich vorstellen, 

- Es gibt in einer Datenbank einen Vorgang, auf den ich mit dem Webservice zugreifen kann.
- Um auf diesen zuzugreifen, benötige ich dessen Vorgangs-ID und den Referenzschlüssel.
- Jeder Vorgang hat eine ID und einen Schlüssel. Der Schlüssel ist dazu da, um zu kontrollieren, ob es auch wirklich der richtige Vorgang ist..
- Beispiel:    In der Excel Tabelle befindet sich eine VorgangsID "1234" und ein Schlüssel "5678"
                 Jetzt log ich mich auf den Webservice ein.. Der sucht nach dem Vorgang mit der VorgangsID "1234"... wenn er den 
                 gefunden hat, checkt er den Schlüssel.. Wenn dieser auch stimmt, komme ich zu dem Punkt ihm zu sagen,
Vorgang auf der Datenbank löschen!!

-das geht jetzt solange weiter, bis ich keine VorgangsID's und Schlüssel in der Excel Tabelle habe.

Und genau darin besteht mein zweites Problem.. Die Implementierung des Lösch-Algorithmus.. 

Lieben Gruß,


----------



## Templarthelast (28. Aug 2012)

Vorgang heißt Procedure oder Tabelleneintrag?


----------



## SlaterB (28. Aug 2012)

> Ich glaub ich hab meine Aufgabenstellung etwas falsch erläutert..
das kann man wohl sagen, 
erst geht es um das Auslesen von Excel,
dann willst du unmissverständlich die Excel-Datei auf der Festplatte löschen
nun geht es um Datenbankzugriff

es ist nicht grad sinnvoll, hier in einem Theme mit Überschrift 'Excel' noch viele andere Themen zu vermischen,
führe geistig eine Trennung der Aufgaben ein, ein Punkt ist das Einlesen von Information aus Excel,

danach kommt vielleicht die Kommunikation mit deinem WebService, dafür ist vollkommen egal woher die Daten kommen
oder was der WebService damit macht

in einer DB Daten zu löschen ist wiederum unabhängig vom Ort des ganzen, ob WebService oder normales Java-Programm,
noch weniger interessiert, woher die Id stammt die aktuell gelöscht wird, es ist einfach nur 'Id löschen', ein Problem für sich,
auch mit Schleifen und Gesamtvorgang aufpassen, gehört manchmal dazu, manchmal eher egal

natürlich kannst du alles hier fragen, zuviele Themen nerven auch, 
aber wundere dich nicht wenn keiner mitkommen sollte

überspitzt: es gibt einen Datenbank-Bereich mit vielen Datenbank-Experten, die nur auf Fragen warten,
aber hier bei Excel wohl kaum reinschauen 

Java-Basics als Bereich passt sowieso gar nicht, ich verschiebe jetzt


----------

