Kann einen Array nicht füllen, im Nachhinein nur "null"-Werte

maxxas

Mitglied
Hallo Leute! Ich habe ein Problem. Ich schreibe an einem kleinen Programm. Es soll zunächst Werte aus einem Excel-Sheet in ein String Array packen. Ich habe alles ausprobiert, denke, dass das wahrscheinlich mit den Lebenszyklen der Variablen zusammenhängt, finde aber trotzdem keine Lösung. Unten folgt der Quellcode. Ich danke im Voraus für jede wirkliche Hilfe! P. S. Ich nutze JDeveloper12, weiß nicht, ob es wichtig ist.

Java:
    public void read() throws IOException  {
//String inputVerzStr = path to .xls-file
        File inputWorkbook = new File(inputVerzStr);
        Workbook w;
        
        try {
          w = Workbook.getWorkbook(inputWorkbook);
          // Get the first sheet
          Sheet sheet = w.getSheet(0);
          // Loop x columns and lines

          for (int j = 0; j < sheet.getColumns(); j++) {
    
            for (int i = 0; i < sheet.getRows(); i++) { 
              String value = "";
              int rows = sheet.getRows();  
              initializeArray(rows);
              Cell cell = sheet.getCell(j, i);
           // CellType type = cell.getType();
                if (j == 0) {
                    System.out.println("I got a label "
                        + cell.getContents());
                    value = cell.getContents();
                    sheetValues[i][j][j][j][j][j] = value;
                    System.out.println(sheetValues[i][j][j][j][j][j]);
                    if(i>0){
                    System.out.println(sheetValues[i-1][j][j][j][j][j]);
                    }
    //                    fillArrayAccount(i);
              }

                if (j == 1) {
                    System.out.println("I got a label "
                        + cell.getContents());
                      sheetValues[j][i][j][j][j][j] = value;
                  }
                
                if (j == 2) {
                    System.out.println("I got a label "
                        + cell.getContents());
                    sheetValues[j][j][i][j][j][j] = value;
                }

                if (j == 3) {
                    System.out.println("I got a label "
                        + cell.getContents());
                    sheetValues[j][j][j][i][j][j] = value;
                }

            }
          }
        } catch (BiffException e) {
          e.printStackTrace();
        }  
      }
[code=Java]
 
oh, sorry, ich hoffe, jetzt wird die Darstellung besser. Das Array sheetValues[][][][][][] habe ich auch schon statisch gemacht - das bracht nix:

Java:
 public void read() throws IOException {
//String inputVerzStr = path to .xls-file
File inputWorkbook = new File(inputVerzStr);
Workbook w;

try {
w = Workbook.getWorkbook(inputWorkbook);
// Get the first sheet
Sheet sheet = w.getSheet(0);
// Loop x columns and lines

for (int j = 0; j < sheet.getColumns(); j++) {

for (int i = 0; i < sheet.getRows(); i++) { 
String value = "";
int rows = sheet.getRows(); 
initializeArray(rows);
Cell cell = sheet.getCell(j, i);
// CellType type = cell.getType();
if (j == 0) {
System.out.println("I got a label "
+ cell.getContents());
value = cell.getContents();
sheetValues[i][j][j][j][j][j] = value;
System.out.println(sheetValues[i][j][j][j][j][j]);

// Das hier ist ein Test, um rauszufinden, ob das Array-Element, das vorher gespeichert werden sollte, immer noch exisitert. Leider gibt es nur "null" zurück!
if(i>0){
System.out.println(sheetValues[i-1][j][j][j][j][j]);
}
}

if (j == 1) {
System.out.println("I got a label "
+ cell.getContents());
sheetValues[j][i][j][j][j][j] = value;
}

if (j == 2) {
System.out.println("I got a label "
+ cell.getContents());
sheetValues[j][j][i][j][j][j] = value;
}

if (j == 3) {
System.out.println("I got a label "
+ cell.getContents());
sheetValues[j][j][j][i][j][j] = value;
}

}
}
} catch (BiffException e) {
e.printStackTrace();
} 
}
 
