简体   繁体   中英

Exporting JTable to txt file

Interesting little error here, hopefully someone can point out what's happening to me.

My program is able to write to a text file if there's approximately 4 or less entries in the JTable. Once there's more than that it fails and throws an exception that pops up my catch block. Not sure what's happening.

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");
        }

edit: added ex.printStackTrace(); and it shows an array index out of bounds exception

So, having a look at this...

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

I'm left wondering what getRowCount has to do with the number of columns ... pherhaps you meant getColumnCount ... which would means you could also get rid of the +1

Observations...

Having spent some time running over the code, there are a couple of other minor observations I can make.

First, I'd highly encourage the use of The try-with-resources Statement , this will allow you to better manage your resources.

I'd also suggest using StringJoiner to generate each line, it's simpler then trying to check if you're writing out the last column or not and allows you supply what ever delimiter you want to use

As an example...

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();
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM