JTable, Excel. JTabbedPane

Guten Morgen,

ich beschäftige mich seit einiger Zeit mit Swing und AWt Programmierung und bin nun auf einige Problemchen gestoßen.

Ich habe zwischen Java und Excel eine Verbinung über Streams hergestellt, d.h. ich lese schön Zeile für Zeile eines Sheet ein und kann die Daten mit System.out.println natürlich auch ausgeben.

Nun zu meinem Problem:
Ich möchte die Daten in eine JTable schreiben. Diese JTable soll editierbar sein, so dass ich die veränderten Daten auch wieder zurückschreiben kann in die Exceldatei!? Wie stelle ich das an??

Wenn dies dann klappt, würde ich dann gerne jedes Sheet der Exceldatei auf einer anderen Registerkarte anzeigen wollen - wie bekommt man denn so etwas hin??

Vielen Dank für Eure Hilfestellung
Nicole

Hallo,

Ich möchte die Daten in eine JTable schreiben.

Dazu erstellst du dir erstmal ein TableModel. Dies ist eine Klasse, in der
die Daten gehalten werden, die in der Tabelle angezeigt werden sollen. Ganz einfach gesagt, gibt ein TableModel zurück, welche Daten sich in welcher Zelle befinden. Man kann es also fragen, was ist an Spalte 1, Zeile 5.
Dazu kannst du entweder die Standard-Implementierung „javax.swing.table.DefaultTableModel“ benutzen, oder du bastelst dir selbst ein TableModel, indem du AbstractTableModel oder TableModel ausimplementierst.
Wenn du dann das TableModel hast, dann kannst du eine JTable-Componente erstellen, die dieses verwendet.

Diese JTable
soll editierbar sein, so dass ich die veränderten Daten auch
wieder zurückschreiben kann in die Exceldatei!?

Dazu musst du nur im TableModel die Eigenschaft isCellEditable() auf true setzen und das TableModel muss die Methode setValueAt(Object value, int row, int col) implementieren. Dann kannst du ganz einfach wie in Excel die Werte in der Tabelle ändern.

Wie stelle ich
das an??

Wie das alles genau geht, steht sehr ausführlich hier:
http://java.sun.com/docs/books/tutorial/uiswing/comp…

Wenn dies dann klappt, würde ich dann gerne jedes Sheet der
Exceldatei auf einer anderen Registerkarte anzeigen wollen -
wie bekommt man denn so etwas hin??

Kein Problem. Dazu brauchst du nur ein JTabbedPane, und für jedes Sheet erstellst du dort ein neues Tab und setzt auf jedes Tab eine Tabelle mit dem entsprechenden Sheet. Siehe auch unter:
http://java.sun.com/docs/books/tutorial/uiswing/comp…

Das ist auch ganz interessant:
http://java.sun.com/docs/books/tutorial/uiswing/comp…

mfg
deconstruct

Danke für Deine Antwort, aber meine Idee sieht etwas anders aus, geht es nicht vielleicht auch so:

import java.io.*;
import java.net.*;
import java.sql.*;
import java.util.*;
//
import javax.swing.*;
import java.io.*;
import java.lang.*;
import java.awt.*;
import java.awt.event.*;

public class ExcelConnect extends javax.swing.JFrame {
static final String DRIVER_NAME = „sun.jdbc.odbc.JdbcOdbcDriver“;
static final String DATABASE_URL = „jdbc:odbc:Mappe1“;

////////////////////////////////////////////////////////////////////////////////////
/** Creates a new instance of ExcelConnect */
public ExcelConnect() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
initComponents();
setSize(600,600);

int sheetAnzahl = 3;
int zeilen, spalten, i, j, k;
}
///////////////////////////////////////////////////////////////////////////////////
public void readData() {

// Lesen aus der Excel-Tabelle
try {
Class.forName(DRIVER_NAME);
Connection conn = null;
conn = DriverManager.getConnection(DATABASE_URL);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(„select * from [CCS$]“);

while (rs.next() == true) {
String x1 = rs.getString(1);
String x2 = rs.getString(2);
String x3 = rs.getString(3);
String x4 = rs.getString(4);
String x5 = rs.getString(5);
String x6 = rs.getString(6);
String x7 = rs.getString(7);
String x8 = rs.getString(8);
String x9 = rs.getString(9);
String x10 = rs.getString(10);
String x11 = rs.getString(11);
String x12 = rs.getString(12);
String x13 = rs.getString(13);
String x14 = rs.getString(14);
String x15 = rs.getString(15);
String x16 = rs.getString(16);
String x17 = rs.getString(17);

System.out.println(x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + x12 + x13 + x14 + x15 + x16 + x17);
}

rs.close();
stmt.close();

} catch (ClassNotFoundException cnfe) {
System.out.println(„ClassNotFoundException Was Thrown!“);
cnfe.printStackTrace();
} catch (SQLException sqle) {
System.err.println(„SQLException Was Thrown!“);
sqle.printStackTrace();
}
}

