poi para libreria importar guardar exportar desde descargar datos java swing jtable apache-poi poi-hssf

java - para - apache poi: guardar jtable en un archivo



guardar jtable en pdf java (1)

Lea el tutorial sobre JTable , Creación de un modelo de tabla y tipos de datos implementados , JTable conoce esas Column Classes y devuelve proper value para la salida a POI ; para la mayoría de los tipos en MS Excel:

  1. tienes que hacer un bucle dentro de las celdas en la fila actual, también

  2. tiene que formatear la salida para varios tipos de datos ( Date , Double , String )

  3. entonces puedes enfocarte en crear formula(s) y coloring cell(s)

El código para TableModel través de TableModel puede generar archivos MS Excel con windows delimiters estándar de 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(); } }

Recientemente comencé a trabajar con Java y tengo algunos problemas con la biblioteca de Apache Poi cuando necesito crear un archivo de Excel a partir de una jTable.

He leído muchos hilos y tengo un código que simplemente no funciona (incluso si esto es bastante fácil y hay muchos ejemplos, lo que me hace parecer aún más tonto) y esperaba que alguien me pudiera ayudar.

Así que aquí están las preguntas:

a) ¿por qué el bucle for, que se supone que debe escribir el archivo Excel, no llena todas las celdas? (La única fila con datos en el archivo Excel es la sexta, lo que también me hace preguntarme por qué cuenta elementos nulos en el modelo de tabla para los métodos getRowCount / Column ... también sé que está imprimiendo una cadena personalizada y no la tabla en sí, pero guarda eso para el punto b)

b) ¿cómo se supone que debo usar los elementos del modelo jtable para rellenar el archivo Excel ya que al crear la tabla tuve que elegir Objeto como tipo de fila? (También estoy teniendo problemas especialmente con el tipo de objeto, siempre y cuando se trate de un entero String || no hay ningún problema, pero se supone que la tabla tiene una mezcla de ambos que no parece funcionar cuando intentas use el método setCellValue () con algo diferente del entero String || o al menos no pude hacerlo funcionar)

c) digamos que luego quisiera llenar el jtable del archivo que creé previamente, ¿simplemente tendría que usar la solución para apuntar b) (al revés) después de leer el archivo con la clase buffer leader?

Descargo de responsabilidad: la primera parte del código es generada automáticamente por netbeans, como probablemente pueda decir, la parte de hssf que se me ocurrió está al final, pero pensé que podría querer verla todo, perdón si se ve un poco desordenada .

Aquí está el código:

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

PD: Si te preguntas por qué construí la tabla con tipos de Objetos: este no es el proyecto con el que estoy trabajando, hice este fragmento para probar hssf ya que el Excel resultante es bastante editable pero las cosas no parecen ir bien.

PPS: Traté de trabajar con la clase tokenizer también, pero no estoy seguro de que pueda editar el archivo de Excel resultante tanto como con poi lib.

PPPS: este es mi primer intento con Java, así que, por favor, ¡no seas demasiado rudo!

Espero que las preguntas sean lo suficientemente claras y gracias de antemano, estoy tratando de mejorar en la programación: P

EDITAR: después de un día de práctica, esto es lo que se me ocurrió que parece funcionar con la biblioteca de apache poi, gracias por la ayuda que dieron buenos consejos.

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

Siéntase libre de comentar si cree que el código puede mejorarse, las sugerencias siempre son bienvenidas, especialmente para los recién llegados como yo;)

De nuevo, gracias por los consejos, realmente hicieron el truco ^^