2012-09-03 17 views
6

Ho iniziato di recente a lavorare con java e sto affrontando alcuni problemi con la libreria di apache poi quando ho bisogno di creare un file excel a partire da un jTable.apache poi: salvataggio di un file in un file

Ho letto molti thread e ho trovato un codice che non funziona (anche se è roba abbastanza semplice e ci sono molti esempi che mi fanno sembrare ancora più stupido) e speravo che qualcuno potesse aiutarmi.

Così qui sono le domande:

a) perché il ciclo for, che dovrebbe scrivere il file excel, non riempie ogni cellula? (l'unica riga con i dati nel file excel è la sesta, il che mi fa anche chiedere perché conta gli elementi nulli nel modello di tabella per i metodi getRowCount/Column..anche so che sta stampando una stringa personalizzata e non la tabella in sé, ma salvo che per il punto b)

b) come faccio ad usare gli elementi del modello JTable per popolare il file excel da quando la creazione della tabella ho dovuto scegliere come tipo di oggetto fila? (Ho anche problemi con il tipo di oggetto in particolare, purché sia ​​un intero stringa || non ci sono problemi, ma si suppone che la tabella abbia un mix di entrambi che non sembra funzionare quando si prova a utilizzare il metodo setCellValue() con qualcosa di diverso dal integer..or String || almeno io non sono riuscito a farlo funzionare)

c) diciamo che avrei poi voglia di popolare il JTable dal file Ho creato in precedenza, dovrei semplicemente usare la soluzione per puntare b) (il contrario) dopo aver letto il file con la classe bufferedReader?

responsabilità: la prima parte del codice viene generato automaticamente da NetBeans come si può probabilmente dire, la parte HSSF mi è venuto in mente è alla fine, ma ho pensato che si potrebbe desiderare di vedere il tutto, mi dispiace se sembra un po 'disordinato.

Ecco il codice:

package poitest; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JTable; 
import javax.swing.table.TableModel; 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.ss.usermodel.*; 

public class POITestFrame extends javax.swing.JFrame { 

