Esportare una JTable in PDF
Dopo vari problemi sono finalmente riuscito anche ad esportare la mia bella JTable in PDF con la libreria iText.
Il problema principale è che seguendo i tutorial trovati qua e la veniva salvata solo una parte della JTable.
Grazie ad alcuni suggerimenti sono riuscito a trovare la soluzione finale.
Il funzionamento è questo:
- clicco su un JMenuItem
- mi compare un JFileChooser per salvare
- passo il file alla classe preposta per il PDF e riempio il file con i dati della JTable
Vi posto la classe PDF:
package com.mattepuffo.book;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
public class ExportPdf {
public void createPdf(ArrayList<ArrayList<String>> map, String file) throws FileNotFoundException, DocumentException {
Font fontMap = new Font(Font.FontFamily.COURIER, 9);
Font fontTestata = new Font(Font.FontFamily.COURIER, 10, Font.BOLD);
Document document = new Document(PageSize.A4, -65F, -65F, 20F, 20F);
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
document.open();
int[] cellWidths = {10, 50, 30, 30, 12, 30, 30};
PdfPTable pdftable = new PdfPTable(7);
pdftable.setWidths(cellWidths);
PdfPCell cellID = new PdfPCell(new Paragraph("ID", fontTestata));
cellID.setColspan(1);
PdfPCell cellTitle = new PdfPCell(new Paragraph("TITLE", fontTestata));
cellTitle.setColspan(1);
PdfPCell cellAuthor = new PdfPCell(new Paragraph("AUTHOR", fontTestata));
cellAuthor.setColspan(1);
PdfPCell cellEditor = new PdfPCell(new Paragraph("EDITOR", fontTestata));
cellEditor.setColspan(1);
PdfPCell cellPrice = new PdfPCell(new Paragraph("PRICE", fontTestata));
cellPrice.setColspan(1);
PdfPCell cellIsbn = new PdfPCell(new Paragraph("ISBN", fontTestata));
cellIsbn.setColspan(1);
PdfPCell cellNote = new PdfPCell(new Paragraph("NOTE", fontTestata));
cellNote.setColspan(1);
pdftable.addCell(cellID);
pdftable.addCell(cellTitle);
pdftable.addCell(cellAuthor);
pdftable.addCell(cellEditor);
pdftable.addCell(cellPrice);
pdftable.addCell(cellIsbn);
pdftable.addCell(cellNote);
for (int j = 0; j < map.size(); j++) {
Object[] temp = map.get(j).toArray();
for (int k = 0; k < temp.length; k++) {
PdfPCell cellMap = new PdfPCell(new Paragraph(temp[k].toString(), fontMap));
cellMap.setColspan(1);
pdftable.addCell(cellMap);
}
}
document.add(pdftable);
document.close();
}
}
Come vedete al metodo passo due parametri: map e file.
Il primo è un (ArrayList<ArrayList<String>> map e rappresenta la JTable che in pratica è formata da due array: uno per lo colonne e uno per le righe.
Qui uso PdfPTable; prima imposto le celle che fungono da testata e la larghezza delle colonne (dato dall'array widths).
Poi aggiungo le celle-testata alla pdftable.
Poi eseguo due cicli su map per scansionare colonne e righe e creo varie PdfCell e le aggiungi dinamicamente alla pdftable.
Infine aggiungo la pdftable al Document.
Non è difficile!
java jtable itext pdfcell document pdfptable
Commentami!