apache poi: speichere jtable in eine datei

Ich habe vor kurzem angefangen, mit Java zu arbeiten, und es treten Probleme mit der Apache Poi-Bibliothek auf, wenn ich eine Excel-Datei erstellen muss, die von einer jTable ausgeht.

Ich habe viele Threads gelesen und mir Code ausgedacht, der einfach nicht funktioniert (auch wenn das ziemlich einfach ist und es viele Beispiele gibt, die mich noch blöder aussehen lassen), und ich hatte gehofft, jemand könnte mir helfen.

Also hier sind die Fragen:

ein) Warum füllt die for-Schleife, die die Excel-Datei schreiben soll, nicht jede Zelle? (Die einzige Zeile mit Daten in der Excel-Datei ist die sechste. Daher frage ich mich auch, warum für die getRowCount / Column-Methoden null Elemente im Tabellenmodell gezählt werden. Außerdem weiß ich, dass eine benutzerdefinierte Zeichenfolge gedruckt wird und nicht die Tabelle selbst, aber speichern Sie das für Punkt b)

b) Wie soll ich die jtable-Modellelemente zum Auffüllen der Excel-Datei verwenden, da ich beim Erstellen der Tabelle Objekt als Zeilentyp auswählen musste? (Ich habe auch Probleme mit der Art des Objekts, insbesondere, solange es sich um eine String || Ganzzahl handelt, gibt es kein Problem, aber die Tabelle soll eine Mischung aus beiden haben, die nicht zu funktionieren scheint, wenn Sie versuchen benutze die setCellValue () Methode mit etwas anderem als dem String || Integer..oder zumindest konnte ich es nicht zum Laufen bringen)

c) Nehmen wir an, ich möchte später die jtable aus der zuvor erstellten Datei füllen. Muss ich dann einfach die Lösung verwenden, um Punkt b) (andersherum) zu wiederholen, nachdem ich die Datei mit der bufferedReader-Klasse gelesen habe.

Haftungsausschluss: Der erste Teil des Codes wird von NetBeans automatisch generiert, wie Sie wahrscheinlich sehen können. Der HSSF-Teil, den ich mir ausgedacht habe, ist am Ende, aber ich dachte, Sie möchten das Ganze vielleicht sehen. Tut mir leid, wenn es irgendwie chaotisch aussieht.

Hier ist der Code:

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: Wenn Sie sich fragen, warum ich die Tabelle mit Objekttypen erstellt habe: Dies ist nicht das Projekt, mit dem ich arbeite. Ich habe dieses Snippet zum Testen von hssf erstellt, da das resultierende Excel recht editierbar ist, aber die Dinge scheinen nicht so zu sein gut laufen.

PPS: Ich habe versucht, auch mit der Tokenizer-Klasse zu arbeiten, bin mir aber nicht sicher, ob Sie die resultierende Excel-Datei so gut bearbeiten können wie mit poi lib.

PPPS: Dies ist mein allererster Versuch mit Java. Seien Sie also bitte nicht zu grob!

Ich hoffe die Fragen waren klar genug und danke im Voraus, ich versuche besser zu programmieren: P

BEARBEITEN: Nach einem Tag des Übens habe ich mir das ausgedacht, was mit der Apache Poi-Bibliothek zu funktionieren scheint, danke für die Hilfe, die es gute Hinweise gab!

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

Fühlen Sie sich frei zu kommentieren, wenn Sie denken, dass der Code verbessert werden kann. Vorschläge sind immer willkommen, besonders für Neulinge wie mich;)

Nochmals vielen Dank für die Tipps, sie haben wirklich den Trick getan ^^

Antworten auf die Frage(2)

Ihre Antwort auf die Frage