2017-04-12 4 views
0

Hier versuche ich JTable in Excel-Datei exportieren ... Ich habe keinen Fehler auf der Konsole erhalten ... aber auf Excel-Blatt habe ich nur Spaltennamen ... mein Ziel ist wollen Zeigen Sie die Datenbanktabelle in diesem JTable-Quadrat an, und darunter befindet sich die Export-Schaltfläche. Nach dem Klicken auf diese Schaltfläche sollte daher eine Excel-Datei erstellt werden, in der JTable angezeigt wird.Exportieren von JTable in Excel-Datei

seinen Platz erkannt tatsächliche Fehler

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

Sie überschreiben grundsätzlich die Datei auf jeder Iteration des 'while (rs.next ()) 'Schleife, stattdessen schreiben Sie es nach der Schleife als abgeschlossen – MadProgrammer

+0

@MadProgrammer ohhh .. ja vielen Dank .. – Vsal

+0

Dbutils liest bis zum Ende der Ergebnismenge. Verwenden Sie es nicht, erstellen Sie das TableModel, während Sie das Resultset lesen – MadProgrammer

Antwort

2

So Ihr Problem hier ist ...

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

DBUtils ist mit dem Ende des ResultSet Lesen, was bedeutet, wenn Sie rs.next() nennen, es gibt false, weil es keine Daten mehr gibt

Sie haben zwei Chocies ...

Sie könnten ...

Anruf ResultSet#beforeFirst, aber von allen Datenbank unterstützt wird, und es kann eine Leistung

Sie getroffen werden könnten ...

Stopp DBUtils mit und bauen die TableModel manuell. Beginnen Sie, indem Sie einen Blick auf How to Use Tables, um weitere Informationen mit

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

ich auch einen Blick empfehlen würde, die bei JDBC Database Access und The try-with-resources Statement

+0

Ich habe versucht, diesen Code, wie es ist, aber ich habe nur letzte Reihe in Excel-Datei..aber mein Ziel ist, wollen Datenbanktabelle in diesem JTable-Quadrat anzeigen, und darunter gibt es Export-Schaltfläche, so dass nach dem Klicken auf diese Schaltfläche Excel-Datei sollte Für die obige Anzeige von JTable erstellt werden. – Vsal

+1

Also sagen Sie jetzt, dass der Exportprozess sich vom Laden der Tabelle unterscheidet !? – MadProgrammer

+0

@ MadProgrammer..Danke für den Code ... Problem gelöst – Vsal