Excel Datei in Java öffnen!

VGOo

New member
So bevor ich hier lange herumrede, werde ich euch mein Problem gleich sagen. Wie der Titel schon sagt, will ich eine Excel Datei in Java öffnen.

Mit der JExcelApi habe ich es jetzt längere Zeit versucht, es will aber nicht wirklich funktionieren, da ich diesen Fehler bekomme: "Unable to recognize OLE stream"

Jetzt habe ich mir gerade Apache POI heruntergeladen, da es anscheinend besser und stabiler läuft als die JExcelApi.

Hat einer von euch Erfahrung mit einer der beiden APIs und könnte mir vielleicht helfen?

Danke schonmal 🙂
 
JExcelApi kann afaik nur mit alten Excel-Formaten umgehen, also keine xlsx-Dateien.

POI kann dagegen sicher xlsx schreiben und lesen. Hier ein paar Beispiele:
 
Und wie binde ich das Apacha POI in Netbeans ein? Ich habe da einen kompletten Ordner von der Seite heruntergeladen, ich weiss aber nicht wirklich wie ich das in Netbeans einbinden soll.

Es ist mir schon klar wie ich Libraries einbinde, ich kann aber in diesem Ordner keine solche Datei finden.
 
Habe mir jetzt mal alles durchgelesen, aber weiss genauso viel wie vorher. Ich weiss auch nicht wirklich was ich mit dem Code anfangen soll.

Gibts dafür nicht einfach eine Anweisung, die mir einfach die Excel-Tabelle in meinem Programm in einer Tabelle oder einem Textfeld als Tabelle darstellt?
 
Ne, sowas gibts nicht. Das fängt ja schon damit an, dass nicht jede Excel-Datei gleich ist. Und dann müsstest du auch noch exakt die Darstellungs-Form haben...

Fang doch erst mal damit an die Daten einzulesen (und auf Konsole auszugeben):

Für die Darstellung würde sich eine JTable anbieten:
 
Ok danke, ich werds mal so versuchen und wenns so nicht funktionieren will, lass ich mir was anderes einfallen, da ich leider nicht mehr allzu viel Zeit habe 🙂
 
So Leute, ich steh vor dem nächsten Problem und weiß nicht wirklich wie ich das am effizientesten und schnellsten umsetzen soll.

Ich hab jz in meinem Programm eine JTable von der ich die eingegebenen Daten lesen will und in ein vorgebenes Excel-Sheet speichern will.

Hat einer von euch das schon mal gemacht?

Danke im Vorraus 🙂
 
Wo ist das Problem? An die Daten in der jTable kommst du afaik durch das Model. Also sowas wie:

Code:
        int columns = jTable1.getModel().getColumnCount();
        int rows = jTable1.getModel().getRowCount();
        
        for(int i=0; i<columns; i++){
            for(int j=0; j<rows; j++){
                jTable1.getModel().getValueAt(j, i);
            }
        }

Und da kannst du die Werte auch gleich in deine Excel-Datei schreiben.
 
So Leute, ich steh leider schon wieder vor einem Problem :fuchtel: Ich hab jetzt eine JTable in der ich die Daten manuell eintragen kann und diese Daten will ich 1 zu 1 speichern um diese dann in ein Excelsheet zu schreiben.

Das mit dem schreiben und lesen des Excelsheet funktioniert tadellos.

Aber wie bitte komm ich zu den Daten in der JTable und wie kann ich mir die dann speichern.

Habs jetzt mit dem AbstractTableModel gemacht und über die Methode getValueAt will ich mir die Werte Zelle für Zelle holen. Das Problem ist nur das ich nicht weiß, wie ich in getValueAt ohne einer Variable mit den Daten vorgehen soll 😕

Ich hoffe einer von euch hat das jetzt verstanden.
 
lieft ein "Object" zurück, dass du erst in irgendwas casten musst. Sehr wahrscheinlich wird das ein String sein, also:

Code:
int columns = jTable1.getModel().getColumnCount();
int rows = jTable1.getModel().getRowCount();

for(int i=0; i<columns; i++){
 for(int j=0; j<rows; j++){
  String value = (String)jTable1.getModel().getValueAt(j, i);
 }
}

Bzw besser:
Code:
int columns = jTable1.getModel().getColumnCount();
int rows = jTable1.getModel().getRowCount();

