# Variable ändern bei jedem Schleifendurchlauf



## MarcoRolex (13. Jun 2016)

int zeile = 4;
int spalte = 0;

for(int a = 1; a <= 10; a++)

{

Label time = new Label(spalte, zeile, getTime);

wsheet.addCell(time);

wworkbook.write();

zeile = zeile + 1;

Thread.sleep(10000);

}
Meine Frage jetzt:

Gibt es einen Weg, den Labelname "time" bei jedem Schleifendurchlauf zu ändern?

Bsp.:


Druchlauf --> time

Durchlauf --> time2
usw...


----------



## KaffeeFan (13. Jun 2016)

1. Packe deinen Code zukünftig bitte in Code-Tags (Einfügen-Code-Java) 
	
	
	
	





```

```
2. Wofür willst du den Variablennamen ändern?

Gruß
Luk


----------



## MarcoRolex (13. Jun 2016)

Achso okay.

Also ich muss für jeden Excel Zelleneintrag ein Label definieren. Und jedes Label braucht einen eindeutigen Namen. Jetzt möchte ich das halt mit einer for-Schleife beschleunigen. Da aber der Variablename beim nächsten Durchlauf gleich bleibt, funktioniert das ganze nicht.


----------



## KaffeeFan (13. Jun 2016)

Was hast du denn später mit den Labels vor?
Wie wäre es wenn du in jedem Schleifendurchlauf dein Label in eine ArrayList packst?
Dann könntest du an anderer Stelle auf jedes deiner Labels zugreifen...

Gruß
Luk


----------



## MarcoRolex (13. Jun 2016)

Ich möchte im Excel eine Spalte mit der aktuellen Uhrzeit und eine zweite mit der gemessenen Temperatur. Diese Uhrzeiten stehen untereinander und für jede Zelle braucht es eben ein eigenes Label.


----------



## KaffeeFan (13. Jun 2016)

MarcoRolex hat gesagt.:


> für jede Zelle braucht es eben ein eigenes Label.


Warum? Weil du mit den Variablen später noch was machen willst?
Es reicht doch wenn du bei jedem Schleifendurchlauf time überschreibst und andere Parameter mitgibst?


----------



## MarcoRolex (13. Jun 2016)

Ja von der Logik her ist es schon richtig was du sagst. Aber praktisch funktioniert es irgendwie nicht.


----------



## KaffeeFan (13. Jun 2016)

KaffeeFan hat gesagt.:


> Warum? Weil du mit den Variablen später noch was machen willst?


----------



## MarcoRolex (13. Jun 2016)

Nein mit den Variablen passiert nichts mehr. Nach der for-Schleife ist der Eintrag im Excel Blatt gemacht und wird auch nicht mehr geändert.


----------



## KaffeeFan (13. Jun 2016)

```
for(int i = 0; i<10; i++)
          {
            Label label = new Label(spalte, zeile, getTime);
            wsheet.addCell(label);
            wworkbook.write();
            zeile++;
          }
```

Dann mach es doch einfach so.


----------



## MarcoRolex (13. Jun 2016)

Nein das funktioniert so nicht...
Beim nächsten Schleifendurchlauf kann kein neues Label erstellt werden, weil der Name immer noch "label" bleibt.


----------



## KaffeeFan (13. Jun 2016)

MarcoRolex hat gesagt.:


> Beim nächsten Schleifendurchlauf kann kein neues Label erstellt werden,


sagt wer?


----------



## MarcoRolex (13. Jun 2016)

Ich habs ausprobiert!


----------



## X5-599 (13. Jun 2016)

Es liegt nicht daran, dass kein neues Label erzeugt weden kann. Du hast lediglich vergessen die Koordinaten des Labels in der Schleife zu verändern. Du erzeugst zehn Labels mit der selben: spalte, zeile. Diese Variablen musst du anpassen.


----------



## MarcoRolex (13. Jun 2016)

Die Spalte bleibt absichtlich immer gleich.
Die Zeile muss verändert werden hast du recht.
Aber wenn du das Bild oben anschaust habe ich dies schon berücksichtigt.


