将 JTable 导出到 Excel 文件

Export JTable into Excel file

我在这里尝试将 JTable 导出到 excel 文件中...我在控制台上没有收到任何错误...但是在 excel sheet 上我只有列names...我的目的是想在这个JTable方块中显示数据库table,在这个下面有导出按钮,所以点击这个按钮后应该为上面显示的JTable创建excel文件。

所以无法识别实际错误

    JButton btnExport = new JButton("Export");
    btnExport.addActionListener(new ActionListener() 
    {
        public void actionPerformed(ActionEvent arg0)
        {
            try 
            {
                String query="Select * from client";
                PreparedStatement pst=conn.prepareStatement(query);
                ResultSet rs=pst.executeQuery();
                table.setModel(DbUtils.resultSetToTableModel(rs));

                HSSFWorkbook wb = new HSSFWorkbook();
                HSSFSheet sheet = wb.createSheet("Excel Sheet");
                HSSFRow rowhead = sheet.createRow(0);
                rowhead.createCell(0).setCellValue("Client_Vendor code");
                rowhead.createCell(1).setCellValue("Client_Name");
                rowhead.createCell(2).setCellValue("Purchaser_Name");
                rowhead.createCell(3).setCellValue("User_Name");
                rowhead.createCell(4).setCellValue("Sales_Engg");

                int index=1;
                while(rs.next())
                    {
                    HSSFRow row = sheet.createRow(index);
                    row.createCell(0).setCellValue(rs.getInt(1));
                    row.createCell(1).setCellValue(rs.getString(2));
                    row.createCell(2).setCellValue(rs.getString(3));
                    row.createCell(3).setCellValue(rs.getString(4));
                    row.createCell(4).setCellValue(rs.getString(5));
                    index++;

                    }  

                    FileOutputStream fileOut = new FileOutputStream("e:/CLIENTDATA/client.xlsx");
                    wb.write(fileOut);
                    fileOut.close();
                    System.out.println("Data is saved in excel file.");
                 }
                catch (Exception e) 
            {
                e.printStackTrace();
            }

所以你的问题就在这里...

table.setModel(DbUtils.resultSetToTableModel(rs));

DBUtils是读到ResultSet的结尾,意思是当你调用rs.next()的时候,它returnsfalse,因为没有了数据

你有两个选择...

你可以...

调用 ResultSet#beforeFirst,但这并非所有数据库都支持,并且可能会影响性能

你可以...

停止使用 DBUtils 并手动构建 TableModel。首先查看 How to Use Tables 了解更多详情

ResultSet rs = pst.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();

HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("Excel Sheet");
HSSFRow rowhead = sheet.createRow(0);

DefaultTableModel model = new DefaultTableModel();
for (int col = 0; col < columnCount; col++) {
    String columnName = rsmd.getColumnName(col + 1);
    model.addColumn(columnName);
    rowhead.createCell(col).setCellValue(columnName);
}

int index = 1;
while (rs.next()) {
    Vector tableRow = new Vector(columnCount);
    HSSFRow row = sheet.createRow(index);
    for (int col = 0; col < columnCount; col++) {
        Object value = rs.getObject(col + 1);
        if (value instanceof Integer) {
            row.createCell(col).setCellValue((int) value);
            tableRow.add((int) value);
        } else {
            row.createCell(col).setCellValue(value.toString());
            tableRow.add(value.toString());
        }
    }
    model.addRow(tableRow);
}

try (FileOutputStream fileOut = new FileOutputStream("e:/CLIENTDATA/client.xlsx")) {
    wb.write(fileOut);
}

我还建议您看看 JDBC Database Access and The try-with-resources Statement