java - 将JTable导出到txt文件

标签 java swing file-io jtable

这里有一个有趣的小错误,希望有人能指出我发生了什么。

如果 JTable 中的条目大约为 4 个或更少,我的程序就能够写入文本文件。一旦超过这个数量,它就会失败并抛出一个异常,弹出我的 catch block 。不确定发生了什么。

public void actionPerformed(ActionEvent e)
    {
        try
        {
            BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("payrollData.txt"));
            PrintWriter fileWriter = new PrintWriter(bufferedWriter);

            for(int i = 0; i < outputTable.getRowCount()+1; i++)
            {     
                String headers = String.valueOf(outputTable.getColumnName(i));
                fileWriter.print(headers);
                fileWriter.print("\t");
            }   

            fileWriter.println("");
            for(int i=0; i<model.getRowCount(); ++i)
            {
                for(int j=0; j<model.getColumnCount(); ++j)
                {
                    String s = model.getValueAt(i,j).toString();
                    fileWriter.print(s);
                    fileWriter.print("\t\t");
                }
                fileWriter.println("");
            }      
            fileWriter.close();
            JOptionPane.showMessageDialog(null, "Success. File saved to payrollData.txt");
        }catch(Exception ex)
        {
            JOptionPane.showMessageDialog(null, "Failure");
        }

编辑:添加了 ex.printStackTrace();它显示数组索引越界异常

最佳答案

所以,看看这个......

for(int i = 0; i < outputTable.getRowCount()+1; i++)
{     
    String headers = String.valueOf(outputTable.getColumnName(i));
    fileWriter.print(headers);
    fileWriter.print("\t");
} 

我想知道 getRowCount 与列数有什么关系......也许你的意思是 getColumnCount ...这意味着你也可以摆脱+1

观察结果...

花了一些时间运行代码后,我还可以得出一些其他的小结论。

首先,我强烈鼓励使用 The try-with-resources Statement ,这将使您能够更好地管理您的资源。

我还建议使用 StringJoiner 生成每一行,它比尝试检查您是否写出最后一列更简单,并允许您提供您想要使用的分隔符

举个例子...

DefaultTableModel model = new DefaultTableModel();
model.addColumn("Purpose");
model.addColumn("Name");
model.addColumn("Composition");
model.addColumn("Expiry");
model.addColumn("Stock");
model.addColumn("Cost");
model.addColumn("Type");
model.addColumn("Supplier");
model.addColumn("Supplier Number");
model.addColumn("Rack");

for (int index = 0; index < 10; index++) {

    Vector vector = new Vector();
    vector.add("p" + index);
    vector.add("n" + index);
    vector.add("c" + index);
    vector.add("e" + index);
    vector.add("s" + index);
    vector.add("c" + index);
    vector.add("t" + index);
    vector.add("s" + index);
    vector.add("s" + index);
    vector.add("r" + index);

    model.addRow(vector);

}

JTable table = new JTable(model);

try (BufferedWriter bw = new BufferedWriter(new FileWriter(new File("Test.txt")))) {
    StringJoiner joiner = new StringJoiner(",");
    for (int col = 0; col < table.getColumnCount(); col++) {
        joiner.add(table.getColumnName(col));
    }
    System.out.println(joiner.toString());
    bw.write(joiner.toString());
    bw.newLine();
    for (int row = 0; row < table.getRowCount(); row++) {
        joiner = new StringJoiner(",");
        for (int col = 0; col < table.getColumnCount(); col++) {
            Object obj = table.getValueAt(row, col);
            String value = obj == null ? "null" : obj.toString();
            joiner.add(value);
        }
        System.out.println(joiner.toString());
        bw.write(joiner.toString());
        bw.newLine();
    }
} catch (IOException exp) {
    exp.printStackTrace();
}

关于java - 将JTable导出到txt文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43151376/

相关文章:

java - 有没有办法在 couchbase 中提取 memcached 存储桶的顶部键

java - Fenster FensterVideoView Android 只播放声音,不播放视频

java - 混合来自 SWT 和 Swing 的框架 (JFrame)

java - 多线程返回值

java - 扫描 jtextfield 进行输入,写入文本文件,再次扫描新输入,直到用户关闭面板

java - ArrayIndexOutOfBoundsException 写入文件

c# - 复杂 .Net 对象图的快速读/写

java - 以编程方式获取 Java 小程序的屏幕截图

java - java 代码中的InputMismatchException 错误。请给一些建议

c++ - 如何从文件中读入类对象的 vector ?