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 ^^
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
sei il benvenuto – mKorbel