# Daten aus einer Excel oder CSV Datei in eine Jtable auslesen



## Hasba (21. März 2005)

Hallo Zusammen,
ich muss ein Programm in Java schreiben, das mir es ermöglicht die Daten aus eine Excel-Datei ausliest und sie in eine JTable ausgibt.
bin für jede Hilfe dankbar
Gruss


----------



## Snape (21. März 2005)

Aus CSV in eine JTable wäre (für Fortgeschrittene/Profis) recht einfach, aus einer Excel-Tabelle könnte mehr als fummelig werden.


----------



## Hasba (21. März 2005)

bin aber kein Profi! kannst Du mir dann helfen! 
PS: bis jetzt habe keine Tabelle in Java estellt, es sollte so ausehen:
2 Spalten und unendliche Zeilen.
Danke im voraus


----------



## Snape (21. März 2005)

Das habe ich in 10min hingezimmert. Ob Du dabei aber viel lernst, wage ich zu bezweifeln...


```
/*
 * Created on 21.03.2005
 */

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import java.io.*;

public class CSVTest extends JFrame
{
  private class MeinWindowListener extends WindowAdapter
  {
    public void windowClosing(WindowEvent arg0)
    {
      System.exit(0);
    }
  }

  private String[] columnNamen = { "Spalte 1", "Spalte 2" };
  private DefaultTableModel tableModel;
  private JButton button;
  private JComponent contentPane = (JComponent) getContentPane();

  CSVTest()
  {
    super("CSV Test");
    setSize(800, 600);
    initLayout();
    setLocationRelativeTo(null);
    addWindowListener(new MeinWindowListener());
    setVisible(true);
    setResizable(true);
  }

  void initLayout()
  {
    contentPane.setLayout(new BorderLayout());

    tableModel = new DefaultTableModel(null, columnNamen);
    JTable tableZahlen = new JTable(tableModel);
    tableZahlen.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

    JScrollPane scrollPane = new JScrollPane(tableZahlen);
    scrollPane.setPreferredSize(new Dimension(300, 300));

    JPanel jpTable = new JPanel();
    jpTable.add("Center", scrollPane);
    contentPane.add("West", jpTable);

    button = new JButton("Einlesen");
    button.addActionListener(new ActionListener()
          {
      		public void actionPerformed(ActionEvent e)
      		{
      		  readFile();
      		}
          });

    JPanel jpButton = new JPanel();
    jpButton.add(button);
    contentPane.add("South", jpButton);

  }

  /**
   * 
   */
  protected void readFile()
  {
    try{
      BufferedReader reader = new BufferedReader(new FileReader("C:\\Mappe1.csv"));
      
      String strLine;
      while ( (strLine = reader.readLine()) != null )
      {
        String[] items = strLine.split(";");
        tableModel.addRow(items);
      }
      tableModel.fireTableDataChanged();
    }
    catch(FileNotFoundException e) {}
    catch(IOException e) {}
  }

  public static void main(String[] args)
  {

    CSVTest frame = new CSVTest();
    frame.setLocation(150, 90);
    frame.setSize(600, 500);
    frame.setResizable(true);
    frame.setVisible(true);
  }
}
```

Mappe1.csv:

1;Hund
2;Katze
3;Maus
4;Tiger
5;Panther
6;Giraffe
7;Jaguar
8;Esel
9;Pferd


----------



## Thomas Darimont (21. März 2005)

Hallo!

Schau mal hier:

```
/**
 * 
 */
package de.tutorials;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.filechooser.FileFilter;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

/**
 * @author Administrator
 * 
 */
public class CSVJTableExample extends JFrame {

	private JTable table;

	private JButton btnAction;

	private JFileChooser fileChooser = new JFileChooser() {
		{
			setFileFilter(new FileFilter() {

				@Override
				public boolean accept(File f) {
					return f.getName().toLowerCase().endsWith("csv");
				}

				@Override
				public String getDescription() {
					return "CSV Datei (Comma Seperated Values)";
				}

			});
		}
	};

	public CSVJTableExample() {
		super("CSVJTableExample");
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		btnAction = new JButton("Dateiauswahl");
		btnAction.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (!(fileChooser.showOpenDialog(CSVJTableExample.this) == JFileChooser.APPROVE_OPTION))
					return;
				final File file = fileChooser.getSelectedFile();
				if (file == null)
					return;

				SwingUtilities.invokeLater(new Runnable() {
					public void run() {
						TableModel model = parseCSVAndCreateTableModel(file);
						table.setModel(model);
					}
				});

			}
		});

		table = new JTable();
		add(new JScrollPane(table), BorderLayout.CENTER);
		add(btnAction, BorderLayout.SOUTH);

		pack();
		setVisible(true);
	}

	private TableModel parseCSVAndCreateTableModel(File file) {

		Vector v = new Vector();
		BufferedReader br = null;
		try {
			br = new BufferedReader(new FileReader(file));

			// Überschriften stehen in erster Zeile
			String[] rowItems = br.readLine().split(";");
			Vector header = new Vector(Arrays.asList(rowItems));
			while (br.ready()) {
				rowItems = br.readLine().split(";");
				v.add(new Vector(Arrays.asList(rowItems)));
			}
			DefaultTableModel model = new DefaultTableModel(v, header);
			return model;

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				br.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		return null;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new CSVJTableExample();
	}

}
```