----------



## X5-599 (13. Jun 2016)

Stimmt. Hab ich überlesen.


----------



## Henne079 (13. Jun 2016)

Du kannst ja mal testen ob es einen Unterschied macht, wenn du deinen Code zu diesem änderst.

```
wsheet.addCell(new Label(spalte, zeile, getTime));
```


----------



## JStein52 (13. Jun 2016)

MarcoRolex hat gesagt.:


> Beim nächsten Schleifendurchlauf kann kein neues Label erstellt werden


Also es wird sicher bei jedem Schleifendurchlauf ein neues Label-Objekt erstellt. Dass dann nur in einer Zeile was steht hat bestimmt andere Gründe und hängt sicher mit dem ganzen wsheet/workbook-Handling zusammen. Da kenne ich mich aber nicht aus. Ist der eine Wert der drin  steht eigentlich der erste aus der Schleife oder der letzte ?


----------



## Harry Kane (13. Jun 2016)

Ich habe gerade in der API doc von POI gestöbert. Weder die Klasse org.apache.poi.hssf.usermodel.HSSFSheet noch die Klasse org.apache.poi.xssf.usermodel.XSSFSheet hat eine Methode addCell, und eine Klasse Label habe ich im Paket auch nicht gesehen.
Mir ist schleierhaft, mit welcher Art von Objekten du da eigentlich hantierst. Zeig doch mal einen komplettes, kompilierbares Beispiel inkl. Importe.


----------



## JStein52 (13. Jun 2016)

Harry Kane hat gesagt.:


> Mir ist schleierhaft, mit welcher Art von Objekten du da eigentlich hantierst.


Ja genau. Ich glaube er hat da ein paar eigene Klassen gemacht und der Fehler dürfte irgendwo da drin sein.


----------



## MarcoRolex (14. Jun 2016)

```
package altersheim;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import javax.swing.GroupLayout.Alignment;
import javax.swing.border.Border;

import jxl.Cell;
import jxl.LabelCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.biff.XFRecord;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.format.UnderlineStyle;
import jxl.read.biff.BiffException;

import jxl.write.Label;
import jxl.write.Number;
import jxl.write.WritableCell;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;


public class Altersheim
{
   
   public static void main(String[] args)
      throws BiffException, IOException, WriteException, InterruptedException
   {
      
      WritableFont titelFont = new WritableFont(WritableFont.ARIAL, 17, WritableFont.BOLD,false, UnderlineStyle.NO_UNDERLINE, Colour.AQUA);
      WritableCellFormat titelFormat = new WritableCellFormat();
      titelFormat.setFont(titelFont);
     
      WritableFont untertitelFont = new WritableFont(WritableFont.ARIAL, 12, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLUE_GREY);
      WritableCellFormat untertitelFormat = new WritableCellFormat();
      untertitelFormat.setFont(untertitelFont);
     
      
      SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
      String getTime = new String(format.format(Calendar.getInstance().getTime()));
     
      WritableWorkbook wworkbook;
      wworkbook = Workbook.createWorkbook(new File("C:/Users/rs/Desktop/Altersheim.xls"));
      WritableSheet wsheet = wworkbook.createSheet("Messungen Altersheim", 0);
     
     
      Label Titel = new Label(0, 0, "Messungen Altersheim", titelFormat);
      Label timeTitle = new Label(0, 3, "Zeit", untertitelFormat);
      Label temp = new Label(1, 3, "Temperatur", untertitelFormat);
     
      wsheet.addCell(Titel);
      wsheet.addCell(timeTitle);
      wsheet.addCell(temp);
     
      int spalte = 0;
      int zeile = 5;
     
      for(int a = 0; a < 10; a++)
      {
          wsheet.addCell(new Label(spalte, zeile, getTime));
          wworkbook.write();
          zeile++;
          Thread.sleep(0);
      }
     
      wworkbook.write();
      wworkbook.close();
     
    }

}
```

