# Wieso erfolgt keine Ausgabe. /Excel



## Titanpharao (24. Okt 2007)

Hi wieso erfolgt bei x Werten über 4 nur noch die obere Zeile als Ausgabe?


```
import java.io.File;
import jxl.*;


public class JavaExel {

	public static void main(String[] args) {
		try {
			int x=4;
			int y=10;
			Workbook workbook = Workbook.getWorkbook(new File("test.xls"));
			 Sheet sheet = workbook.getSheet(0);
			 Cell zelle; 
			 for(int i=0;i<y;++i){
				  for(int j=0;j<x;++j){
					  zelle=sheet.getCell(j,i);
					  System.out.print(zelle.getContents()+"\t");
				  }
				  System.out.println();
			  }
			workbook.close();
		} catch (Exception e) {
		}		  
	}
}
```

Excel sieht dabei so aus:

TI	TD	TS	TC	
1	0,1	eins	e	
1000	0,001	tausend	t	
1000000	0	million	m


----------



## Titanpharao (24. Okt 2007)

Hat keiner eine Ahnung, oder versteht einer die Frage nicht?


----------



## abollm (24. Okt 2007)

Titanpharao hat gesagt.:
			
		

> Hat keiner eine Ahnung, oder versteht einer die Frage nicht?



Ich verstehe dein Problem ehrlich gesagt nicht. Das Programm macht doch offensichtlich das, was es soll.
Was genau soll denn nach deiner Meinung passieren (was bis jetzt aber wohl nicht passiert)?


----------



## Titanpharao (25. Okt 2007)

Steht doch ganz oben....wenn ich mehr als 4 Spalten auslese, dann zeigt er mir nur noch die erste Zeile an.


----------



## abollm (25. Okt 2007)

Titanpharao hat gesagt.:
			
		

> Steht doch ganz oben....wenn ich mehr als 4 Spalten auslese, dann zeigt er mir nur noch die erste Zeile an.



Nein, das Programm macht genau das, was es soll (ich habe es nachvollzogen). Vermutlich hast du in der 5. Spalte und 1. Zeile deiner Excel-Datei einen Wert, mit dem die jxl-Klassen nicht umgehen können. So etwas kommt schon mal vor.


----------



## Titanpharao (25. Okt 2007)

Na ja da steht nichts drin  also würde es dann nicht "nichts" ausgeben?


----------



## abollm (25. Okt 2007)

Titanpharao hat gesagt.:
			
		

> Na ja da steht nichts drin  also würde es dann nicht "nichts" ausgeben?



Mach mal Folgendes:
- Öffne deine Excel-Datei "test.xls" in MS Excel und speichere die als CSV-Datei ab.
- Schließe die XLS-Datei "test.xls" (ohne erneut abzuspeichern!)
- Öffne dann in Excel die erzeugte CSV-Datei und speichere sie als Excel-Datei (Endung .xls) unter einem neuen Namen ab
- Führe dann mit dieser neuen Excel-Datei dein obiges Java-Programm aus -> Was passiert dann?


----------



## Murray (25. Okt 2007)

Das

```
} catch (Exception e) {
      }
```
ist übel; so unterdrückst du evtl. auftretende Laufzeitfehler und wunderst dich dann, dass es nicht klappt.

Das Minimum an Fehlerbehandlung:

```
} catch (Exception e) {
            e.printStackTrace();
      }
```


----------



## Titanpharao (26. Okt 2007)

@abollm brachte nichts..

Hmm...stimmt, habe mir das so dumm angewöhnt, weil ichs meistens nicht brauchte.

Fehlermeldung bei 5

TI	TD	TS	TC	java.lang.ArrayIndexOutOfBoundsException: 4
	at jxl.read.biff.SheetImpl.getCell(SheetImpl.java:354)
	at JavaExel.main(JavaExel.java:17)

hm...aber das kommt auch wenn ich zu viel vertikal lesen...aber da macht der weiter?


----------



## Ariol (26. Okt 2007)

schreib in deinen for-schleifen statt ++i mal i++ (bzw. j++)


----------



## Murray (26. Okt 2007)

