2013-01-04 56 views
1

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

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

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

回答

2

该算法非常简单:

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

嗨,感谢您的回复!此算法不起作用,因为它打印'列1名称:行1列1数据列1名称:行1列2数据列1名称:行1列3数据'等等 –

+0

没有办法:在每次迭代时,col是递增,并显示该列的列名称。 –

+0

抱歉误读你的文章。完美的作品,非常感谢你! –

0

我做的一个小例子在下面提供。我给出了输出的格式如下:

名字:凯西
姓:史密斯
体育:5

名字:约翰
姓:李四
单板滑雪多年的
#运动:划船
#年: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 
    } 
0

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

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