如何将数据导出为CSV:dynamicSQL查询和dynamic列名和JTable上的数据(Java / Netbeans)

我试图find最简单的方式来导出数据从一个JTable到像CSV或XLSX等excel格式。问题是数据是dynamic的,所以基本上用户可以运行一个dynamic查询,他/她需要导出那个数据。

最简单的方法是从JTable中读取所有行,并使用POI库创build一个excel文件。

您可以使用下面的方法获取表格数据,您可以将其存储在列表或其他东西: table.getModel().getValueAt(rowIndex, columnIndex);

现在创buildexcel文件,您可以使用POI库中的以下代码

 WorkbookSettings ws = new WorkbookSettings(); ws.setLocale(new Locale("en", "EN")); WritableWorkbook workbook = null; File newFile = new File(dir.getPath() + "\\" + fileName); workbook = Workbook.createWorkbook(newFile, ws); WritableSheet s = workbook.createSheet("mySheet", 0); for (int i = 1; i <= <columncount>; ++i) { Label l = new Label(i - 1, 0, <columnname>, cf); s.addCell(l); } for (int j = 1; j <= <rowcount>; j++) { for (int i = 1; i <= <columncount>; i++) { Label m = new Label(i - 1, j, <rowvalue>, cf); s.addCell(m); } } workbook.write(); workbook.close();` 

这是一个我用来做这个窍门的课程。 它完全按照在视图中呈现给用户的方式导出JTable(包括行和列的顺序)。 如果使用它们,它也可以直接从JLabel自定义渲染器中提取文本。 我对这个post做了一些小的修改而不编译,所以告诉我是否有问题。

请注意,这是问题的重复如何将JTable导出到.csv文件? 以及如何将数据从JTable导出到CSV,尽pipe答案仅包含伪代码。

 import java.io.File; import java.io.FileWriter; import java.io.IOException; import javax.swing.JLabel; import javax.swing.JTable; public class JTableCSVExporter { protected char columnDelimiter = ','; public char getColumnDelimiter() { return columnDelimiter; } public void setColumnDelimiter(char columnDelimiter) { this.columnDelimiter = columnDelimiter; } protected char rowDelimiter = '\n'; public char getRowDelimiter() { return rowDelimiter; } public void setRowDelimiter(char rowDelimiter) { this.rowDelimiter = rowDelimiter; } protected char quote = '"'; public char getQuote() { return quote; } public void setQuote(char quote) { this.quote = quote; } protected boolean useRenderers = true; public boolean isUseRenderers() { return useRenderers; } /** * If true, the value provided by table renderers (if they are JLabel) is used as value for CSV. * If false, or the renderer is not JLabel, the class uses toString of the cell value. */ public void setUseRenderers(boolean useRenderers) { this.useRenderers = useRenderers; } protected boolean translateBools = true; public boolean isTranslateBools() { return translateBools; } /** * If true, bools are translated to "yes" a "no". Otherwise toString() is used */ public void setTranslateBools(boolean translateBools) { this.translateBools = translateBools; } /** * Exports table to file. * @throws IOException */ public void exportCSV(JTable table, File file) throws IOException { FileWriter out = new FileWriter(file); for (int i = 0; i < table.getColumnCount(); i++) { int columnIndex = table.convertColumnIndexToView(i); if (columnIndex != -1) { out.write(table.getColumnName(columnIndex) + columnDelimiter); } } out.write(rowDelimiter); for (int rowIndex = 0; rowIndex < table.getRowCount(); rowIndex++) { for (int j = 0; j < table.getColumnCount(); j++) { int columnIndex = table.convertColumnIndexToView(j); if (columnIndex != -1) { String toWrite; Object value = table.getValueAt(rowIndex, columnIndex); java.awt.Component rendererComponent = table.getCellRenderer(rowIndex, columnIndex).getTableCellRendererComponent(table, value, false, false, rowIndex, columnIndex); if (isUseRenderers() && rendererComponent instanceof JLabel) { toWrite = ((JLabel) rendererComponent).getText(); } else { if (isTranslateBools() && value instanceof Boolean) { if (value.equals(Boolean.TRUE)) { toWrite = "yes"; } else { toWrite = "no"; } } else { if (value == null) { toWrite = ""; } else { toWrite = value.toString(); } } } out.write(quote + toWrite.replace(Character.toString(quote), "\\" + quote) + quote + columnDelimiter); } } out.write(rowDelimiter); } out.close(); } }