Wieso erfolgt keine Ausgabe. /Excel

Status
Nicht offen für weitere Antworten.

Titanpharao

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

Code:
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 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 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 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?
 
Das
Code:
      } catch (Exception e) {
      }
ist übel; so unterdrückst du evtl. auftretende Laufzeitfehler und wunderst dich dann, dass es nicht klappt.

Das Minimum an Fehlerbehandlung:
Code:
      } catch (Exception e) {
            e.printStackTrace();
      }
 
@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 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.:
Code:
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
Code:
0 1 2 3 4 
0 1 2 3 4 
1 2 3 4 
1 2 3 4 5
 
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.
 
So sollte es gehen:
Code:
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();
      }       
   }
}
 
@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:

Code:
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.
 
@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:

Code:
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.
 
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 hat gesagt.:
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.
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).
 
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.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben