2017-04-12 3 views
0

ici J'essaie d'exporter JTable en fichier Excel ... Je n'ai pas eu d'erreur sur la console ... mais sur Excel feuille j'ai obtenu seulement des noms de colonnes ... mon but est de vouloir afficher la table de base de données dans ce carré JTable, et en dessous il y a le bouton Exporter, donc après avoir cliqué sur ce bouton, le fichier Excel doit être créé pour afficher JTable ci-dessus.Exporter JTable dans le fichier Excel

donc je ne peux reconnaître l'erreur réelle

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

Vous écrasez essentiellement le fichier à chaque itération de la 'while (rs.next ()) 'boucle, à la place, l'écrire après la boucle comme terminée – MadProgrammer

+0

@MadProgrammer ohhh..yes merci beaucoup .. – Vsal

+0

Dbutils est la lecture à la fin du resultset. Ne l'utilisez pas, créez le TableModel en lisant le résultat – MadProgrammer

Répondre

2

Donc, votre problème est ici ...

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

DBUtils est en train de lire à la fin de la ResultSet, ce qui signifie quand vous appelez rs.next(), elle retourne false, car il n'y a plus de données

Vous avez deux chocies ...

Vous pouvez ...

Appel ResultSet#beforeFirst, mais cela est pris en charge par toutes les bases de données et il peut y avoir une baisse de performance

Vous pouvez ...

Arrêtez d'utiliser DBUtils et construire le TableModel manuellement. Commencez par avoir un regard sur How to Use Tables pour plus de détails

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); 
} 

Je recommande aussi avoir un regard sur JDBC Database Access et The try-with-resources Statement

+0

J'ai essayé ce code comme il est, mais j'ai obtenu seulement la dernière rangée dans le fichier Excel .. mais mon but est de montrer la table de base de données dans ce carré JTable, et dessous il y a le bouton Exporter, donc après avoir cliqué ce être créé pour afficher ci-dessus JTable. – Vsal

+1

Alors maintenant, vous dites que le processus d'exportation est différent du chargement de la table !? – MadProgrammer

+0

@ MadProgrammer ..merci pour le code ... problème résolu – Vsal