Экспорт в .csv с использованием Java не выводит файл - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь экспортировать содержимое JTable в файл .csv. Я попробовал некоторый код, ошибки нет, но файл, который я намеревался записать, не записывается. Кто-нибудь мог понять почему? Спасибо

public static boolean exportToCSV(JTable resultsTable) {
   try {

    TableModel model = resultsTable.getModel();
    FileWriter csv = new FileWriter(new File("/tmp/export.csv"));

    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 ]

1 голос
/ 20 июня 2019

Практика с простым файлом

Сделайте шаги ребенка.Во-первых, убедитесь, что вы успешно открываете файл.

Современная Java предлагает Path, File и Files классы для упрощения работы с файлами в хранилище.

Пример:

package work.basil.example;

import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Csver
{
    public static void main ( String[] args )
    {
        Csver app = new Csver() ;
        app.writeDummyFile() ;
    }

    private void writeDummyFile ()
    {
        Path path = Paths.get( "/Users/basilbourque/dummy.txt" ) ;
        // Use try-with-resources to auto-close the file if successfully opened.
        try ( 
            BufferedWriter writer = Files.newBufferedWriter( path ) ;  // Will be automatically closed if successfully opened.
        )
        {
            writer.write( "Bonjour le monde!" ) ;
        } catch ( IOException e )
        {
            e.printStackTrace() ;
        }
    }

}

Использование библиотеки для CSV

Далее, для файлов с разделителями CSV или Tab, или подобных, используйте библиотеку.Я использую Apache Commons CSV .В поиске переполнения стека можно найти множество примеров использования этой и других подобных библиотек для чтения и записи файлов такого типа.

Используйте CSVFormat для определения типа файла.Здесь мы используем стандарт CSV, как определено RFC 4180 .Обратите внимание, что стандарт CSV использует CRLF (CARRIAGE RETURN LINE FEED) для обозначения разрывов строк, а не LF (LINE FEED), наблюдаемый на Unix-подобных платформах.

При открытии файла указывается UTF-8 кодировка символов.UTF-8, как правило, лучшая кодировка для использования;он охватывает все символы Unicode и является расширенным набором US-ASCII .

Метод CSVPrinter::print добавляет поле за раз при выводе строки.Мы завершаем строку, вызывая CSVPrinter::println.

Я переименовал ваши i & j переменные, чтобы они стали значимыми.

Я добавил имена столбцов в верхней части файла.Вы можете оставить эту функцию на свое усмотрение или отказаться от нее.

Обратите внимание, как мы используем синтаксис try-with-resources для автоматического закрытия нашего файла.

package work.basil.example;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import org.apache.commons.csv.CSVRecord;

import javax.swing.*;
import javax.swing.table.TableModel;
import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Csver
{
    public static void main ( String[] args )
    {
        Csver app = new Csver();

        // Practice writing a simple file.
        app.writeDummyFile();

        // Write out the data in a JTable to standard CSV file.
        JTable jtable = app.newJTable();
        app.writeCSV( jtable.getModel() );

        System.out.println( "« fin »" );
    }

    private void writeCSV ( final TableModel model )
    {
        CSVFormat format = CSVFormat.RFC4180;
        Path path = Paths.get( "/Users/basilbourque/animals.csv" );
        try (
                BufferedWriter writer = Files.newBufferedWriter( path , StandardCharsets.UTF_8 ) ;
                CSVPrinter printer = new CSVPrinter( writer , format ) ;
        )
        {
            // Print column headers, if you want.
            for ( int columnIndex = 0 ; columnIndex < model.getColumnCount() ; columnIndex++ )
            {
                printer.print( model.getColumnName( columnIndex ) );
            }
            printer.println();

            // Print rows.
            for ( int rowIndex = 0 ; rowIndex < model.getRowCount() ; rowIndex++ )
            {
                for ( int columnIndex = 0 ; columnIndex < model.getColumnCount() ; columnIndex++ )
                {
                    printer.print( model.getValueAt( rowIndex , columnIndex ) );
                }
                printer.println();
            }
        } catch ( IOException e )
        {
            e.printStackTrace();
        }
    }

    private JTable newJTable ()
    {
        String[] columnNames = { "Species" , "Name" };
        Object[][] data = {
                { "Dog" , "Delilah" } ,
                { "Cat" , "René" } ,
                { "Bird" , "Jordan" }
        };
        JTable table = new JTable( data , columnNames );
        return table;
    }

    private void writeDummyFile ()
    {
        Path path = Paths.get( "/Users/basilbourque/dummy.txt" );
        // Use try-with-resources to auto-close the file if successfully opened.
        try ( BufferedWriter writer = Files.newBufferedWriter( path ) )
        {
            writer.write( "Bonjour le monde!" );
        } catch ( IOException e )
        {
            e.printStackTrace();
        }
    }

}
0 голосов
/ 20 июня 2019

Убедитесь, что вы вызываете csv.flush () перед закрытием файла.:)

...