2012-09-03 3 views
6

Я недавно начал работать с java, и мне приходится сталкиваться с некоторыми проблемами с библиотекой apache poi, когда мне нужно создать файл excel, начиная с jTable.apache poi: сохранение jtable в файл

Я прочитал много потоков и придумал код, который просто не сработает (даже если это довольно простой материал, и было много примеров, что заставляет меня выглядеть еще глупее), и я надеялся, что кто-то сможет выручи меня.

Так вот вопросы:

а) почему цикл, который должен написать файл Excel, не заполнять каждую клетку? (единственная строка с данными в файле excel является шестой, что также заставляет меня задаться вопросом, почему она подсчитывает нулевые элементы в модели таблицы для методов getRowCount/Column..также я знаю, что это печать пользовательской строки, а не таблицы сам, но сохраните это для точки b)

b) Как я должен использовать элементы модели jtable для заполнения файла excel, поскольку при создании таблицы мне нужно было выбрать Object в качестве типа строки? (У меня также возникают проблемы с видом объекта, особенно, если это целое число String ||, нет никакой проблемы, но в таблице должно быть сочетание того и другого, которое, похоже, не работает, когда вы пытаетесь использовать метод setCellValue() что-то другое из integer..or строки || по крайней мере, я не мог заставить его работать)

с) давайте сказать, что я позже хочу, чтобы заполнить JTable из файла Я ранее создал, просто ли я должен был бы использовать решение для точки b) (наоборот), прочитав файл с классом bufferedReader?

Отказ от ответственности: первая часть кода автоматически генерируется NetBeans, как вы, вероятно, может сказать, то hssf часть я придумал в конце, но я думал, что вы могли бы хотеть, чтобы увидеть все это, извините если он выглядит грязным.

Вот код:

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: Если вам интересно, почему я построил таблицу с типами объектов: это не проект, я работаю с, я сделал этот фрагмент, чтобы проверить hssf так как получившееся превосходство вполне редактируемо, но все не так хорошо.

PPS: Я также пробовал работать с классом токенизатора, но я не уверен, что вы можете редактировать полученный файл excel столько же, сколько с poi lib.

PPPS: Это моя первая попытка с java, пожалуйста, не будьте слишком грубы!

Я надеюсь, что вопросы были достаточно ясными и заранее спасибо, я пытаюсь стать лучше при программировании: P

EDIT: после дня практики это то, что я придумал, с которым, кажется, работает с библиотека apache poi, спасибо за помощь ребятам, она дала хорошие указатели!

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

Не стесняйтесь комментировать, если вы считаете, что код может быть улучшен, предложения всегда приветствуются, особенно для новичков, как я;)

Опять же, спасибо за советы, они действительно трюк ^^

ответ

5

Пожалуйста, прочитайте учебник о JTable, Creating a Table Model и implemented data types, JTable знает эти Column Classes и возвращает proper value для вывода POI; для большинства типов в MS Excel:

  1. вы должны петли внутри ячеек в текущей строке, слишком

  2. должны выходной формат для различных типов данных (Date, Double, String)

  3. , то вы можете сосредоточиться на создании formula(s) и coloring cell(s)

Код Переберите TableModel может генерировать MS Excel файл тоже со стандартным 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

спасибо, что действительно надо help..and я предполагаю, что я буду читать учебники снова, так как я, кажется, не понять, как все работает достаточно хорошо: P – Marchius

+0

приветствуются – mKorbel