Wie kann der Inhalt einer Tabelle als CSV-Datei exportiert werden?

Das Beispiel zeigt ein Fenster mit einer dreispaltigen editierbaren Tabelle, die mittels eines JButton als CSV-Datei exportiert werden kann.

Das Tabellenfenster erzeugen

Im Konstruktor der Klasse wird initGUI() aufgerufen. Die Methode erzeugt die Tabelle, setzt diese auf einen JScrollPane, um die Tabelle ggfs. skrollen zu können, und fügt diesen dem zentralen Bereich eines JFrame hinzu. Unterhalb wird ein JButton platziert, der den Export initiiert.
Die Erzeugung der Tabelle wird durch die Methode initModel() vervollständigt, die den Inhalt der Tabellenzellen erzeugt und ihn dem Model der Tabelle hinzufügt 1 [36].

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public class TabelleZuCSV {

    private JTable table;
    private static final int ROWS = 5;
    private static final int COLS = 3;
    private static final String FILE_NAME = "/Users/joecze/Downloads/tabelle.csv";
    private static final String DELIMITER = ";";

    public TabelleZuCSV() {
        initGUI();
    }

    private void initGUI() {
        table = new JTable();
        JScrollPane sp = new JScrollPane(table);
        initModel();
        JButton exportButt = new JButton("csv exportieren");
        exportButt.addActionListener(e -> exportCSV());

        JFrame frame = new JFrame("Tabellenexport als CSV-Datei");
        frame.add(sp, BorderLayout.CENTER);
        frame.add(exportButt, BorderLayout.PAGE_END);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private void initModel() {
        String[] header = new String[] { "I", "II", "III" };
        String[][] content = new String[ROWS][COLS];
        for (int i = 0; i < ROWS; i++) {
            for (int j = 0; j < COLS; j++) {
                content[i][j] = "Inhalt " + i + "." + j;
            }
        }
        ((DefaultTableModel) table.getModel()).setDataVector(content, header);
    }

    private void exportCSV() {
        DefaultTableModel model = (DefaultTableModel) table.getModel();
        StringBuffer buff = new StringBuffer();
        String content = "";
        String newLine = System.getProperty("line.separator");

        for (int i = 0; i < COLS; i++) {
            buff.append(model.getColumnName(i));
            buff.append(DELIMITER);
        }
        buff.append(newLine);
        for (int i = 0; i < ROWS; i++) {
            for (int j = 0; j < COLS; j++) {
                content = (String) model.getValueAt(i, j);
                buff.append(content == null ? "" : content);
                buff.append(DELIMITER);
            }
            buff.append(newLine);
        }
        String s = buff.toString();
        System.out.println(s);

        try (FileWriter csv = new FileWriter(new File(FILE_NAME))) {
            csv.append(s);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new TabelleZuCSV());
    }
}

Export in CSV-Datei

Der Export des Tabelleninhalts erfolgt durch die Methode exportCSV(). Sie wird durch den Button über einen ActionListener direkt angesprochen [25]. In ihr werden zunächst das Tabellen-Model ermittelt [48] und ein StringBuffer-Objekt deklariert [49]. Letzteres wird benötigt, um beim Auslesen der einzelnen Tabellenzellen nicht für jede ein neues String-Objekt erzeugen zu müssen.
In einer ersten Schleife [53] werden die Spaltenbezeichner ausgelesen und, jeweils durch Feldtrenner separiert, dem StringBuffer hinzugefügt.

Der Inhalt der einzelnen Tabellenzellen wird dann innerhalb einer geschachtelten Schleife ausgelesen und wiederum dem Puffer angefügt. Auch hier erfolgt die Trennung der einzelnen Einträge jeweils durch das in DELIMETER gespeicherte Zeichen.
Bei einer leeren Tabellenzelle würde beim Export der String NULL angegeben. Um dies zu verhindern und in die CSV-Datei durch zwei aufeinander folgende Trennzeichen auch tatsächlich ein leeres Feld einzutragen, wird NULL hier durch einen Leerstring ersetzt [61]. Ein systemeigener Zeilenumbruch schließt das Ende jeder Zeile ab [64]. Beendet wird der Ausleseprozess dann durch die Konvertierung des Puffers in ein String-Objekt [66]. Es wird zur Kontrolle auf der Konsole ausgegeben [67].

Den letzten Schritt bildet das Schreiben in eine Datei mittels eines FileWriter-Objektes. Es wird innerhalb eines Try-with-Ressources-Statements gebildet. Hierzu wird lediglich das File-Objekt des Zielpfades an dessen Konstruktor übergeben [69].

Fenster mit Tabelle und Export-Button

1) Ein Model dient der Verwaltung des Inhaltes einer graphischen Komponente.

Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.