将JTable保存为文本文件

时间:2013-01-04 22:48:35

标签: java swing jtable

我正在保存包含来自JTable的数据的.txt和.doc文件。在它保存的那一刻它将文本放在表格中,但是由于数据的长度不同而不适合。所以我想把日期布局如下:

第1列名称:第1行第1列数据

第2列名称:第1行第2列数据

第3列名称:第1行第3列数据

第4列名称:第1行第4列数据

第1列名称:第2行第1列数据

第2列名称:第2行第2列数据

第3列名称:第2行第3列数据

第4列名称:第2行第4列数据

我现在的代码是:

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

但请记住,我的每个表都有不同数量的列和行。 我已经尝试在列中保存列和数据了,我觉得这是解决问题的正确方法,但我无法弄清楚如何按照我提到的顺序打印它,

4 个答案:

答案 0 :(得分:3)

算法非常简单:

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

答案 1 :(得分:0)

我在下面提供了一个最小的例子。我给出了以下形式的输出:

名字:Kathy
姓氏:史密斯 运动:滑雪板 年数:5

名字:约翰 姓氏:Doe
运动:划船
年数: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
    }

答案 2 :(得分:0)

以下代码使用子字符串来允许列在文本文件中按顺序排列。它有点乱,但第一个for循环处理列标题,第二个for循环处理所有数据。如果要将每条数据的大小更改为20,请更改为您的首选大小。

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

答案 3 :(得分:0)

除了已经提供的答案之外,我还实施了一个解决方案,将内容保存到.csv(逗号分隔值)类型的文本文件中。

  • 首先,我创建了一个方法,将JTable的内容放入Object类型的二维数组中。我选择了Object类型,因为JTable中的各个列可以存储不同类型的数据,例如数字,字符串等。此方法位于我的GUI前端:

           /**
            *
            * 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;
    
            }
    
  • 其次,我创建了一个类,负责将二维对象数组(JTable内容)的内容写入磁盘。这概述如下:

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

生成的SampleData_TEST.csv文件的内容概述如下:

enter image description here

如上所述,csv文件格式可以在Microsoft Excel中打开,它可以比.doc或.txt文件更通用(取决于数据类型)