2 Anmerkungen, falls du wirklich Hilfe erwartest:

  • Poste ein lesbares (!), möglichst vollständiges Minimalbeispiel, bzw. ein Fragment welches den Fehler illustriert. Nur die wenigsten hier haben Lust, solche unleserlichen Codefragmente erst selbst zu formatieren und zum Laufen zu bringen bzw. sich die relevanten Codestellen rauszusuchen.
  • "Ich habe ein Problem" ist keine Fehlerbeschreibung. Das versteht sich von selbst. Ratespielchen, die Fehlerbeschreibung am Ende eines Inline-Kommentars zu verstecken, für den man erst scrollen muss, kommen auch nicht so gut.
 
Zuletzt bearbeitet von einem Moderator:
Gut. Das Problem habe ich zwar beim 1. Post beschrieben, aber ich gehe jetzt genauer drauf ein...

Was das Programm tun soll:
Es soll Werte (Strings) in ein String-Array füllen. Die Werte kommen aus einer xls.-Datei, deshalb nutze ich ein mehrdimensionales Array (eine Spalte in der xls-Tabelle = 1 Dimension im Array). Die Werte des Array werden beim "befüllen" auch jedes Mal ausgegeben.

Testweise habe ich im if-Block (innerhalb der for-Schleife), der die 1. Dimension des Arrays befüllt (also 1. Spalte der Tabelle in die 1. Dimension des Arrays füllt) eine Ausgabe eingebaut, die das Element des Arrays ausgeben soll, das im vorherigen Iterationsschritt dort unter einem anderen Index eingesetzt wurde. Hier erhalte ich stets "Null"-Werte. Die Werte werden also nicht gespeichert oder das Array wird jedes Mal überschrieben.

Kann mir jemand den Fehler hier aufzeigen:

Java:
 public void read() throws IOException {

//String inputVerzStr = path to .xls-file
File inputWorkbook = new File(inputVerzStr);
Workbook w;

try {
w = Workbook.getWorkbook(inputWorkbook);

// Get the first sheet
Sheet sheet = w.getSheet(0);

// Loop x columns and lines
for (int j = 0; j < sheet.getColumns(); j++) {
for (int i = 0; i < sheet.getRows(); i++) { 

String value = "";
int rows = sheet.getRows();

//Hier wird anhand der Zeilenanzahl in der .xls-Tabelle die Länge des Arrays festgelegt
initializeArray(rows);

//eine Zelle aus der .xls-Tabelle rausgepickt...
Cell cell = sheet.getCell(j, i);

//Hier geht es zum Befüllen des Arrays
//1. Spalte = 0. Array-Dimension
if (j == 0) {
System.out.println("I got a label "
+ cell.getContents());

//Der Inhalt einer Zelle wird in eine String-Variable eingefügt
value = cell.getContents();

//der String in das Array geschrieben
sheetValues[i][j][j][j][j][j] = value;

//Ausgabe zum Testen ... der Wert aus der akt. Iteration
System.out.println(sheetValues[i][j][j][j][j][j]);

//... und hier soll der Wert aus der vorherigen Iteration ausgegeben werden. Es kommt aber nur eine "Null"-Ausgabe :(((
if(i>0){
System.out.println(sheetValues[i-1][j][j][j][j][j]);
}
}

//2. Spalte = 1. Array-Dimension
if (j == 1) {
System.out.println("I got a label "
+ cell.getContents());
sheetValues[j][i][j][j][j][j] = value;
}

//3. Spalte = 2. Array-Dimension
if (j == 2) {
System.out.println("I got a label "
+ cell.getContents());
sheetValues[j][j][i][j][j][j] = value;
}

//4. Spalte = 3. Array-Dimension
if (j == 3) {
System.out.println("I got a label "
+ cell.getContents());
sheetValues[j][j][j][i][j][j] = value;
}

}
}
} catch (BiffException e) {
e.printStackTrace();
} 
}

... kürzer geht es nicht, weil es sonst keinen Sinn ergibt. Außerdem habe ich bei anderen Foren schon oft gesehen, dass um Quellcode gebeten wird. Ich habe ihn so vollständig wie nur möglich kommentiert. Danke im Voraus!!!
 