for(int i=0; i<columns; i++){
 for(int j=0; j<rows; j++){
  Object value = getValueAt(row, col);
  if(value != null && (value instanceof String){
   String text = (String) value;
  }
 }
}


Dachte eigentlich da kommst du alleine drauf. 🙂
 
Meine nicht das, dass hab ich ja schon. Ich hab das Problem mit dem getValueOf() Ding.

Ich setze meine Tabelle auf das "TableModel" mit:

table.setModel(new TableModel(data));

und mein Konstruktor sieht so aus:

public TableModel(ArrayList<TableData> data){
this.data=data;
}

nur habe ich hier das Problem das zu diesem Zeitpunkt in der ArrayList noch nichts ist, weil ich ja die Daten in die Tabelle einfach so eintrage.

Meine getValueAt() Methode sieht so aus:


public Object getValueAt(int rI, int cI){
TableData p=(data.get(rI));

int anz=0;
int i=0;

switch(cI){

case 0: return data.get(i).getDailyfee();
.
.
.
}

return 0;
}

Weißt du was ich meine?

Wie komme ich zu den Daten, die ich in die Tabelle einlese?
 
table.getModel().getValueAt()?

Ansonsten weiß ich nicht was du meinst. An die Daten kommst du immer nur übers Model.
 
Ja so rufe ich die Methode auf. Und für den Konstruktor muss ich ja eine ArrayList mitübergeben, oder ist das nicht nötig?

Ich weiß einfach nicht wie ich die getValueAt()-Methode schreiben soll ohne Daten.


EDIT (autom. Beitragszusammenführung):


So meinte ich das: Bei allen Beispielen im Internet wird einfach ein Objekt mitübergeben, dass geht bei mir aber nicht, da ich ja keine Daten habe.

class SimpleTableModel extends AbstractTableModel {
public String[] m_colNames = { "A", "B", "C","D", "E" };

public Class[] m_colTypes = { Integer.class, String.class, String.class, String.class,
String.class };

Vector m_macDataVector;

public SimpleTableModel(Vector macDataVector) {
super();
m_macDataVector = macDataVector;
}
 
Zuletzt bearbeitet:
Das funktioniert eben nicht, da wirft er mir eine IndexOutOfBoundException oder eine NullPointException 😕
 
So, ich steh wieder vor einem Problem und ich hoffe auch, dass es das letzte ist.

Also, ich hab jetzt mein TableModel soweit fertig. Hier ist der Code:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package reiseverrechnung;

import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;

/**
*
* @author Balti
*/
public class TableModel extends AbstractTableModel {

private static final long serialVersionUID = 1L;
String[] headers = {};
//TableData [][] data; //Daten der Tabelle
ArrayList <TableData> list=new ArrayList <TableData>();
TableData data;



public TableModel() {
for (int i = 0; i < 17; i++) {
data=new TableData();
data.setTypefeeclaim(null);
data.setDistancetraveled(0);
data.setTravelcosts(0);
data.setDailyfee(0);
data.setOvernightcosts(0);
data.setOthercosts(0);
data.setSum(0);

list.add(data);
}


}

public int getRowCount() {
return 17;
}

public int getColumnCount() {
return 7;
}

@Override
public String getColumnName(int column){
String[] tab=new String []{"Art des Gebührenanspruches","Entfernung in Gesamt-km",
"Reisekosten", "Tagesgebühr", "Nächtigungsgebühr", "sonstige Nebenkosten", "Summe"};
return tab[column];
}

@Override
public boolean isCellEditable(int row, int column)
{
return true;
}



public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex) {
case 0:
return list.get(rowIndex).getTypefeeclaim();
case 1:
return list.get(rowIndex).getDistancetraveled();
case 2:
return list.get(rowIndex).getTravelcosts();
case 3:
return list.get(rowIndex).getDailyfee();
case 4:
return list.get(rowIndex).getOvernightcosts();
case 5:
return list.get(rowIndex).getOthercosts();
case 6:
return list.get(rowIndex).getSum();

default: return "Error";
}
}


@Override
public Class getColumnClass(int cI) {
if (cI == 0) {
return String.class;
} else {
if (cI == 1) {
return Integer.class;
} else {
if (cI == 2) {
return Integer.class;
} else {
if (cI == 3) {
return Integer.class;
} else {
if(cI==4){
return Integer.class;
} else {
if(cI==5){
return Integer.class;
}
else {
if(cI==6) {
return Integer.class;
}
}
}
return String.class;
}
}
}
}
}

@Override
public void setValueAt(Object aValue,int rowIndex, int columnIndex){
switch (columnIndex) {

case 0:
list.get(rowIndex).setTypefeeclaim(String.valueOf(aValue.toString()));
break;
case 1:
list.get(rowIndex).setDistancetraveled(Integer.valueOf(aValue.toString()));
break;
case 2:
list.get(rowIndex).setTravelcosts(Integer.valueOf(aValue.toString()));
break;
case 3:
list.get(rowIndex).setDailyfee(Integer.valueOf(aValue.toString()));
break;
case 4:
list.get(rowIndex).setOvernightcosts(Integer.valueOf(aValue.toString()));
break;
case 5:
list.get(rowIndex).setOthercosts(Integer.valueOf(aValue.toString()));
break;
case 6:
list.get(rowIndex).setSum(Integer.valueOf(aValue.toString()));
break;

}

fireTableDataChanged();

}


public ArrayList<TableData> getChanges(){
System.out.println(list);
return list;
}
}

Ich hab jetzt nur noch das Problem, dass mir wenn ich die getChanges Methode im Mainprogramm aufrufe, immer nur null oder 0 zurückgibt.
😕

Weiß einer von euch weiter?
 

Online-Statistiken

Zurzeit aktive Mitglieder
0
Zurzeit aktive Gäste
26
Besucher gesamt
26

Beliebte Forum-Themen

Zurück
Oben Unten