///////////////////////////////////////////////////////////////////////////////////////

private void initComponents(){
JTextField textField = new javax.swing.JTextField();
int sheetAnzahl = 3;
// Vorbereitung für das Auffangen der Daten
String[] sheetName = new String[sheetAnzahl];
JTable[] table = new JTable[sheetAnzahl];
JTabbedPane registerkarte = new JTabbedPane();
String[] kopf;
String[][] daten;

content.add(new JScrollPane(table), BorderLayout.CENTER);
}

//////////////////////////////////////////////////////////////////////////////////////

public int getZeilen(){

}
public int getSpalten(){

}
public String getSheetName(){

}
public String getSpaltenName(){

}

///////////////////////////////////////////////////////////////////////////////////////

public static void main (String [] args) {

new ExcelConnect().setVisible(true);

}

}

Gruß
Nicole

Hallo,

Danke für Deine Antwort, aber meine Idee sieht etwas anders
aus, geht es nicht vielleicht auch so:

Deine Idee sieht doch prinzipiell genauso aus. Aber in deiner Idee ist nicht erkennbar, was du als Datenquelle für deine JTable hernehmen willst.

Hier liest du die Daten via JDBC ein, was ja auch an für sich so richtig ist.

> // Lesen aus der Excel-Tabelle  
> try {  
> Class.forName(DRIVER\_NAME);  
> Connection conn = null;  
> conn = DriverManager.getConnection(DATABASE\_URL);  
> Statement stmt = conn.createStatement();  
> ResultSet rs = stmt.executeQuery("select \* from [CCS$]");  
> while (rs.next() == true) {  
> String x1 = rs.getString(1);  
> String x2 = rs.getString(2);  
> ...  
> String x17 = rs.getString(17);  
>   
> System.out.println(x1 + x2 + ... + x17);  
> }  
> rs.close();  
> stmt.close();  
> } ...

Bei dem „System.out.println()“ musst du nun die Daten in Datenhaltungsobjekte schreiben. Dazu kannst du sie jetzt entweder in ein Table-Model schreiben, oder - was du anscheinend vorhattest - sie in ein 2-dimensionales Array schreiben.

Du hast in deiner Methode initComponents() ja eh schon sowas drin, nämlich hast du dort ein 2d-Array (String[][] daten) und ein Array mit den Spaltenüberschriften (String[] kopf). Wenn du jetzt statt dem System.out.println einfach die eingelesenen Daten in das daten-Array schreibst, dann kannst du ja ein

JTable tabelle = new JTable(daten, kopf); 

machen.
Dann hast du ja schon mal eine befüllte JTable. Den tust du einfach mit

registerkarte.add("Titel", new JScrollPane(tabelle));

noch auf dein TabbedPane. Das ganze machst du jetzt noch mit den anderen Excel-Mappen und dann hast du ja ein TabbedPane, das lauter Registerkarten mit Tabellen hat.

Das ist doch das, was du machen willst oder?

mfg
deconstruct

P.S: Wenn du daraus mal ne etwas komplexere Anwendung machen willst, würd ich dir aber in jedem Fall empfehlen, ein TableModel statt den Arrays zu verwenden.

P.S: Wenn du daraus mal ne etwas komplexere Anwendung machen
willst, würd ich dir aber in jedem Fall empfehlen, ein
TableModel statt den Arrays zu verwenden.

Na ja am Ende sollte das schon was komplexer werden, aber an ein TableModel habe ich mich bisher nicht rangetraut (keine Ahnung wo man anfängt udn wie man das möglichst gut implementiert!)

Danke zunächst mal, werde mich jetzt gleich mal wieder daransetzen.

Gruß
Nicole