0

在这里,我正在尝试将 JTable 导出到 excel 文件中...我在控制台上没有收到任何错误...但是在 excel 表上我只有列名...我的目标是想在这个 JTable 正方形中显示数据库表,在此下方有导出按钮,因此单击此按钮后,应为上面显示的 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();
            }
4

1 回答 1

2

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

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

DBUtilsis read to the end ResultSet,意思是当你调用时rs.next(),它会返回false,因为没有更多的数据

你有两个选择...

你可以...

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

你可以...

停止使用并手动DBUtils构建。TableModel首先查看如何使用表格了解更多详细信息

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 数据库访问try-with-resources 声明

于 2017-04-12T08:24:47.247 回答