【问题标题】:Problems exporting java tables to excel将java表导出到excel的问题
【发布时间】:2016-01-27 16:59:24
【问题描述】:

我在将 Jtable 从我的程序导出到 Excel 时遇到问题,我正在使用这种方法,因为我不允许使用 POI

public void exportTable(File file)throws IOException{
    FileWriter out = new FileWriter(file);
    BufferedWriter bw = new BufferedWriter(out);
    for(int i = 0; i < myTable.getColumnCount(); i++){
        bw.write(myTable.getColumnName(i) + "\t");
    }
    bw.write("\n");
    for(int i = 0; i < myTable.getRowCount(); i++){
        for(int j = 0; j < myTable.getColumnCount(); j++){
            bw.write(myTable.getValueAt(i, j).toString() +"\t");
        }
        bw.write("\n");
    }
    bw.close();
    JOptionPane.showMessageDialog(rootPane, "Your table have been exported to " + file);
}

我正在使用这个方法:

try{
    Date date = new Date();
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy_HH-mm-ss");
    String desktop = System.getProperty("user.home") + "/Desktop";
    String name = desktop + "/MyTable" + dateFormat.format(date)+ ".csv";
    exportTable(new File(name));
}catch(IOException e){
    e.getMessage();
}

嗯,这很好,但问题是一行中的每一列都写在第一列,而不是写在不同的列中,我认为“\t”可以解决这个问题,但是没有,知道如何解决这个问题吗?

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖 minimal reproducible exampleShort, Self Contained, Correct Example。顺便说一句 - 你最近几天没有问过同样的问题吗?
  • 我发布了一个类似的问题,但我可以解决问题,现在我遇到了不同的问题
  • BTW - 让它适用于硬编码数组,它应该适用于 Swing JTable,因此这确实表明这与 Swing 或 JTable 无关。我怀疑我会在已删除的问题上提到同样的事情!
  • 您可能还想看看 StringJoiner 类,这会更容易

标签: java excel swing jtable filewriter


【解决方案1】:

所以,您的代码可以正常工作,所以问题在于您的代码中的其他地方,您没有与我们共享。考虑提供一个runnable example 来证明您的问题。这不是代码转储,而是您正在做的事情的一个示例,它突出了您遇到的问题。这将减少混乱并获得更好的响应

不过,我建议您看看 The try-with-resources StatementStringJoiner,这将有助于让您的生活更轻松

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.StringJoiner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        DefaultTableModel model = new DefaultTableModel(0, 10);
        for (int row = 0; row < 10; row++) {
            String[] cols = new String[10];
            for (int col = 0; col < cols.length; col++) {
                cols[col] = row + "x" + col;
            }
            model.addRow(cols);
        }

        try {
            exportTable(new JTable(model), new File("bananas.csv"));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    public void exportTable(JTable myTable, File file) throws IOException {
        try (BufferedWriter bw = new BufferedWriter(new FileWriter(file))) {
            StringJoiner sj = new StringJoiner("\t");
            for (int i = 0; i < myTable.getColumnCount(); i++) {
                sj.add(myTable.getColumnName(i));
            }
            bw.write(sj.toString());
            bw.newLine();
            for (int i = 0; i < myTable.getRowCount(); i++) {
                sj = new StringJoiner("\t");
                for (int j = 0; j < myTable.getColumnCount(); j++) {
                    sj.add(myTable.getValueAt(i, j).toString());
                }
                bw.write(sj.toString());
                bw.newLine();
            }
//          JOptionPane.showMessageDialog(rootPane, "Your table have been exported to " + file);
        }
    }

}

哪些输出

A   B   C   D   E   F   G   H   I   J
0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9
1x0 1x1 1x2 1x3 1x4 1x5 1x6 1x7 1x8 1x9
2x0 2x1 2x2 2x3 2x4 2x5 2x6 2x7 2x8 2x9
3x0 3x1 3x2 3x3 3x4 3x5 3x6 3x7 3x8 3x9
4x0 4x1 4x2 4x3 4x4 4x5 4x6 4x7 4x8 4x9
5x0 5x1 5x2 5x3 5x4 5x5 5x6 5x7 5x8 5x9
6x0 6x1 6x2 6x3 6x4 6x5 6x6 6x7 6x8 6x9
7x0 7x1 7x2 7x3 7x4 7x5 7x6 7x7 7x8 7x9
8x0 8x1 8x2 8x3 8x4 8x5 8x6 8x7 8x8 8x9
9x0 9x1 9x2 9x3 9x4 9x5 9x6 9x7 9x8 9x9

更新

我想我终于明白了你的难题,Excel 用来提示你如何描绘 CSV,似乎不再这样做了(至少对我来说不是)

因此,将StringJoiner sj = new StringJoiner("\t");sj = new StringJoiner("\t"); 分别替换为StringJoiner sj = new StringJoiner(",");sj = new StringJoiner(",");

【讨论】:

  • 对不起,我不能分享我的例子,因为我正在使用 netbeans,我什至不知道创建表的确切代码在哪里,我的代码也有很多西班牙语单词;如果我像这样导出我的表到 .txt 而不是 .csv 效果很好,但问题是当我将表导出到 .csv 文件时(这就是我需要的)
  • 那里,现在它导出为 CSV...你认为 CSV 文件是什么,它只是一个格式化的文本文件
  • CSV 不是 excel 文件?那么,我需要使用哪个扩展来创建包含信息的 excel 文件?我尝试使用 .xls 但它出错了
  • 正如我在上一个问题中所说,xls 是二进制格式,xlsx 是一个 zip 文件,其中大部分是 xml 文件,CSV 代表“逗号分隔值”并且是常见的交换格式
  • 检查 - Excel 不知道您使用了什么分隔符,它会询问,但现在显然需要 ,
【解决方案2】:

如果一行的所有值都显示在 Excel 的第一列中,您可以标记该第一列并使用 Excel 的“文本到列”功能。您可以指定即将出现的对话框以使用制表符作为拆分字符。

如果您导出逗号而不是制表符,您可以在 Excel 中打开它,并且应该自动拆分行,但在某些 Excel 版本中,只有在从资源管理器中打开文件时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多