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

+0

Очень верно, мне плохо для неправильной терминологии программирования. Я должен сказать, что должен ожидать конструктор. –

+0

Для передачи информации вы можете выполнить некоторую инициализацию через конструктор следующим образом: 'public Exporter (JTable myJTable) {this.myJTable = myJTable; } ' –

ответ

0

Недопустимые определения метода класса экспортера. Вам нужно включить типы возвращаемых данных, чтобы этот код мог компилироваться (я полагаю, это то, что вы имеете в виду, когда упоминаете о том, что должен вернуть конструктор).

Для простой реализации вы можете рассмотреть возможность возврата String [] [], который затем можно преобразовать в данные csv во вложенном замкнутом цикле. Я осуществил что-то в прошлом, когда я имел структуру, похожую на:

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

ExportAction является реализация javax.swing.Action и связан с кнопкой «Экспорт в CSV». Он ссылается на два класса:

  • ExportDestination: Логические назначения для данных в формате CSV. Этот интерфейс предлагает метод createWriter(), который вызывается действием, чтобы создать «приемник», который может сжать данные csv вниз. Конкретной реализацией ExportDestination является FileDestination, но я также реализовал другие, такие как ClipboardDestination.
  • ExportFormatter: Ответственный за перевод строк таблицы в данные csv. Я решил сделать это по одной строке за один раз: ExportAction будет перебирать каждую строку для экспорта вызова exportFormatter.writeTableRow и передачи в записи, созданной из пункта назначения экспорта. Это дало мне гибкость, чтобы решить, какие строки экспортировать (например, те, которые в настоящее время видимы/в настоящее время выбраны/все строки).

Так что в ответ на ваш первоначальный вопрос я ничего не возвращал из своих различных методов экспорта. Вместо этого, когда действие было вызвано, я предлагаю пользователю выбрать параметры (например, имя файла), которые я бы установил перед вызовом моей программы экспорта.

Надеюсь, что это поможет.

+0

Спасибо, я понимаю, что мне нужно вернуть тип, я только вставил свой класс Exporter, чтобы люди имели представление о том, чего я хотел достичь. Как я уже сказал, мне бы очень понравились советы/указатели о том, как продолжить цикл For и что будет содержать класс Exporter (поскольку строка не будет правильной). –

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

Привет, Джеймс, это будет очень полезно, если вы сможете реализовать этот (CSVExporterUtils.java) класс, чтобы люди могли использовать его как утилиту csv. – itro

1

Может быть, вы хотите, чтобы рассмотреть вопрос об использовании TSV (значения, разделенные табуляцией) в качестве альтернативы, разделенных запятыми формат (CSV) , что часто вызывает трудности из-за необходимости избегать запятых. Вот простой Java учебник, который реализует JTable затем экспортирует ее в файл MS Excel, используя формат TSV: How To Export Records From JTable To MS Excel

enter image description here

Ниже экспортируемого файла Excel (вручную отрегулировать ширину столбцов)

enter image description here

1

Я использовал следующий метод для извлечения данных как csv из JTable, надеюсь, это кому-то поможет

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

и работает как очарование! –

Смежные вопросы