Ariol hat gesagt.:
			
		

> schreib in deinen for-schleifen statt ++i mal i++ (bzw. j++)


Das ist egal. Anders sieht das aus, wenn man - was man m.E. aus Gründen der Lesbarkeit besser lassen sollte - die Inkrementierung in die Schleifenbedingung integriert.

Bsp.:

```
public class ForTest {

	public static void main(String[] args) {

		for ( int i=0; i<5; i++) {
			System.out.print( i + " ");
		}
		System.out.println();
		
		for ( int i=0; i<5; ++i) {
			System.out.print( i + " ");
		}
		System.out.println();

		for ( int i=0; ++i<5;) {
			System.out.print( i + " ");
		}
		System.out.println();

		for ( int i=0; i++<5;) {
			System.out.print( i + " ");
		}
		System.out.println();

	}

}
```

Das ergibt die Ausgabe

```
0 1 2 3 4 
0 1 2 3 4 
1 2 3 4 
1 2 3 4 5
```


----------



## Murray (26. Okt 2007)

Titanpharao hat gesagt.:
			
		

> hm...aber das kommt auch wenn ich zu viel vertikal lesen...aber da macht der weiter?


In beiden Fällen läuft das Programm solange, bis zum ersten Mal die Exception auftritt. Wenn du zuviele Zeilen lesen willst, tritt die ERxception auf, nachdem die letzte gültige Zeile komplett gelesen und ausgegeben worden ist - wenn du die Exception unterdrückst, dann merkst du überhaupt nichts von dem Fehler; die Schleife wird zwar unterbrochen, aber das stört dich in dem Moment ja nicht. Wenn du aber zuviele Spalten lesen willst, tritt der Fehler eben schon am Ende der ersten Zeile auf, so dass die Schleife eben viel früher abgebrochen wird.


----------



## Murray (26. Okt 2007)

So sollte es gehen:

```
import java.io.File;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;


public class JavaExel {

   public static void main(String[] args) {

      try {
         Workbook workbook = Workbook.getWorkbook(new File("test.xls"));
         Sheet sheet = workbook.getSheet(0);
         int cols = sheet.getColumns();
         int rows = sheet.getRows();
          for(int y=0;y<rows;++y){
              for(int x=0;x<cols;++x){
                 Cell zelle=sheet.getCell( x, y);
                 System.out.print(zelle.getContents()+"\t");
              }
              System.out.println();
           }
         workbook.close();
      } catch (Exception e) {
         System.err.println( "Fehler beim Lesen des Workbooks " + workbook + ": " + e.getMessage());
         e.printStackTrace();
      }       
   }
}
```


----------



## abollm (26. Okt 2007)

@Titanpharao

Kannst du die MS-Exeldatei nicht einmal hier auf dem Server ablegen, dann man das jeder Interessierte versuchen nachzuvollziehen?

Ich habe mit deinem Code -- ohne jedwede Änderung -- zwei unterschiedliche Excel-Dateien bearbeitet. In einem Fall ging das problemlos, im anderen Fall erhielt ich genau wie du keine Fehlermeldung. Dann habe ich mir daraufhin einmal die Exception näher angesehen (Code wie oben auch von Murray vorgeschlagen entsprechend geändert). Ergebnis:


```
jxl.read.biff.BiffException: Unable to recognize OLE stream
	at jxl.read.biff.CompoundFile.<init>(CompoundFile.java:116)
	at jxl.read.biff.File.<init>(File.java:127)
	at jxl.Workbook.getWorkbook(Workbook.java:221)
	at jxl.Workbook.getWorkbook(Workbook.java:198)
	at de.JavaExcel.main(JavaExcel.java:14)
```

Das ist zwar etwas Anderes als das was du hast, aber deutet ja darauf hin, dass die jxl-Klassen mit bestimmten Excel-Dateien nicht korrekt umgehen können.

Vielleicht hilft es.


----------



## abollm (26. Okt 2007)

@Titanpharao 

Jetzt ist es klar: Man sollte immer vorher sich -- mindestens ein wenig -- mit den jeweiligen Klassen beschäftigt haben.

