apache poi: zapisywanie jtable do pliku
Niedawno zacząłem pracować z java i mam problemy z biblioteką poi apache, kiedy muszę utworzyć plik Excela, zaczynając od jTable.
Przeczytałem wiele wątków i wymyśliłem kod, który po prostu nie działa (nawet jeśli jest to całkiem proste i było wiele przykładów, co sprawia, że wyglądam jeszcze bardziej głupio) i miałem nadzieję, że ktoś może mi pomóc.
Oto pytania:
za) dlaczego pętla for, która ma zapisywać plik Excela, nie wypełnia każdej komórki? (jedyny wiersz z danymi w pliku Excela jest szóstym, co również sprawia, że zastanawiam się, dlaczego zlicza puste elementy w modelu tabeli dla metod getRowCount / Column .. wiem też, że drukuje niestandardowy ciąg, a nie tabelę ale z wyjątkiem tego dla punktu b)
b) jak mam użyć elementów modelu jtable do wypełnienia pliku excel, ponieważ podczas tworzenia tabeli musiałem wybrać obiekt jako typ wiersza? (Mam także problemy z rodzajem obiektu, o ile jest to liczba całkowita typu String ||, nie ma żadnego problemu, ale tabela powinna mieć mieszankę obu, która wydaje się nie działać, gdy próbujesz użyj metody setCellValue () z czymś innym niż liczba całkowita String || lub przynajmniej nie mogłem tego zrobić)
do) powiedzmy, że później chciałbym wypełnić jtable z pliku, który wcześniej stworzyłem, czy po przeczytaniu pliku z klasą bufferedReader musiałbym po prostu użyć rozwiązania do punktu b) (odwrotnie)?
Zrzeczenie się: pierwsza część kodu jest generowana automatycznie przez netbeans, jak zapewne wiesz, część hssf, którą wymyśliłem, jest na końcu, ale pomyślałem, że możesz chcieć zobaczyć całą sprawę, przepraszam, jeśli wygląda to na trochę bałaganu.
Oto kod:
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: Jeśli zastanawiasz się, dlaczego zbudowałem tabelę z typami obiektów: to nie jest projekt, z którym pracuję, zrobiłem ten fragment, aby przetestować hssf, ponieważ wynikowy excel jest dość edytowalny, ale rzeczy nie wydają się pójdzie dobrze.
PPS: Próbowałem również pracować z klasą tokenizera, ale nie jestem pewien, czy możesz edytować wynikowy plik Excela tak samo jak w przypadku poi lib.
PPPS: To moja pierwsza próba z java, więc proszę, nie bądź zbyt szorstki!
Mam nadzieję, że pytania były wystarczająco jasne i z góry dziękuję, staram się ulepszyć programowanie: P
EDYTUJ: po całym dniu praktyki wymyśliłem to, co wydaje się działać z biblioteką poi apache, dzięki za pomoc dało dobre wskazówki!
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());
}
}
Nie krępuj się, jeśli uważasz, że kod można poprawić, sugestie są zawsze mile widziane, zwłaszcza dla nowych użytkowników, takich jak ja;)
Ponownie, dzięki za wskazówki, naprawdę zrobili sztuczkę ^^