Fehler mit jexcelapi beim auslesen

ZubSero

Grünschnabel
Hallo,

ich wollte mich rantesten an das Auslesen einer Exceldatei und bin auf den oft verlinkten vorschlag mit der jexcelapi gekommen. Prompt eingebunden habe ich ein simples Beispiel programmiert, welches jedoch Fehler auswirft.
Mein Code:

package Excel;

import java.io.File;
import java.io.IOException;
import jxl.*;
import jxl.read.biff.BiffException;
import javax.swing.*;
import java.awt.*;


public class Main extends JFrame
{
private File myExcelFile;
private Workbook myWorkbook;
private Sheet mySheet;
private String stringA1;
private String stringB1;
private String stringC1;
private Cell a1;
private Cell b1;
private Cell c1;
private Container contPane;
private JLabel labA1;
private JLabel labB1;
private JLabel labC1;

public static void main(String[] args) throws IOException, BiffException
{
Main myMain = new Main();
}

public Main() throws IOException, BiffException
{
super();

contPane = getContentPane();
contPane.setLayout(new BoxLayout(contPane, BoxLayout.Y_AXIS));

myExcelFile = new File("d:\\Testdatei.xlsx");

myWorkbook = Workbook.getWorkbook(myExcelFile);

mySheet = myWorkbook.getSheet(0);

a1 = mySheet.getCell(0, 0);
b1 = mySheet.getCell(1, 0);
c1 = mySheet.getCell(2, 0);

stringA1 = a1.getContents();
stringB1 = a1.getContents();
stringC1 = a1.getContents();

labA1 = new JLabel(stringA1);
labB1 = new JLabel(stringB1);
labC1 = new JLabel(stringC1);

contPane.add(labA1);
contPane.add(labB1);
contPane.add(labC1);

this.pack();
this.setVisible(true);
}
}

Bei der Ausführung erscheint folgende Fehlermeldung:

Exception in thread "main" 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 Excel.Main.<init>(Main.java:41)
at Excel.Main.main(Main.java:29)

Ich habe mal in die Klassen hineingeschaut, um zu schauen, was in den Zeilen 116, 127, etc. los ist. Erstaunlich war nur, dass die Klassen so viele Zeilen hatten :rolleyes:

Hat da jemand eine Idee, wo mein Fehler steckt?

Grüße
ZubSero

P.S. Mein erster Post. Für Verbesserungen diesbezüglich bin ich auch offen :).
 
Hi und willkommen im Forum!

zuerst mal: den Code bitte in Java-Tags schreiben (siehe meine Signatur), dann lässt er sich besser lesen. Für die Exception nimmt man dann den Code-Tag:

Java:
package Excel;

 import java.io.File;
 import java.io.IOException;
 import jxl.*;
 import jxl.read.biff.BiffException;
 import javax.swing.*;
 import java.awt.*;


 public class Main extends JFrame
 {
 private File myExcelFile;
 private Workbook myWorkbook;
 private Sheet mySheet;
 private String stringA1;
 private String stringB1;
 private String stringC1;
 private Cell a1; 
 private Cell b1;
 private Cell c1;
 private Container contPane;
 private JLabel labA1;
 private JLabel labB1;
 private JLabel labC1;

 public static void main(String[] args) throws IOException, BiffException
 {
 Main myMain = new Main();
 }

 public Main() throws IOException, BiffException
 {
 super();

 contPane = getContentPane();
 contPane.setLayout(new BoxLayout(contPane, BoxLayout.Y_AXIS));

 myExcelFile = new File("d:\\Testdatei.xlsx");

 myWorkbook = Workbook.getWorkbook(myExcelFile);

 mySheet = myWorkbook.getSheet(0);

 a1 = mySheet.getCell(0, 0);
 b1 = mySheet.getCell(1, 0);
 c1 = mySheet.getCell(2, 0);

 stringA1 = a1.getContents();
 stringB1 = a1.getContents();
 stringC1 = a1.getContents();

 labA1 = new JLabel(stringA1);
 labB1 = new JLabel(stringB1);
 labC1 = new JLabel(stringC1);

 contPane.add(labA1);
 contPane.add(labB1);
 contPane.add(labC1);

 this.pack();
 this.setVisible(true);
 }
 }
(mit Einrückungen wäre das natürlich noch besser ;)

die Exception:
Code:
Exception in thread "main" 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 Excel.Main.<init>(Main.java:41)
 at Excel.Main.main(Main.java:29)

kleine Anmerkung gleich mal: Pakete (in deinem Fall Excel) schreibt man klein, damit man sie von Klassennamen unterscheiden kann.

Der Fehler tritt dort auf, wo du die Datei lädtst.
Existiert die Datei D:\Testdatei.xlsx ? Wenn nein, musst du sie wahrscheinlich erst mit der jexcelapi erzeugen!
Wenn die Datei existiert, ist sie entweder defekt (mit MS Office und anderen Programmen prüfen) oder in einer Version, die jexcelapi nicht unterstützt.

Wenn du auf die Seiten von JExcelAPI ( http://jexcelapi.sourceforge.net/ , http://www.andykhan.com/jexcelapi/ ) schaust, steht dort, dass Excel 97, 2000, XP, 2003 unterstützt wird. Die Endung xslx ist aber die Endung von Excel 2007/2010, das ist inkompatibel mit vorherigen Versionen! Du solltest entweder mit alten Excel-Dateien arbeiten oder dir eine andere API suchen.
 
@sheel: Alles klar, danke für den Tipp.

Ich habe selbst nochmal bissl herumprobiert.

Er hat ein Problem, eine xlsx datei zu öffnen. Wenn ich nämlich mein Beispiel mit einer xls Datei ausführe, funktioniert alles einwandfrei :).

Ist die jecelapi noch nicht für Excel 2010 ausgereift oder habe ich doch noch irgendeinen Fehler?
 
Schau doch nach:
http://jexcelapi.sourceforge.net/
Some Features, erste Zeile.

Bei 2003 ist Schluss. Kein xlsx.

Da zwischen den Dateiformaten sehr große Unterschiede sind macht es wahrscheinlich nicht viel Sinn, das da noch reinzustopfen, sondern besser gleich ein neues Projekt daraus machen...
 
Zurück