1

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

4 に答える 4

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));
    }
}
于 2013-01-04T23:21:12.110 に答える
0

私が作成した最小限の例を以下に示します。次の形式の出力を提供します。

名: Kathy
姓: スミス
スポーツ: スノーボード 年数
: 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
    }
于 2013-01-04T23:41:42.703 に答える
0

すでに提供されている回答に加えて、内容を .csv (カンマ区切り値) のテキスト ファイルに保存するソリューションを実装しました。

  • まず、JTable の内容を Object 型の 2 次元配列に配置するメソッドを作成しました。JTable 内のさまざまな列がさまざまなタイプのデータ (数値、文字列など) を格納する可能性があるため、Object 型を選択しました。このメソッドは、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;
    
            }
    
  • 次に、2 次元オブジェクト配列の内容 (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 ファイルの内容は、次のとおりです。

ここに画像の説明を入力

上記のように、csv ファイル形式は Microsoft Excel で開くことができ、.doc または .txt ファイルよりも汎用性が高くなります (データの種類によって異なります)。

于 2016-04-11T17:21:47.747 に答える