Man muss zuerst eine Externe Jar einbinden. http://www.quicklyjava.com/jexcel-jar-download/ hier kann man sie downloaden. 

@Henne079 Hat zwar keine Fehler gegeben, aber ist wieder das selbe passiert. Es wurde nur *ein* Eintrag gemacht.

@JStein52  Ich versteh deine Frage nicht ganz.


----------



## JStein52 (14. Jun 2016)

Meine Frage ging dahin ob du dir in der Schleife immer die gleiche Zelle überschreibst. D.h. steht am Ende der erste oder der letzte Eintrag dort ? Aber dein getTime ist ja immer konstant also die gleiche Zeit, du könntest es also sowieso nicht erkennen.


----------



## JStein52 (14. Jun 2016)

Ich glaube du darfst das Workbook.write() erst machen wenn du alle Zellen geschrieben hast, also hinter der Schleife !!


----------



## MarcoRolex (14. Jun 2016)

```
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
      String getTime = new String(format.format(Calendar.getInstance().getTime()));
```

Mein getTime passt sich der aktuellen Uhrzeit an, das ist schon richtig so.
Und zu deiner Frage. Die Zeile wird immer um eins erhöht, also wird bei jedem Schleifendurchlauf das Label um eins nach unten geschrieben.

Das workbook.close() ist gar nicht in der Schleife.


----------



## MarcoRolex (14. Jun 2016)

Status-Update:

@Henne079 Danke für dein Stück Code es hat so zu sagen funktioniert. Ich weiss jetzt was das Problem ist. Die Zeile wird aus irgendwelchen Gründen nicht erhöht. Also die Variable "zeile" wird zwar erhöht, aber der Parameter in der Definition des Labels wird wie nicht aktualisiert.


----------



## JStein52 (14. Jun 2016)

MarcoRolex hat gesagt.:


> String getTime = *new* String(format.format(Calendar.getInstance().getTime()));


Aber nur wenn das auch innerhalb der Schleife steht.



MarcoRolex hat gesagt.:


> aber der Parameter in der Definition des Labels wird wie nicht aktualisiert.


Deshalb meine Frage ob der letzte Eintrag in dieser Zelle steht ! Wobei mir noch nicht einleuchtet warum der nicht erhöht werden soll.


----------



## JStein52 (14. Jun 2016)

Schreibe es versuchsweise doch mal so:


```
//      for(int a = 0; a < 10; a++)
//     {
          wsheet.addCell(new Label(0, 5, getTime));
          wsheet.addCell(new Label(0, 6, getTime));
          wworkbook.write();
          zeile++;
          Thread.sleep(0);
//      }
```


----------



## MarcoRolex (14. Jun 2016)

Ja so würde es funktionieren. Daran habe ich vorher gemerkt, dass es an der Zeile liegen muss. 
Es steht nur der erste Eintrag in der Zelle. Aber so wie du es gerade geschrieben hast, stehen alle richtig. Jedoch nur wenn man alle Labels einzeln eintippt.


----------



## JStein52 (14. Jun 2016)

Ich habe dein Programm gerade bei mir ausprobiert. Wenn du dein wworkbook.write(); in der Schleife einfach entfernst geht es !


----------



## JStein52 (14. Jun 2016)

Und trotzdem musst du dein getTime innerhalb der Schleife immer neu anlegen sonst kriegst du immer die gleiche Uhrzeit


----------



## MarcoRolex (14. Jun 2016)

Es hat funktioniert. Vielen Dank für deine Hilfe und vor allem deine Geduld.


----------



## JStein52 (14. Jun 2016)

So geht es :


```
for(int a = 0; a < 10; a++)
      {
          String getTime = new String(format.format(Calendar.getInstance().getTime()));
          wsheet.addCell(new Label(spalte, zeile, getTime));
          zeile++;
          Thread.sleep(10000);
      }
    
      wworkbook.write();
      wworkbook.close();
```


----------



## JStein52 (14. Jun 2016)

Gerne


----------

