2010-09-14 102 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