You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;
    }
});

关键细节说明

  1. 流管理:使用try-with-resources语法,无需手动关闭BufferedWriter,Java会自动处理资源释放,避免资源泄漏。
  2. CSV格式兼容:escapeCsvContent方法处理了CSV的特殊规则,比如单元格内容包含逗号时必须用双引号包裹;内容中的双引号需要转义为两个双引号,确保导出的文件能被Excel等工具正确解析。
  3. 用户体验:通过JFileChooser让用户选择保存路径,自动补充.csv后缀,避免用户忘记添加。
  4. 数据遍历:先遍历表头列名写入第一行,再逐行遍历表格数据,依次写入每个单元格内容。

简化版(无文件选择框)

如果不需要用户选择路径,直接指定固定路径导出:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 05:53:10