    /** 
    * Creates new form POITestFrame 
    */ 
    public POITestFrame() { 
     initComponents(); 
    } 

    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents 
    private void initComponents() { 

     excelButton = new javax.swing.JButton(); 
     jScrollPane1 = new javax.swing.JScrollPane(); 
     jTable1 = new javax.swing.JTable(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     excelButton.setText("ESPORTA!"); 
     excelButton.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       excelButtonActionPerformed(evt); 
      } 
     }); 

     jTable1.setModel(new javax.swing.table.DefaultTableModel(
      new Object [][] { 
       {"Boolean", "Integer", "String", "Array"}, 
       {"x*y", "x+y", "x/y", "x-y"}, 
       {"32", "43", "12", "24"}, 
       {"casa", "cantiere", "museo", "acquario"}, 
       {null, null, null, null}, 
       {null, null, null, null} 
      }, 
      new String [] { 
       "Title 1", "Title 2", "Title 3", "Title 4" 
      } 
     )); 
     jScrollPane1.setViewportView(jTable1); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 320, Short.MAX_VALUE) 
      .addComponent(excelButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
       .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addComponent(excelButton) 
       .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
     ); 

     pack(); 
    }// </editor-fold>//GEN-END:initComponents 

    private void excelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_excelButtonActionPerformed 
     try { 
      PoiWriter(jTable1); 
     } catch (FileNotFoundException ex) { 
      Logger.getLogger(POITestFrame.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IOException ex) { 
      Logger.getLogger(POITestFrame.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    }//GEN-LAST:event_excelButtonActionPerformed 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) { 
     /* 
     * Set the Nimbus look and feel 
     */ 
     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* 
     * If Nimbus (introduced in Java SE 6) is not available, stay with the 
     * default look and feel. For details see 
     * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(POITestFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(POITestFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(POITestFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(POITestFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     //</editor-fold> 

     /* 
     * Create and display the form 
     */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       new POITestFrame().setVisible(true); 
      } 
     }); 
    } 
    // Variables declaration - do not modify//GEN-BEGIN:variables 
    private javax.swing.JButton excelButton; 
    private javax.swing.JScrollPane jScrollPane1; 
    private javax.swing.JTable jTable1; 
    // End of variables declaration//GEN-END:variables 

    private void PoiWriter(JTable jTable1) throws FileNotFoundException, IOException { 
     TableModel model = jTable1.getModel(); 

    // create a workbook 
    Workbook wb = new HSSFWorkbook(); // xls file 
     // create a new sheet 
     Sheet sheet = wb.createSheet("Foglio di Prova!"); 
     // declare a row object reference 
     Row r = null; 
     // declare a cell object reference 
     Cell c = null; 
     // create a new file 
    FileOutputStream fos; 
    fos = new FileOutputStream("File di Prova.xls"); 

     // create a sheet table rows 
     int rownum; 
     for (rownum = (short) 0; rownum < model.getRowCount(); rownum++) { 
      // create a row 
      r = sheet.createRow(rownum); 
     } 

     for (short cellnum = (short) 0; cellnum < model.getRowCount(); cellnum ++) { 
      // create a numeric cell 
      c = r.createCell(cellnum); 

      // populate table with custom objects 
      for(int i=0; i < model.getRowCount();i++){ 
      for(int j=0;j < model.getColumnCount();j++){ 
       String aplala = "blabla";  
       c.setCellValue(aplala); 
      } 
     } 


     } 
     wb.write(fos); 
    fos.close(); 
    } 
} 

PS: Se vi state chiedendo il motivo per cui ho costruito la tabella con i tipi di oggetti: non è questo il progetto su cui sto lavorando, ho fatto questo frammento di testare HSSF perché l'excel risultante è abbastanza modificabile ma le cose non sembrano andare bene.

PPS: Ho provato a lavorare anche con la classe tokenizer, ma non sono sicuro che sia possibile modificare il file di Excel risultante tanto quanto con poi lib.

PPPS: questo è il mio primo tentativo con java quindi, per favore, non essere troppo duro!

Spero che le domande erano abbastanza chiari e grazie in anticipo, io sto cercando di ottenere una migliore programmazione: P

EDIT: dopo una giornata di pratica questo è ciò che mi è venuta con la quale sembra funzionare con la libreria apache poi, grazie per l'aiuto ragazzi ha dato buoni suggerimenti!

int rowNum; 
    int colNum; 
    int tempRows; 
    int rowCount = model.getRowCount(); 
    int columnCount = model.getColumnCount();  

    // create the headers 
    for (colNum = 0; colNum < columnCount; colNum++) {    
     if (colNum == 0) { 
      r = sheet.createRow(0); 
     }    
     c = r.createCell(colNum); 
     c.setCellValue(model.getColumnName(colNum)); 
    } 

    for (rowNum = 0; rowNum < rowCount; rowNum++) { 
     // create rows + 1 (to account for the headers) 
     tempRows = rowNum + 1; 
     r = sheet.createRow(tempRows);  

     for (short cellnum = 0; cellnum < columnCount; cellnum ++) { 
      // create cells 
      c = r.createCell(cellnum); 
      // add values from table 
      c.setCellValue(model.getValueAt(rowNum, cellnum).toString()); 
     } 
    } 

Sentitevi liberi di commentare se pensate che il codice può essere migliorata, i suggerimenti sono sempre i benvenuti, in particolare ai nuovi arrivati ​​come me;)

Ancora una volta, grazie per i suggerimenti, hanno davvero fatto il trucco ^^

risposta

5

Si prega di leggere il tutorial su JTable, Creating a Table Model e implemented data types, JTable conosce quelli Column Classes, e restituisce proper value per l'uscita a POI; per la maggior parte dei tipi in MS Excel:

  1. bisogna ciclo all'interno delle cellule in riga corrente, anche

  2. devono formattare output per i diversi tipi di dati (Date, Double, String)

  3. allora è possibile concentrarsi sulla creazione formula(s) e coloring cell(s)

Codice per scorrere TableModel in grado di generare file di MS Excel, anche, con standard di windows delimiters:

public class ExcelCustomerReport { 

    public ExcelCustomerReport() { 
    } 

    public void exportTable(JTable table, File file) throws IOException { 
     TableModel model = table.getModel(); 
     FileWriter out = new FileWriter(file); 
     String groupExport = ""; 
     for (int i = 0; i < (model.getColumnCount()); i++) {//* disable export from TableHeaders 
      groupExport = String.valueOf(model.getColumnName(i)); 
      out.write(String.valueOf(groupExport) + "\t"); 
     } 
     out.write("\n"); 
     for (int i = 0; i < model.getRowCount(); i++) { 
      for (int j = 0; j < (model.getColumnCount()); j++) { 
       if (model.getValueAt(i, j) == null) { 
        out.write("null" + "\t"); 
       } else { 
        groupExport = String.valueOf(model.getValueAt(i, j)); 
        out.write(String.valueOf(groupExport) + "\t"); 
       } 
      } 
      out.write("\n"); 
     } 
     out.close(); 
    } 
} 
+0

grazie, che in realtà dovrebbe help..and mi sa che dovrò leggere di nuovo tutorial dal momento che non sembra di capire come funzionano le cose: P – Marchius

+0

sei il benvenuto – mKorbel

Problemi correlati