import java.awt.BorderLayout; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.text.DateFormat; import java.util.GregorianCalendar; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingUtilities; import javax.swing.table.DefaultTableModel; import org.odftoolkit.simple.TextDocument; import org.odftoolkit.simple.style.DefaultStyleHandler; import org.odftoolkit.simple.style.Font; import org.odftoolkit.simple.style.StyleTypeDefinitions.FontStyle; import org.odftoolkit.simple.style.StyleTypeDefinitions.HorizontalAlignmentType; import org.odftoolkit.simple.table.Cell; import org.odftoolkit.simple.table.Table; import org.odftoolkit.simple.text.Paragraph; public class JTableToODT { private JTable table; private Object[] head; private String exportFile = "Tabelle.odt"; public JTableToODT() { initGUI(); } private void initGUI() { head = new Object[]{ "eins", "zwei", "drei", "vier", "f\u00FCnf" }; Object[][] content = new Object[20][5]; for (int i = 0; i < content.length; i++) { for (int j = 0; j < content[i].length; j++) { content[i][j] = (i + 1) + "." + (j + 1); } } DefaultTableModel model = new DefaultTableModel(content, head); table = new JTable(model); table.setShowGrid(true); table.setAutoCreateRowSorter(true); table.setBackground(Color.LIGHT_GRAY); JFrame frame = new JFrame("Tabelle zu ODT"); frame.add(new JScrollPane(table), BorderLayout.CENTER); JButton butt = new JButton("Export"); butt.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { expToODT(exportFile); } }); frame.add(butt, BorderLayout.SOUTH); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLocationRelativeTo(null); frame.setVisible(true); } public void expToODT(final String fileName) { final DefaultTableModel model = (DefaultTableModel) table.getModel(); final int clmCnt = table.getColumnCount(); final int rowCnt = table.getRowCount(); Thread t = new Thread() { @Override public void run() { TextDocument outputOdt = null; try { outputOdt = TextDocument.newTextDocument(); // Header Paragraph para = Paragraph.newParagraph(outputOdt); para.applyHeading(); DateFormat df = DateFormat.getDateTimeInstance( DateFormat.SHORT, DateFormat.SHORT); para.setTextContent("Testtabelle - " + df.format(new GregorianCalendar().getTime())); outputOdt.getParagraphByIndex(0, false).remove(); // Tabelle Table table = outputOdt.addTable(rowCnt + 1, clmCnt); Cell cell; Object value; DefaultStyleHandler styleHandler; Font normal = new Font("Helvetica", FontStyle.REGULAR, 8); Font header = new Font("Helvetica", FontStyle.BOLD, 9); for (int i = 0; i <= rowCnt; i++) { for (int j = 0; j < clmCnt; j++) { cell = table.getCellByPosition(j, i); styleHandler = cell.getStyleHandler(); if (i == 0) { styleHandler.getTextPropertiesForWrite() .setFont(header); cell.setStringValue(head[j].toString()); } else { value = model.getValueAt( JTableToODT.this.table .convertRowIndexToModel(i - 1), j); cell.setHorizontalAlignment( HorizontalAlignmentType.LEFT); styleHandler.getTextPropertiesForWrite() .setFont(normal); cell.setStringValue( value == null ? "" : value.toString()); } } } outputOdt.save(fileName); String message = ""; if(new File(fileName).exists()) { message = " wurde erstellt"; } else { message = " konnte nicht erstellt werden"; } JOptionPane.showMessageDialog(null, fileName + message); } catch (Exception e) { e.printStackTrace(); } } }; t.start(); } public static void main(String[] args) { SwingUtilities.invokeLater(() -> new JTableToODT()); } }