将 JTable 导出到 txt 文件
Exporting JTable to txt file
这里有一个有趣的小错误,希望有人能指出我的情况。
如果 JTable 中的条目大约为 4 个或更少,我的程序就能够写入文本文件。一旦超过它,它就会失败并抛出一个弹出我的 catch 块的异常。不确定发生了什么。
public void actionPerformed(ActionEvent e)
{
try
{
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("payrollData.txt"));
PrintWriter fileWriter = new PrintWriter(bufferedWriter);
for(int i = 0; i < outputTable.getRowCount()+1; i++)
{
String headers = String.valueOf(outputTable.getColumnName(i));
fileWriter.print(headers);
fileWriter.print("\t");
}
fileWriter.println("");
for(int i=0; i<model.getRowCount(); ++i)
{
for(int j=0; j<model.getColumnCount(); ++j)
{
String s = model.getValueAt(i,j).toString();
fileWriter.print(s);
fileWriter.print("\t\t");
}
fileWriter.println("");
}
fileWriter.close();
JOptionPane.showMessageDialog(null, "Success. File saved to payrollData.txt");
}catch(Exception ex)
{
JOptionPane.showMessageDialog(null, "Failure");
}
编辑:添加了 ex.printStackTrace();并且显示数组索引越界异常
所以,看看这个...
for(int i = 0; i < outputTable.getRowCount()+1; i++)
{
String headers = String.valueOf(outputTable.getColumnName(i));
fileWriter.print(headers);
fileWriter.print("\t");
}
我想知道 getRowCount
与列数有什么关系......也许你的意思是 getColumnCount
...这意味着你也可以摆脱 +1
观察...
在花了一些时间 运行 研究代码后,我还可以做一些其他的小观察。
首先,我强烈建议您使用 The try-with-resources Statement,这将使您能够更好地管理您的资源。
我还建议使用 StringJoiner
来生成每一行,它比尝试检查您是否写出最后一列更简单,并允许您提供您想要使用的任何分隔符
举个例子...
DefaultTableModel model = new DefaultTableModel();
model.addColumn("Purpose");
model.addColumn("Name");
model.addColumn("Composition");
model.addColumn("Expiry");
model.addColumn("Stock");
model.addColumn("Cost");
model.addColumn("Type");
model.addColumn("Supplier");
model.addColumn("Supplier Number");
model.addColumn("Rack");
for (int index = 0; index < 10; index++) {
Vector vector = new Vector();
vector.add("p" + index);
vector.add("n" + index);
vector.add("c" + index);
vector.add("e" + index);
vector.add("s" + index);
vector.add("c" + index);
vector.add("t" + index);
vector.add("s" + index);
vector.add("s" + index);
vector.add("r" + index);
model.addRow(vector);
}
JTable table = new JTable(model);
try (BufferedWriter bw = new BufferedWriter(new FileWriter(new File("Test.txt")))) {
StringJoiner joiner = new StringJoiner(",");
for (int col = 0; col < table.getColumnCount(); col++) {
joiner.add(table.getColumnName(col));
}
System.out.println(joiner.toString());
bw.write(joiner.toString());
bw.newLine();
for (int row = 0; row < table.getRowCount(); row++) {
joiner = new StringJoiner(",");
for (int col = 0; col < table.getColumnCount(); col++) {
Object obj = table.getValueAt(row, col);
String value = obj == null ? "null" : obj.toString();
joiner.add(value);
}
System.out.println(joiner.toString());
bw.write(joiner.toString());
bw.newLine();
}
} catch (IOException exp) {
exp.printStackTrace();
}
这里有一个有趣的小错误,希望有人能指出我的情况。
如果 JTable 中的条目大约为 4 个或更少,我的程序就能够写入文本文件。一旦超过它,它就会失败并抛出一个弹出我的 catch 块的异常。不确定发生了什么。
public void actionPerformed(ActionEvent e)
{
try
{
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("payrollData.txt"));
PrintWriter fileWriter = new PrintWriter(bufferedWriter);
for(int i = 0; i < outputTable.getRowCount()+1; i++)
{
String headers = String.valueOf(outputTable.getColumnName(i));
fileWriter.print(headers);
fileWriter.print("\t");
}
fileWriter.println("");
for(int i=0; i<model.getRowCount(); ++i)
{
for(int j=0; j<model.getColumnCount(); ++j)
{
String s = model.getValueAt(i,j).toString();
fileWriter.print(s);
fileWriter.print("\t\t");
}
fileWriter.println("");
}
fileWriter.close();
JOptionPane.showMessageDialog(null, "Success. File saved to payrollData.txt");
}catch(Exception ex)
{
JOptionPane.showMessageDialog(null, "Failure");
}
编辑:添加了 ex.printStackTrace();并且显示数组索引越界异常
所以,看看这个...
for(int i = 0; i < outputTable.getRowCount()+1; i++)
{
String headers = String.valueOf(outputTable.getColumnName(i));
fileWriter.print(headers);
fileWriter.print("\t");
}
我想知道 getRowCount
与列数有什么关系......也许你的意思是 getColumnCount
...这意味着你也可以摆脱 +1
观察...
在花了一些时间 运行 研究代码后,我还可以做一些其他的小观察。
首先,我强烈建议您使用 The try-with-resources Statement,这将使您能够更好地管理您的资源。
我还建议使用 StringJoiner
来生成每一行,它比尝试检查您是否写出最后一列更简单,并允许您提供您想要使用的任何分隔符
举个例子...
DefaultTableModel model = new DefaultTableModel();
model.addColumn("Purpose");
model.addColumn("Name");
model.addColumn("Composition");
model.addColumn("Expiry");
model.addColumn("Stock");
model.addColumn("Cost");
model.addColumn("Type");
model.addColumn("Supplier");
model.addColumn("Supplier Number");
model.addColumn("Rack");
for (int index = 0; index < 10; index++) {
Vector vector = new Vector();
vector.add("p" + index);
vector.add("n" + index);
vector.add("c" + index);
vector.add("e" + index);
vector.add("s" + index);
vector.add("c" + index);
vector.add("t" + index);
vector.add("s" + index);
vector.add("s" + index);
vector.add("r" + index);
model.addRow(vector);
}
JTable table = new JTable(model);
try (BufferedWriter bw = new BufferedWriter(new FileWriter(new File("Test.txt")))) {
StringJoiner joiner = new StringJoiner(",");
for (int col = 0; col < table.getColumnCount(); col++) {
joiner.add(table.getColumnName(col));
}
System.out.println(joiner.toString());
bw.write(joiner.toString());
bw.newLine();
for (int row = 0; row < table.getRowCount(); row++) {
joiner = new StringJoiner(",");
for (int col = 0; col < table.getColumnCount(); col++) {
Object obj = table.getValueAt(row, col);
String value = obj == null ? "null" : obj.toString();
joiner.add(value);
}
System.out.println(joiner.toString());
bw.write(joiner.toString());
bw.newLine();
}
} catch (IOException exp) {
exp.printStackTrace();
}