Как экспортировать данные из JTable в CSV - PullRequest
1 голос
/ 14 сентября 2010

У меня просто проблемы с запуском небольшого кода для извлечения значений из 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».Я буду реализовывать прослушиватели кнопок и т. Д. На более позднем этапе, сейчас я хотел бы несколько советов о том, как создать внешний вид, который будет проходить по столбцам и строкам в поисках содержащихся в них значений.Просто обратите внимание, JTable будет масштабируемым, текущий JTable предназначен только для целей тестирования.Я знаю, что есть доступные API, такие как Apache, но я бы предпочел не использовать их.

package com.alpha;

public class Exporter extends JTableComponent
{

 public changeToCSV(){

 }


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

У меня проблемы с определением того, что должен ожидать конструктор.Большое спасибо за вашу помощь заранее!

Ответы [ 4 ]

1 голос
/ 11 августа 2017

Я использовал следующий метод для извлечения данных как 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;
}
1 голос
/ 27 апреля 2012

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

enter image description here

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

enter image description here

0 голосов
/ 02 июля 2011

Экспортер может быть превращен в вспомогательный класс.Однако, поскольку кажется, что вы хотите экспортировать любой 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
        */
    }
}

Затем вы можете вызвать этот метод следующим образом:1005 *CSVExporterUtils.exportToCSV( myJTable, "c:/myExportedData.csv" );

0 голосов
/ 14 сентября 2010

Недопустимые определения метода класса Exporter.Вам нужно включить типы возврата, чтобы этот код компилировался (я полагаю, это то, что вы имеете в виду, когда упоминаете о том, что должен возвращать конструктор).[], который вы можете затем преобразовать в CSV-данные в дважды вложенном цикле.В прошлом я реализовывал что-то вроде структуры:

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...