Patrick Dibb
Patrick Dibb

Reputation: 102

Saving JTable as text file

I am saving a .txt and .doc file containing the data from my JTable. At the minute when it saves it lays the text out like its in a table, but due to different lengths of data it does not fit. So I am trying to get the date to lay out as follows:

Column 1 name: row 1 column 1 data

Column 2 name: row 1 column 2 data

Column 3 name: row 1 column 3 data

Column 4 name: row 1 column 4 data

Column 1 name: row 2 column 1 data

Column 2 name: row 2 column 2 data

Column 3 name: row 2 column 3 data

Column 4 name: row 2 column 4 data

etc.

The code I have at the minute is:

private void saveResultsActionPerformed(ActionEvent evt) {


    int returnVal = fileChooser.showSaveDialog(NewJFrame.this);
    if (returnVal == JFileChooser.APPROVE_OPTION) {
        try {
            File file = fileChooser.getSelectedFile();
            PrintWriter os = new PrintWriter(file);
            os.println("");
            for (int col = 0; col < table.getColumnCount(); col++) {
                os.print(table.getColumnName(col) + "\t");
            }

            os.println("");
            os.println("");

            for (int i = 0; i < table.getRowCount(); i++) {
                for (int j = 0; j < table.getColumnCount(); j++) {
                    os.print(table.getValueAt(i, j).toString() + "\t");

                }
                os.println("");
            }
            os.close();
            System.out.println("Done!");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

But please keep in mind that each of my tables has different number of columns and rows. Ive tried saving the columns and data in arrays, and I have a feeling this is the right way to go around the problem but I cant figure out how to print it in the order i mentioned,

Upvotes: 1

Views: 24261

Answers (4)

user1328876
user1328876

Reputation:

In addition to the answers already provided, I have implemented a solution which saves the contents to a text file of type .csv (Comma-Separated Values).

  • Firstly, I have created a method which places the contents of a JTable into a two-dimensional array of type Object. I have chosen the type Object because various columns within a JTable may store different types of data e.g. numbers, Strings etc. This method is located within my GUI front-end:

           /**
            *
            * This method extrapolates the data from the JTable and places 
            * it into a two-dimensional object array. <p>
            * 
            * It then returns the object array in preparation for writing 
              to disk
            *
            * 
            * @param  aTable - the selected table for rendering into a two-
    
               dimensional object array
            *
            * @return Object[][] - the two-dimensional object array which 
    
               shall be written to disk
            * 
            * @see 
            *
            */
            public Object[][] getTableData(JTable aTable)
            {
    
              int rowCount = aTable.getModel().getRowCount();
              int columnCount = aTable.getModel().getColumnCount();
    
              Object[][] curTableData = 
    
                   new Object[rowCount][columnCount];
    
              for ( int row = 0; row < rowCount; row++)
              {
                for (int column = 0; column < columnCount; column++)
                {
    
                  curTableData[row][column]  = 
                       aTable.getModel().getValueAt(row,column);
    
         //         System.out.println("curTableData["+row+"]["+column+"] = "+curTableData[row][column]);
    
                }
              }
    
              return curTableData;
    
            }
    
  • Secondly, I have created a class that is responsible for writing the contents of the two-dimensional object array (JTable contents) to disk. This is outlined below:

    import java.io.*;
    
    /**
    *
    * This class is responsible for writing the 2D object to disk.
    * The 2d Object contains your JTable contents 
    * <p>
    *
    * @author      Mark Burleigh
    * @version     %I%, %G%
    * @since       1.0
    *
    */
    public class WriteJTableContents
    {
    /**
     *
     * This constructor takes in two parameters. It is also responsible
     * for writing the JTable contents to disk (to csv file)
     * 
     * 
     * @param  aData - the JTable data to be saved to disk
     * @param  afile  - the name of the file where the data shall be saved
     * (this is a .CSV type file)
     *
     *
     */
      public WriteRandomSampleData(Object[][] aData, String afile)
      {
            writeToDisk(aData,afile);
    
      // This method prints the two-dimensional array to the command console
      //  printData();
    
      }
    
      /**
      *
      * This method is responsible for writing the contents of a JTable (2d 
      * array object) to disk (csv text file)
      * <p>
      * 
      * @param  aData - the 2D data (Jtable contents) to be stored to disk
      * @param  aDatafile - the file where the data shall be stored
      * to disk. This shall be of type.CSV
      *
      * @return 
      * 
      * @see 
      *
      */
      public void writeToDisk(Object[][] aData, String aDatafile)
      {
    
        try
         {
    
            FileOutputStream fout =  new FileOutputStream(aDatafile, false);
    
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fout));
    
            //Headers
            bw.append("Script No., Candidate No., Mark, Grade,Script No., Candidate No., Mark, Grade");
            // End of data row (Jable row) so append new line character in csv file
            bw.append('\n');
    
            for (int row = 0; row < aData.length; row++)
            {
    
              for (int column = 0; column < aData[row].length; column++)
              {
    
                if(aData[row][column] == null)
                {
                  bw.append("null");
                  // The comma separated value
                  bw.append(',');
                }
                else
                {
                  /* In my particular example, I am doing some checking on 
    
                      the 2d array for types: 
                      if the data is not of type null (as checked above)
                      then it must be of type Integer.
                      This is because the 2D data array only contains data of either
                      Integer or null
    
                      each of these object types have a method called toString().
                      we need this in order to convert the types to a string prior to wrting them to
                      the file.
    
                  */
                  bw.append(aData[row][column].toString());
                  bw.append(',');
                }
    
              }//end column loop (inner loop)
    
              bw.append('\n');
    
            }//end row loop (outer loop)
    
            bw.close();
    
        }
        catch (Exception e)
        {
    
            e.getStackTrace();
        }
    
      }//end of readFileFromDisk
    
      /**
      *
      * These methods is responsible for printing the random sample scripts
      * Into the command console.
      * <p>
      * 
      *
      */
      public void printData()
      {
          //System.out.println();
          //System.out.println("=======WriteRandomSampleData Class===========");
          //System.out.println();
    
          for (int row = 0; row < data.length; row++)
          {
            for (int column = 0; column < data[row].length; column++)
            {
                System.out.println("data["+row+"]["+column+"] = " +data[row][column]);
            }
          }
    
      }
    
    //==================Instance Variables=============================
      // JTable contents hedata
      private Object[][] data;
    
     //====================Test Driver============================
    
      public static void main(String args[])
      {
       // file seperator for windows platform '\\'
        String aFileLocation = "C:\\dirA\\subdir1\\subdir2\\";
    
        // Dummy values - 2D array which stores the contents of a 
        // JTable into a csv text file
         Object[][] testData = new Object [][] {
    
                        {new Integer(1),new Integer(1),null,null,new Integer(11),new Integer(1),null,null},
                        {new Integer(2),new Integer(1),null,null,new Integer(12),new Integer(1),null,null},
                        {new Integer(3),new Integer(1),null,null,new Integer(13),new Integer(1),null,null},
                        {new Integer(4),new Integer(1),null,null,new Integer(14),new Integer(1),null,null},
                        {new Integer(5),new Integer(1),null,null,new Integer(15),new Integer(1),null,null},
                        {new Integer(6),new Integer(1),null,null,new Integer(16),new Integer(1),null,null},
                        {new Integer(7),new Integer(1),null,null,new Integer(17),new Integer(1),null,null},
                        {new Integer(8),new Integer(1),null,null,new Integer(18),new Integer(1),null,null},
                        {new Integer(9),new Integer(1),null,null,new Integer(19),new Integer(1),null,null},
                        {new Integer(10),new Integer(1),null,null,new Integer(20),new Integer(1),null,null}
    
                         };
    // SampleData_TEST.csv gets created in the particular directory
    // and the file gets populated with the contents of the JTable
                         new WriteRandomSampleData(testData,aFileLocation2+"SampleData_TEST.csv");
    
    
      }
    }
    

The contents of the resulting SampleData_TEST.csv file are outlined below:

enter image description here

As depicted above, the csv file format can be opened in Microsoft Excel which can be more versatile (depending on the type of data) than a .doc or .txt file

Upvotes: 0

silence
silence

Reputation: 1

The following code uses substrings to allow for the columns to be orderly within the textfile. Its a bit messy but the first for loop handles column headers and the second for loop handles all the data. If you want to change the size of each piece of data change 20 to your prefered size.

BufferedWriter bfw = new BufferedWriter(new FileWriter(
                    "Data.txt"));

            for (int i = 0; i < table.getColumnCount(); i++) {//first loop is used for titles of each column

                String name = String.valueOf(table.getColumnName(i));

                if (name.length() > 20) {//20 (characters long) is the constant I chose to make each value
                    name = name.substring(0, 20);
                } else if (name.length() == 20) {

                } else {
                    String spaces = "";
                    int diff = 20 - name.length();
                    while (diff > 0) {
                        spaces = spaces + " ";
                        diff--;
                    }
                    name = name.concat(spaces);
                }

                bfw.write(name);
                bfw.write("\t");
            }

            for (int i = 0; i < table.getRowCount(); i++) {//for all the data in the Jtable excluding column headers
                bfw.newLine();
                for (int j = 0; j < table.getColumnCount(); j++) {

                    if (table.getValueAt(i, j) == null) {
                        bfw.write("                    ");
                        bfw.write("\t");
                    }

                    else {

                        String name = String.valueOf((table
                                .getValueAt(i, j)));

                        if (name.contains("(")) {
                            name = name.substring(0, name.indexOf("("));
                        }

                        if (name.length() > 20) {
                            name = name.substring(0, 20);
                        } else if (name.length() == 20) {

                        } else {
                            String spaces = "";
                            int diff = 20 - name.length();
                            while (diff > 0) {
                                spaces = spaces + " ";
                                diff--;
                            }
                            name = name.concat(spaces);
                        }

                        bfw.write(name);
                        bfw.write("\t");
                    }
                }
            }

Upvotes: 0

Snorre
Snorre

Reputation: 333

A minimal example I made is provided below. I gives the following form of output:

First Name: Kathy
Last Name: Smith
Sport: Snowboarding
# of Years: 5

First Name: John
Last Name: Doe
Sport: Rowing
# of Years: 2

        String[] columnNames = {"First Name", "Last Name","Sport","# of Years"};

    Object[][] data = {
            {"Kathy", "Smith", "Snowboarding", "5"},
            {"John", "Doe", "Rowing", "2"},
            {"Sue", "Black", "Knitting", "8"},
            {"Jane", "White", "Speed reading", "10"},
            {"Joe", "Brown", "Pool", "20"}
    };

    JTable table = new JTable(data, columnNames);

    for(int row = 0; row < table.getRowCount(); row++) {

        for(int column = 0; column < table.getColumnCount(); column++) {
            System.out.print(table.getColumnName(column) + ": ");
            System.out.println(table.getValueAt(row, column));
        }
        System.out.println(""); // Add line space
    }

Upvotes: 0

JB Nizet
JB Nizet

Reputation: 692231

The algorithm is quite simple:

for (int row = 0; row < table.getRowCount(); row++) {
    for (int col = 0; col < table.getColumnCount(); col++) {
        os.print(table.getColumnName(col));
        os.print(": ");
        os.println(table.getValueAt(row, col));
    }
}

Upvotes: 3

Related Questions