我正在尝试将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;
}
答案 0 :(得分:1)
采取婴儿步骤。首先,请确保您成功打开文件。
现代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或制表符分隔的文件等,请使用库。我使用Apache Commons CSV。在Search Stack Overflow中搜索使用此库和其他此类库读取和写入此类文件的许多示例。
使用CSVFormat
定义文件类型。在这里,我们使用RFC 4180定义的标准CSV。请注意,标准CSV使用CRLF(回车行进给)表示换行符,而不是在类Unix平台中常见的LF(换行)。
打开文件时,我们指定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();
}
}
}
答案 1 :(得分:0)
确保在关闭文件之前调用csv.flush()。 :)