Wie kann der Inhalt einer Tabelle als CSV-Datei exportiert werden?
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].
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.