Gruß Tom


----------



## Hasba (21. März 2005)

Danke das hilft viel! merci


----------



## Hasba (22. März 2005)

Hallo zusammen,
ich habe jetzt die Daten aus einer CSV-Datei ausgelesen und wierder in eine CVS-Datei gespreichert(vorerst), diese Daten möchte ich  gern sortieren z.B. nach Nachnamen,  und die Werte, die zu diesem Nachnamen gehören summieren. Anschliessend das Ergebnis in eine JTable ausgebe.
für jede Hilfe bin sehr dankbar.


----------



## Snape (22. März 2005)

Moin,
da wirst Du um ein eigenes TableModel nicht herumkommen.


----------



## Hasba (22. März 2005)

Danke aber deine Antwort hilft mir nicht! bin nur ein Anfänger und häge zurzeit an einer Aufgabe! 
trotzdem Danke.


----------



## Hasba (29. März 2005)

Hallo user Profi,
ich habe mir jetzt die Daten soweit aus der CSV-Datei geholt und in eine JTable dargestellt. Die Daten sind auch sortiert(string).Nun möchte ich z.b. Spalten- und/oder Zeilenweise eine Markierung machen um die Daten mit Strg und C zu kopieren und manuell in eine ander Datei einfüge.
Die Markierung kann bis jetzt machen mit:
table.setSelectionForeground(Color.YELLOW);
    table.setSelectionBackground(Color.RED);
    table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

allerdings wenn es eine grosse Datei ist ist dann umstandiger. Deshalb micht dann z.B. mit einem Doppelklick auf die Spaltebeschriftung die ganze Spalte markieren.

für jede Hilfe bin sehr dankbar. Falls Du den Code brauchst kann ich Dir schicken.

Danke vielmals


----------



## maxhd2 (11. Mai 2006)

ich hab da auch so meine probleme obwohl ich den code hier grossteils übernommen habe, ich will die strings in eine liste stopfen, 
derzeit schreib ich sie noch debugmässig raus:


```
try{
		       BufferedReader reader = new BufferedReader(new FileReader("C:\\eclipse\\workspace\\FlightBooking\\Mappe1.csv"));
		       System.out.println("hallo");
		       String strLine;
		       String[] items;
		       while ( reader.ready()) {
		         items = reader.readLine().split(";");
		         System.out.println(items);
		       }
		      
		     }
		     catch(FileNotFoundException e) {}
		     catch(IOException e) {}
```

und rauskommen tut:
hallo
[Ljava.lang.String;@1cd2e5f    :-( 

richtiger inhalt von mappe1: bla;lol;rofl;test


----------



## teppi (12. Mai 2006)

Hi !

String[] items;

Items ist ein Array und somit über einen Index auszulesen.

Bsp: System.out.println(items[0]);

Gruß Stefan


----------



## cHucKy51 (19. April 2007)

Hallo!
Ich möchte nochmal auf die Frage von maxhd2 zurückkommen.
Wie kann ich die Strings in eine Liste stecken, wenn ich ein eigenes TableModel habe
und NICHT das DefaultTableModel benutze?

Gruß


----------



## Snape (19. April 2007)

Einfach so in ein Array oder eine Liste legen, dass sie in den TableModel-Interfacemethoden ausgelesen werden können.


----------



## cHucKy51 (20. April 2007)

Ok, habe es jetzt mit einer ArrayList gelöst!


----------



## chaos-n (27. September 2007)

Hallo,

der Quellcode von Snap war für mich sehr hilfreich. Ich bin auch Anfänger und wollte nachfragen, ob mir nicht jemand erklären kann, wie ich jetzt die eingelesenen Datensätze verändern kann (Also Überschreiben) und sie dann wieder speichern kann? Hat vielleicht für mich jemand schon eine Lösung, die er hier posten oder mir zuschicken kann? Oder weiß jemand, wo man sowas finden kann? Das wäre echt hilfreich für mich! Danke schon mal!


----------

