【问题标题】:How to export data from JTable to CSV如何将数据从 JTable 导出到 CSV
【发布时间】:2010-09-14 14:24:39
【问题描述】:

我只是在开始一些代码以从 JTable 中提取值时遇到问题,以便我最终可以将它们说成 CSV 文件以便在 Excel 上查看。目前我有一个使用以下代码创建的 JTable:

package com.alpha;

import javax.swing.*;
import java.awt.*;

public class JTableComponent{
  public static void main(String[] args) 
{
    new JTableComponent();
  }

  public JTableComponent(){
    JFrame frame = new JFrame("Whiteboard Test");
    JPanel panel = new JPanel();
    String data[][] = {{"Company A","1000","1"},{"Company B","2000","2"},
     {"Company C","3000","3"},{"Company D","4000","4"}};

      String col[] = {"Company Name","Shares","Price"};
    JTable table = new JTable(data,col);
    panel.add(table,BorderLayout.CENTER);

    frame.add(panel);
    frame.setSize(300,200);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
} 

我已经启动了一个新类,只要按下“导出到 CSV”按钮就会调用它。我将在稍后阶段实现按钮侦听器等,现在我想要一些关于如何创建 for 外观的指针,该外观将遍历列和行以查找其中包含的值。请注意,JTable 将是可扩展的,当前的 JTable 仅用于测试目的。我知道有可用的 API,例如 Apache 的 API,但我不想使用它们。

package com.alpha;

public class Exporter extends JTableComponent
{

 public changeToCSV(){

 }


 public changeToCSV()
 {
   for(int j = 0; j < table.getColumnCount(); j++) {
 }
}

我无法决定构造函数应该接收什么。非常感谢您提前提供的帮助!

【问题讨论】:

  • 构造函数不能返回任何东西。
  • 非常正确,我对错误的编程术语不好。我应该说构造函数应该期望收到什么。
  • 为了传递信息,您可以通过构造函数进行一些初始化,如下所示:public Exporter( JTable myJTable ){ this.myJTable = myJTable; }

标签: java jtable


【解决方案1】:

我使用以下方法从 JTable 中提取数据为 csv,希望这对某人有所帮助

public static boolean exportToCSV(JTable tableToExport,
        String pathToExportTo) {

    try {

        TableModel model = tableToExport.getModel();
        FileWriter csv = new FileWriter(new File(pathToExportTo));

        for (int i = 0; i < model.getColumnCount(); i++) {
            csv.write(model.getColumnName(i) + ",");
        }

        csv.write("\n");

        for (int i = 0; i < model.getRowCount(); i++) {
            for (int j = 0; j < model.getColumnCount(); j++) {
                csv.write(model.getValueAt(i, j).toString() + ",");
            }
            csv.write("\n");
        }

        csv.close();
        return true;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return false;
}

【讨论】:

    【解决方案2】:

    也许您想考虑使用 TSV(制表符分隔值)作为逗号分隔值 (CSV) 格式的替代方案,这种格式通常会因为需要转义逗号而导致困难。这是一个简单的 java 教程,它实现了一个 JTable,然后使用 TSV 格式将其导出到 MS Excel 文件:How To Export Records From JTable To MS Excel

    下面是导出的excel文件(手动调整列宽)

    【讨论】:

      【解决方案3】:

      Exporter 类方法定义无效。您需要包含返回类型才能编译此代码(我想这就是您提到构造函数应返回的内容时的意思)。

      对于一个简单的实现,您可以考虑返回一个 String[][],然后您可以在双重嵌套循环中将其转换为 csv 数据。我在过去实现了一些类似的结构:

      ExportAction
       |
       |--> ExportDestination
       |--> ExportFormatter
      

      ExportActionjavax.swing.Action 的实现,与“导出到 csv”按钮相关联。它引用了两个类:

      • ExportDestination:csv 数据的逻辑目的地。该接口提供了一个方法 createWriter() ,该方法由操作调用以创建一个“接收器”,将 csv 数据向下喷射。 ExportDestination 的具体实现是 FileDestination,但我也实现了其他的,例如 ClipboardDestination
      • ExportFormatter:负责将表格行翻译成csv数据。我选择一次做一行:ExportAction 将遍历每一行以导出调用exportFormatter.writeTableRow 并传入从导出目标创建的编写器。这让我可以灵活地决定要导出哪些行(例如,当前可见/当前选定的行/所有行)。

      所以在回答您最初的问题时,我没有从我的各种导出方法中返回任何内容。相反,当调用该操作时,我会提示用户选择参数(例如文件名),然后在调用我的导出例程之前设置这些参数。

      希望对您有所帮助。

      【讨论】:

      • 谢谢,我知道我需要返回一个类型,我只粘贴了我的 Exporter 类,以便人们知道我想要实现的目标。正如我所说,我真的很想要一些关于如何继续 For 循环以及 Exporter 类将包含什么的建议/指针(因为 String 是不正确的)。
      【解决方案4】:

      Exporter 可以变成一个辅助类。但是,由于您似乎想要导出任何 JTable,因此您可以做一些简单的事情来切换到实用程序方法。

      public class CSVExporterUtils{
          public static void exportToCSV( JTable tableToExport, String pathToExportTo ){
              // Pseudocode below
              /*
              Open file and test if valid path
      
              Loop through each table line
                  Loop through each column
                      Get value at line, column
                          Add value to StringBuilder plus a comma
                  Write contents of StringBuilder to file
                  And add return using System.getProperty("line.separator")
              End Loop
      
              Close file
              */
          }
      }
      

      然后您可以按如下方式调用此方法:

      CSVExporterUtils.exportToCSV( myJTable, "c:/myExportedData.csv" );

      【讨论】:

      • 嗨,James,如果你能实现这个 (CSVExporterUtils.java) 类,人们可以将它用作 csv util,这将非常有用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-09
      • 2015-11-03
      • 2014-07-26
      • 2018-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多