Ich habe immernoch keine Ahnung, was da nun genau passieren soll (ohne Einrückungen ist das auch echt schwer zu lesen)...
Ich hab das jetzt so verstanden, dass du eine Datei hast in der eine Tabelle abgelegt ist. (Ich nehme mal nur 4 Spalten)
Z.B. sowas:

Code:
Wert1	Wert2	Wert3	Wert4

Wert5	Wert6	Wert7	Wert8

Wert9	Wert10	Wert11	Wert12

Du iterierst nun über alle Zeilen und Spalten der Tabelle.
Nehmen wir an du bist in der 1. Spalte und 1. Zeile. (i = 0, j = 0).
Dann schreibst du den Wert in das Array sheetValues[0][0][0][0].
In der nächsten Zeile schreibst du den Wert an die Stelle sheetValues[1][0][0][0]... dann
in sheetValues[2][0][0][0]. Was macht das für einen Sinn? Eine Tabelle ist doch zweidimensional..
es würde doch also reichen den Wert an die Stelle sheetValues[j] zu schreiben...

lg Toto
 
Zuletzt bearbeitet:
Hi Toto, ich rücke nächstes Mal per Hand ein (mein Versehen; aber mit der Tabulator-Taste ging es irgendwie nicht)

Du hast es leider nicht ganz verstanden.

Ausgangslage:
Eine .xls-Tabelle mit 4 Spalten voller Daten:
1. Spalte Kontonummern
2. Bankleitzahlen
3. Banknamen
4. Kontobesitzer

Diese Excel-Tabelle möchte ich in ein Array überführen. Der Einfahheithalber - es hat 4 Dimensionen (sheetValues[][][][]): Für jede Spalte in der Tabelle gibt es eine Dimension.


Problem: Die Werte werden beim Befüllen des Arrays (mit Hilfe der For-Schleife) korrekt ausgelesen und scheinbar ins Array kopiert, bleiben dort aber nicht gespeichert(?). Das heißt, wenn ich am Ende die Werte aus dem Array ausgeben will, kommen nur "Null"-Werte.

Ich hoffe, es war jetzt einleuchtender...
 
Der Einfahheithalber - es hat 4 Dimensionen (sheetValues[][][][]): Für jede Spalte in der Tabelle gibt es eine Dimension.

Warum ist das einfach? Mit zwei Dimensionen values[zeile][spalte] könntest du direkt auf einen speziellen Wert zugreifen. Du hast einfach 4 Dimensionen zu viel. Folglich wird dein Problem eher beim Auslesen der Daten liegen als beim Befüllen des Arrays.
 
Wie die Vorredner schon schrieben: Korrigier erst mal dieses komische Vorgehen, eine Tabelle (also eine 2-dimensionale Struktur) mit aller Gewalt in ein 6-dimensionales Array zu zwängen. Dann verschwindet der Fehler mit hoher Wahrscheinlichkeit schon von alleine. Wie man dem Quelltext und deinen Ausführungen ansieht, hast du komplett den Überblick verloren, was du überhaupt noch wo schreibst und liest (z.B. erzählst du von 4-dimensionalen Arrays, implementierst aber 6-dimensionale, und der Zugriff darauf ist absolut nicht nachvollziehbar). Es ergibt schlichtweg keinen Sinn, auf alle Elemente der 2. Spalte mittels
Code:
sheetValues[2][2][2][i][2][2] = value;
statt
Code:
sheetValues[i][2] = value;
zuzugreifen. Unterm Strich kann man wahrscheinlich den ganzen komplizierten Code wiefolgt eindampfen:
Code:
for (int j = 0; j < sheet.getColumns(); j++) {
   for (int i = 0; i < sheet.getRows(); i++) { 
      sheetValues[i][j] = sheet.getCell(j, i).getContents();
   }
}
 
Zuletzt bearbeitet von einem Moderator:
:toll:

es gab da noch paar Fehler aber die habe ich dann selber gefunden. Es funzt!

Vielen Dank an dieser Stelle nochmal (lustig, wie man blind für eigene Fehler ist)
 
Schön das es klappt:toll:

Und auch ich nehme etwas mit
Java:
sheetValues[j][j][i][j][j][j] = value;
Heiliges Blechle:applaus:
 

Zurück
Oben