mercoledì 12 dicembre 2012

Itext per generare tabella rtf

In questo esempio vediamo come generare un RTF con IText in cui posizioniamo una tabella generata dinamicamente, passando al metodo di creazione :
  • un array di Stringhe che rappresentano gli header di colonne;
  • una lista di Stringhe che rappresentano i valori , e che devono essere un multiplo della size dell'array di header, esempio con 4 colonne di intestazione per avere 2 righe la size di questa lista deve essere di 8.
Il vantaggio di avere questa tabella è che Itext (a differenza di Jasper Report o meglio del Jasper report che ho usato io qualche anno fa, non so le ultime versioni) genera tabelle facilmente modificabili, mentre Jasper mette dei place holders tipo caselle di testo che rendono molto difficoltoso modificare il file.

Sotto posto il codice:

package chart.example;
import java.awt.Color;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import com.lowagie.text.Cell;
import com.lowagie.text.Document;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Table;
import com.lowagie.text.rtf.RtfWriter2;

public class TableCreator {
 
 public static void main(String[] args) throws Exception
 {
  FileOutputStream fos = new FileOutputStream("file/executive_summary.rtf");
  Document d=new Document();
  RtfWriter2.getInstance(d, fos );
     d.open();
     String[] lista=new String[]{"Lunedi","Martedi","Mercoledi","Giovedi"};
     List<String> valTot=new ArrayList<String>();
     valTot.add("12");
     valTot.add("15");
     valTot.add("16");
     valTot.add("98");
     valTot.add("12");
     valTot.add("15");
     valTot.add("16");
     valTot.add("98");
     valTot.add("dsfddsdsf");
     valTot.add("baiaffa");
     valTot.add("16");
     valTot.add("98");
     valTot.add("ssssss");
     valTot.add("baiaffone");
     valTot.add("13");
     valTot.add("983");
     valTot.add("dsdsdsdsds");
     valTot.add("baiaffone");
     valTot.add("13");
     valTot.add("983");
     d.add(getSimpleTable(lista, valTot));
     d.close();
    
 }
 
 public static int myFontStyle = Font.UNDEFINED;
 public static Font baseFont = new Font ( myFontStyle, 12, Font.NORMAL );
 public static Font baseFontTabelleHeader=new Font ( myFontStyle, 10, Font.NORMAL );
 public static Table getSimpleTable( String[] header_cells, List<String> column_cells ) throws Exception
 {
  Table table = new Table( header_cells.length );
        if(column_cells.size()%header_cells.length!=0){
        throw new IllegalArgumentException("Attenzione il numero di valori " +
           "deve essere un multiplo del numero di colonne, " +
           "quindi di "+header_cells.length+" " +
             "il valore risulta invece "+column_cells.size());
        }
  table.setBorderWidth(1);
  table.setPadding(2);
        table.setSpacing(0);

        for ( int i = 0 ; i < header_cells.length ; i++ )
        {
         table.addCell( getHeaderCell( header_cells[i], baseFontTabelleHeader ) );
        }
       
        for ( int i = 0 ; i < column_cells.size() ;  )
        {
         for(int k=0;k<header_cells.length;k++){
          table.addCell( getCell( column_cells.get(i), baseFont ) );
          i++;
         }
        }

  return table;
 }

 public static Cell getHeaderCell( String text, Font font ) throws Exception
 {
  Font f = new Font( font );
  f.setStyle(Font.BOLD);
  Cell cell = new Cell( new Paragraph( text, f ) );
        cell.setHeader(true);
        cell.setBackgroundColor( new Color(0xE1E1E1) );
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        return cell;
 }

 public static Cell getCell( String text, Font font ) throws Exception
 {
  Cell cell = new Cell( new Paragraph( text, font ) );
  cell.setHeader(false);
        cell.setHorizontalAlignment(Element.ALIGN_LEFT);
        return cell;
 }

 public static Cell getCenteredCell( String text, Font font ) throws Exception
 {
  Cell cell = new Cell( new Paragraph( text, font ) );
  cell.setHeader(false);
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        return cell;
 }
}



Nessun commento:

Posta un commento