Es dürfte auch bei dir nun problemlos funktionieren, wenn du den Code wie folgt änderst:


```
package de;

import java.io.File;
import jxl.*;

public class JavaExcel {

	public static void main(String[] args) {
		try {
			Workbook workbook = Workbook.getWorkbook(new File("E:\\mytest1.xls"));
			Sheet sheet = workbook.getSheet(0);
			// Anzahl Zeilen und Spalten ermitteln
			int rowNum = sheet.getRows();
			int colNum = sheet.getColumns();
			System.out.println("Anzahl Zeilen im aktuellen Sheet: "+rowNum);
			System.out.println("Anzahl Spalten im aktuellen Sheet: "+colNum+"\n");
			Cell zelle = null;
			for (int i = 0; i < rowNum; i++) {
				for (int j = 0; j < colNum; j++) {
					zelle = sheet.getCell(j, i);
					System.out.print(zelle.getContents() + "\t");
				}
				System.out.println();
			}
			workbook.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
```

Tja, kleine Ursache ... (-;

[Edit] Aaargh, das Lesen des ganzen Threads hilft. Murray hatte es ja auch schon. Das Problem ist eben, dass man keine leeren Zellen so ausgeben darf.


----------



## Murray (26. Okt 2007)

abollm hat gesagt.:
			
		

> Das Problem ist eben, dass man keine leeren Zellen so ausgeben darf.


Das noch viel größere Problem ist eigentlich, dass man die im Gegensatz zu z.B. C (das soll jetzt bitte keinen Flamewar auslösen) enorm mächtige Laufzeitfehlerbehandlung nicht einfach durch eine leeren catch-Block aushebeln sollte - schon mit einem einfachen e.printStackTrace() wäre doch sofort klar gewesen, was da schiefgeht.


----------



## Wildcard (26. Okt 2007)

Murray hat gesagt.:
			
		

> [(das soll jetzt bitte keinen Flamewar auslösen)


Das wird kaum möglich sein, diese Tatsache dürfte auch für Hardcore C'ler unstrittig sein.


----------



## Murray (26. Okt 2007)

Wildcard hat gesagt.:
			
		

> Murray hat gesagt.:
> 
> 
> 
> ...


Aber vielleicht wird der eine oder andere C'ler der Meinung sein, dass man so eine Laufzeitprüfung bei perfekter Programmierung nicht braucht und daher CPU-Zeit für überflüssige Dinge verschwendet wird (aber jetzt fange ich ja selber an damit).


----------



## Wildcard (26. Okt 2007)

ACK


----------



## abollm (26. Okt 2007)

Murray hat gesagt.:
			
		

> Das noch viel größere Problem ist eigentlich, dass man die im Gegensatz zu z.B. C (das soll jetzt bitte keinen Flamewar auslösen) enorm mächtige Laufzeitfehlerbehandlung nicht einfach durch eine leeren catch-Block aushebeln sollte - schon mit einem einfachen e.printStackTrace() wäre doch sofort klar gewesen, was da schiefgeht.



Stimmt schon. Allerdings hatte ich ja mit einer meiner zwei Excel-Dateien zuerst die oben von mir gepostete Exception erhalten und dachte deshalb, dass an seiner Excel-Datei (wie bei mir) etwas faul sei. Die Reihenfolge ist sehr wichtig: Erst sorgfältig _alle möglichen/denkbaren Exceptions abfangen, dann Fehlerursache finden/analysieren. Na ja, wie oft wurde das hier schon gepostet und dennoch passiert es einem selbst mitunter mal.
Gerade vor einigen Tagen hatte ich bei einem Kunden ein grob vergleichbares Problem bei einem von mir geschirebenen kleineren Programm:
Die abgefangenen Exceptions hatten die dort aufgetretene Exception (Oracle-spezifisch) nicht abgefangen. Mir war dann nach einer Minute klar, wo ich seinerzeit beim Coden zu faul war. Faulheit rächt sich in der regel immer. Bezüglich Exceptions weist ja jeder bessere Java-Autor auf den sorgfältigen Umgang damit hin. Es kann zur Laufzeit eben alles Mögliche schief gehen.


----------

