2010-09-14 101 views
1

我只是在启动一些代码以从JTable提取值时出现问题,以便我最终可以将它们说成CSV文件以在Excel上查看。目前,我有使用下面的代码JTable中创建:如何将数据从JTable导出为CSV

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”按钮将调用。我将在稍后的阶段实现按钮监听器等,现在我想指出一些关于如何创建将通过查找其中包含的值的列和行的外观的指针。请注意,JTable将可扩展,当前的JTable仅用于测试目的。我知道有API可用,例如Apache,但我不想使用它们。

package com.alpha; 

public class Exporter extends JTableComponent 
{ 

public changeToCSV(){ 

} 


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

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

+0

构造函数不能返回任何东西。 – Qwerky 2010-09-14 14:27:03

+0

非常真实,我错误的编程术语错误。我应该说什么构造函数应该期望收到。 – 2010-09-14 15:19:25

+0

对于传递信息你可以做的是通过一个构造函数进行初始化,如下所示:public Exporter(JTable myJTable){this.myJTable = myJTable; }' – 2011-07-02 10:47:44

回答

0

Exporter类的方法定义无效。你需要包含返回类型才能编译这个代码(我认为这是你提到什么构造函数应该返回时的意思)。

对于一个简单的实现,你可以考虑返回一个String [] [],然后你可以将它翻译成双重嵌套循环中的csv数据。我已经在过去实施的东西在那里我有类似的结构:

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

ExportActionjavax.swing.Action的实现,并与相关的“导出为CSV格式”按钮。它引用了两个类:

  • ExportDestination:为CSV数据的逻辑目的地。这个接口提供了一个createWriter()方法,该方法被动作调用来创建一个“接收器”,用于向下喷射csv数据。 ExportDestination的具体实现是FileDestination,但我也实现了其他的,如ClipboardDestination
  • ExportFormatter:负责将表格行转换为csv数据。我一次选择了这一行:ExportAction将迭代每行以导出调用exportFormatter.writeTableRow并传入从导出目标创建的作者。这使我可以灵活地决定要导出哪些行(例如当前可见/当前选定/所有行)。

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

希望有所帮助。

+0

谢谢,我知道我需要返回一个类型,我只粘贴了我的Exporter类,以便人们了解我想实现的目标。正如我所说的,我真的很喜欢一些关于如何继续For循环的建议/指针,以及Exporter类将包含什么(作为字符串不正确)。 – 2010-09-14 15:17:53

0

出口商可以被做成助手类。但是,因为看起来你想导出任何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");

+0

嗨James,如果你能实现这个(CSVExporterUtils.java)类,它将会非常有用,人们可以将它用作csv util。 – itro 2012-05-30 12:30:39

1

也许你要考虑使用TSV(制表符分隔值)作为替代逗号分隔值(CSV)格式,由于需要转义逗号而经常造成困难。下面是实现一个JTable然后用TSV格式它出口到MS Excel文件的简单Java教程:How To Export Records From JTable To MS Excel

enter image description here

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

enter image description here

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

和作品像魅力! – 2018-03-09 18:39:24