2017-04-12 60 views
0

这里我想将JTable导出到excel文件中......我没有在控制台上得到任何错误...但是在Excel表格中我只有列名...我的目标是想要在这个JTable的正方形中显示数据库表,在这个下面有Export按钮,所以点击这个按钮后,应该为上面的JTable创建excel文件。将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(); 
      } 
+2

你基本上是覆盖在'而(rs.next的每一次迭代的文件( ))''循环,而不是写完循环之后 – MadProgrammer

+0

@MadProgrammer ohhh..yes非常感谢你.. – Vsal

+0

Dbutils正在读取结果集的末尾。不要使用它,在阅读结果集时建立TableModel – MadProgrammer

回答

2

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

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

DBUtils正在读取到ResultSet结束,这意味着当你调用rs.next(),它返回false,因为没有更多的数据

你有两个chocies ...

你可以...

呼叫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 AccessThe try-with-resources Statement

+0

我试过这样的代码,因为它是,但我只有最后一行Excel文件..但我的目标是要显示数据库表在这个JTable的广场,并且下面有这个导出按钮,所以点击这个按钮后,Excel文件应该为以上显示JTable创建。 – Vsal

+1

所以现在你说导出过程不同于表的加载!? – MadProgrammer

+0

@ MadProgrammer ..感谢您的代码...问题解决 – Vsal