如何在Java Swing中将JTable的DefaultTableModel内容导出为CSV文件
将Java Swing的JTable数据导出为CSV文件(基于DefaultTableModel)
核心实现思路
通过遍历DefaultTableModel的表头和行数据,结合BufferedWriter将内容写入CSV文件,同时处理CSV格式的特殊字符(如逗号、换行、双引号),确保导出的文件符合标准CSV规范。
完整代码实现
以下是按钮点击事件的处理代码,包含文件选择、数据遍历和CSV写入逻辑:
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import javax.swing.DefaultTableModel; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.JTable; // 假设exportButton是导出按钮,table是你的JTable实例 exportButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { DefaultTableModel model = (DefaultTableModel) table.getModel(); JFileChooser fileChooser = new JFileChooser(); fileChooser.setDialogTitle("选择CSV保存路径"); fileChooser.setSelectedFile(new java.io.File("books.csv")); int userChoice = fileChooser.showSaveDialog(null); if (userChoice == JFileChooser.APPROVE_OPTION) { java.io.File targetFile = fileChooser.getSelectedFile(); // 自动补充.csv后缀 if (!targetFile.getName().toLowerCase().endsWith(".csv")) { targetFile = new java.io.File(targetFile.getAbsolutePath() + ".csv"); } // 使用try-with-resources自动关闭流 try (BufferedWriter writer = new BufferedWriter(new FileWriter(targetFile))) { // 写入表头 int columnCount = model.getColumnCount(); for (int col = 0; col < columnCount; col++) { writer.write(escapeCsvContent(model.getColumnName(col))); if (col < columnCount - 1) { writer.write(","); } } writer.newLine(); // 逐行写入表格数据 int rowCount = model.getRowCount(); for (int row = 0; row < rowCount; row++) { for (int col = 0; col < columnCount; col++) { Object cellValue = model.getValueAt(row, col); writer.write(escapeCsvContent(cellValue != null ? cellValue.toString() : "")); if (col < columnCount - 1) { writer.write(","); } } writer.newLine(); } JOptionPane.showMessageDialog(null, "CSV导出成功!", "提示", JOptionPane.INFORMATION_MESSAGE); } catch (IOException ex) { JOptionPane.showMessageDialog(null, "导出失败:" + ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE); ex.printStackTrace(); } } } // 处理CSV特殊字符:包含逗号、换行或双引号时,用双引号包裹,内部双引号转义为两个双引号 private String escapeCsvContent(String content) { if (content.contains(",") || content.contains("\n") || content.contains("\"")) { content = content.replace("\"", "\"\""); return "\"" + content + "\""; } return content; } });
关键细节说明
- 流管理:使用
try-with-resources语法,无需手动关闭BufferedWriter,Java会自动处理资源释放,避免资源泄漏。 - CSV格式兼容:
escapeCsvContent方法处理了CSV的特殊规则,比如单元格内容包含逗号时必须用双引号包裹;内容中的双引号需要转义为两个双引号,确保导出的文件能被Excel等工具正确解析。 - 用户体验:通过
JFileChooser让用户选择保存路径,自动补充.csv后缀,避免用户忘记添加。 - 数据遍历:先遍历表头列名写入第一行,再逐行遍历表格数据,依次写入每个单元格内容。
简化版(无文件选择框)
如果不需要用户选择路径,直接指定固定路径导出:
try (BufferedWriter writer = new BufferedWriter(new FileWriter("D:/exported_books.csv"))) { DefaultTableModel model = (DefaultTableModel) table.getModel(); // 写入表头 for (int col = 0; col < model.getColumnCount(); col++) { writer.write(escapeCsvContent(model.getColumnName(col))); if (col < model.getColumnCount() - 1) writer.write(","); } writer.newLine(); // 写入行数据 for (int row = 0; row < model.getRowCount(); row++) { for (int col = 0; col < model.getColumnCount(); col++) { Object val = model.getValueAt(row, col); writer.write(escapeCsvContent(val != null ? val.toString() : "")); if (col < model.getColumnCount() - 1) writer.write(","); } writer.newLine(); } } catch (IOException ex) { ex.printStackTrace(); }
内容的提问来源于stack exchange,提问作者JOSE JAVIER ALAY MENDEZ
相关产品推荐
相关产品推荐

