Avatar billede krukken Mester
15. juli 2005 - 12:10 Der er 10 kommentarer og
1 løsning

Udskrivning med JFreeReport

Hej,

Jeg kan allerede udskrive med JFreeReport, og jeg angiver min kode nedenfor. Dette er et virkende eksempel. Det jeg mangler er at lave det sådan at hver anden række udskrives med grå "baggrund" og hver anden udskrives med hvid "baggrund." Er der nogen som har erfaringer med det?
Avatar billede myplacedk Nybegynder
15. juli 2005 - 16:02 #1
kode?
Avatar billede krukken Mester
15. juli 2005 - 16:21 #2
Jeps - i før lige hele min kode:
***********************************
package CVR.Print;
import CVR.Lang.ILanguage;
import CVR.IO.Sheet;
import CVR.Events.MsgBox;
import CVR.Log.Logger;

import java.util.Date;
import java.awt.*;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.io.OutputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.File;
import java.text.SimpleDateFormat;
import java.text.Format;
import javax.swing.table.TableModel;

import org.jfree.report.*;
import org.jfree.report.function.*;
import org.jfree.report.style.FontDefinition;
import org.jfree.report.style.ElementStyleSheet;
import org.jfree.report.elementfactory.TextFieldElementFactory;
import org.jfree.report.elementfactory.LabelElementFactory;
import org.jfree.report.elementfactory.StaticShapeElementFactory;
import org.jfree.report.elementfactory.NumberFieldElementFactory;
import org.jfree.ui.FloatDimension;
import org.jfree.report.modules.output.pageable.pdf.PDFOutputTarget;
import org.jfree.report.modules.output.pageable.base.PageableReportProcessor;

public class PrinttoPdf extends Printer
{
    //private Vector data;
    private Point2D firmname = new Point2D.Float(0, 0);
    private int firmnameMaxLength = 138;
    private Point2D addres = new Point2D.Float(140, 0);
    private int adressMaxLength = 113;
    private Point2D zip = new Point2D.Float(255, 0);
    private int zipMaxLength = 33;
    private Point2D district = new Point2D.Float(290, 0);
    private int disstrictMaxLength = 73;
    private Point2D phone = new Point2D.Float(365, 0);
    private int phoneMaxLength = 58;
    private Point2D cvr = new Point2D.Float(410, 0);
    private int cvrMaxLength = 58;
    private String nullString = "?";
    private TableModel model;
    private JFreeReport report;
    //private Sheet sheet;
    private ILanguage language;
    private String filename;


    public PrinttoPdf(ILanguage language, String filename)
    {
        this.language = language;
        this.filename = filename.endsWith(".pdf") ?  filename : filename + ".pdf";
    }

    private PageHeader createPageHeader ()
    {
        final PageHeader header = new PageHeader();
        header.getStyle().setStyleProperty(ElementStyleSheet.MINIMUMSIZE, new FloatDimension(0, 18));
        header.getStyle().setFontDefinitionProperty(new FontDefinition("Serif", 10));
        header.setDisplayOnFirstPage(true);
        header.setDisplayOnLastPage(true);
        header.addElement(StaticShapeElementFactory.createRectangleShapeElement(null, Color.black, null, new Rectangle2D.Float(0, 0, -100, -60), true, false));
        header.addElement(StaticShapeElementFactory.createRectangleShapeElement(null, Color.decode("#AFAFAF"), null,new Rectangle2D.Float(0, 0, -100, -60),false, true));

        LabelElementFactory factory = new LabelElementFactory();
        factory.setAbsolutePosition(firmname);
        factory.setMinimumSize(new FloatDimension(150, 12));
        factory.setColor(Color.black);
        factory.setHorizontalAlignment(ElementAlignment.LEFT);
        factory.setVerticalAlignment(ElementAlignment.MIDDLE);
        factory.setText(model.getColumnName(0));
        header.addElement(factory.createElement());

        factory = new LabelElementFactory();
        factory.setAbsolutePosition(addres);
        factory.setMinimumSize(new FloatDimension(150, 12));
        factory.setColor(Color.black);
        factory.setHorizontalAlignment(ElementAlignment.LEFT);
        factory.setVerticalAlignment(ElementAlignment.MIDDLE);
        factory.setText(model.getColumnName(1));
        header.addElement(factory.createElement());

        factory = new LabelElementFactory();
        factory.setAbsolutePosition(zip);
        factory.setMinimumSize(new FloatDimension(150, 12));
        factory.setColor(Color.black);
        factory.setHorizontalAlignment(ElementAlignment.LEFT);
        factory.setVerticalAlignment(ElementAlignment.MIDDLE);
        factory.setText(model.getColumnName(2));
        header.addElement(factory.createElement());

        factory = new LabelElementFactory();
        factory.setAbsolutePosition(district);
        factory.setMinimumSize(new FloatDimension(150, 12));
        factory.setColor(Color.black);
        factory.setHorizontalAlignment(ElementAlignment.LEFT);
        factory.setVerticalAlignment(ElementAlignment.MIDDLE);
        factory.setText(model.getColumnName(3));
        header.addElement(factory.createElement());

        factory = new LabelElementFactory();
        factory.setAbsolutePosition(phone);
        factory.setMinimumSize(new FloatDimension(150, 12));
        factory.setColor(Color.black);
        factory.setHorizontalAlignment(ElementAlignment.LEFT);
        factory.setVerticalAlignment(ElementAlignment.MIDDLE);
        factory.setText(model.getColumnName(4));
        header.addElement(factory.createElement());

        factory = new LabelElementFactory();
        factory.setAbsolutePosition(cvr);
        factory.setMinimumSize(new FloatDimension(150, 12));
        factory.setColor(Color.black);
        factory.setHorizontalAlignment(ElementAlignment.LEFT);
        factory.setVerticalAlignment(ElementAlignment.MIDDLE);
        factory.setText(model.getColumnName(5));
        header.addElement(factory.createElement());
        return header;
    }

    private PageFooter createPageFooter ()
    {
        final PageFooter pageFooter = new PageFooter();
        pageFooter.getStyle().setStyleProperty(ElementStyleSheet.MINIMUMSIZE, new FloatDimension(0, 30));
        pageFooter.getStyle().setFontDefinitionProperty(new FontDefinition("Dialog", 10));
        pageFooter.addElement(StaticShapeElementFactory.createRectangleShapeElement(null, Color.decode("#AFAFAF"), null,new Rectangle2D.Float(0, 0, -100, -60),false, true));
        pageFooter.addElement(StaticShapeElementFactory.createRectangleShapeElement(null, Color.black, null, new Rectangle2D.Float(0, 0, -100, -60), true, false));

        LabelElementFactory factory = new LabelElementFactory();
        factory.setAbsolutePosition(new Point2D.Float(5, 5));
        factory.setMinimumSize(new FloatDimension(-100, 0));
        factory.setHorizontalAlignment(ElementAlignment.RIGHT);
        factory.setVerticalAlignment(ElementAlignment.BOTTOM);
        factory.setDynamicHeight(Boolean.TRUE);
        factory.setText(getDescription());
        pageFooter.addElement(factory.createElement());

        factory = new LabelElementFactory();
        Format formatter = new SimpleDateFormat("dd MMMM yyyy HH:mm:ss");
        factory.setAbsolutePosition(new Point2D.Float(0, 5));
        factory.setMinimumSize(new FloatDimension(-100, 0));
        factory.setHorizontalAlignment(ElementAlignment.CENTER);
        factory.setVerticalAlignment(ElementAlignment.BOTTOM);
        factory.setDynamicHeight(Boolean.TRUE);
        factory.setText(formatter.format(new Date()));
        pageFooter.addElement(factory.createElement());


        PageFunction pf = new PageFunction("PAGE_NUMBER");
        PageTotalFunction ptf = new PageTotalFunction();
        TextFormatExpression pageNofM = new TextFormatExpression();
        pageNofM.setName("PAGE_N_OF_M");
        pageNofM.setPattern("Page {0}/{1}");
        pageNofM.setField(0, "PAGE_NUMBER");
        pageNofM.setField(1, "TOTAL_PAGES");
        ptf.setName("TOTAL_PAGES");
        report.addExpression(pf);
        report.addExpression(ptf);
        report.addExpression(pageNofM);
        TextFieldElementFactory tff = new TextFieldElementFactory();
        tff.setName("PageIndicator");
        tff.setMinimumSize(new FloatDimension(60.0f, 15.0f));
        tff.setHorizontalAlignment(ElementAlignment.LEFT);
        tff.setVerticalAlignment(ElementAlignment.BOTTOM);
        tff.setFieldname("PAGE_N_OF_M");
        pageFooter.addElement(tff.createElement());
        return pageFooter;
    }

    private JFreeReport createReportDefinition ()
    {
        JFreeReportBoot.getInstance().start();
        JFreeReport report = new JFreeReport();
        report.setName(filename);
        TextFieldElementFactory factory = new TextFieldElementFactory();
        factory.setAbsolutePosition(this.firmname);
        factory.setMinimumSize(new FloatDimension(150, 12));
        factory.setColor(Color.black);
        factory.setHorizontalAlignment(ElementAlignment.LEFT);
        factory.setVerticalAlignment(ElementAlignment.MIDDLE);
        factory.setNullString(nullString);
        factory.setFieldname(model.getColumnName(0));
        factory.setMaximumSize(new FloatDimension(this.firmnameMaxLength, 12));
        report.getItemBand().addElement(factory.createElement());

        factory = new TextFieldElementFactory();
        factory.setAbsolutePosition(this.addres);
        factory.setMinimumSize(new FloatDimension(150, 12));
        factory.setColor(Color.black);
        factory.setHorizontalAlignment(ElementAlignment.LEFT);
        factory.setVerticalAlignment(ElementAlignment.MIDDLE);
        factory.setNullString(nullString);
        factory.setFieldname(model.getColumnName(1));
        factory.setMaximumSize(new FloatDimension(this.adressMaxLength, 12));
        report.getItemBand().addElement(factory.createElement());

        factory = new TextFieldElementFactory();
        factory.setAbsolutePosition(this.zip);
        factory.setMinimumSize(new FloatDimension(150, 12));
        factory.setColor(Color.black);
        factory.setHorizontalAlignment(ElementAlignment.LEFT);
        factory.setVerticalAlignment(ElementAlignment.MIDDLE);
        factory.setNullString(nullString);
        factory.setFieldname(model.getColumnName(2));
        factory.setMaximumSize(new FloatDimension(this.zipMaxLength, 12));
        report.getItemBand().addElement(factory.createElement());

        factory = new TextFieldElementFactory();
        factory.setAbsolutePosition(this.district);
        factory.setMinimumSize(new FloatDimension(150, 12));
        factory.setColor(Color.black);
        factory.setHorizontalAlignment(ElementAlignment.LEFT);
        factory.setVerticalAlignment(ElementAlignment.MIDDLE);
        factory.setNullString(nullString);
        factory.setFieldname(model.getColumnName(3));
        factory.setMaximumSize(new FloatDimension(this.disstrictMaxLength, 12));
        report.getItemBand().addElement(factory.createElement());

        factory = new TextFieldElementFactory();
        factory.setAbsolutePosition(this.phone);
        factory.setMinimumSize(new FloatDimension(150, 12));
        factory.setColor(Color.black);
        factory.setHorizontalAlignment(ElementAlignment.LEFT);
        factory.setVerticalAlignment(ElementAlignment.MIDDLE);
        factory.setNullString(nullString);
        factory.setFieldname(model.getColumnName(4));
        factory.setMaximumSize(new FloatDimension(this.phoneMaxLength, 12));
        report.getItemBand().addElement(factory.createElement());

        factory = new TextFieldElementFactory();
        factory.setAbsolutePosition(this.cvr);
        factory.setMinimumSize(new FloatDimension(150, 12));
        factory.setColor(Color.black);
        factory.setHorizontalAlignment(ElementAlignment.LEFT);
        factory.setVerticalAlignment(ElementAlignment.MIDDLE);
        factory.setNullString(nullString);
        factory.setFieldname(model.getColumnName(5));
        factory.setMaximumSize(new FloatDimension(this.cvrMaxLength, 12));
        report.getItemBand().addElement(factory.createElement());
        return report;
    }

    public String getDescription ()
    {
        String temp = Sheet.instance().getFilename();
        if(!temp.endsWith(".xls"))
        {
            String file[] = temp.split("\\.");
            return file[0]+".xls";
        }
        else
            return temp;
    }

    public void Print()
    {
        report = createReportDefinition();
        report.setData(model);
        report.setPageFooter(this.createPageFooter());
        report.setPageHeader(this.createPageHeader());
        savePDF(report);
    }

    public TableModel getdata()
    {
        model = Sheet.instance().getModel();
        return model;
    }

    public boolean savePDF (final JFreeReport report)
    {
        OutputStream out = null;
        try
        {
            out = new BufferedOutputStream(new FileOutputStream(new File(filename)));
            final PDFOutputTarget target = new PDFOutputTarget(out);
            target.configure(report.getReportConfiguration());
            target.open();
            final PageableReportProcessor proc = new PageableReportProcessor(report);
            proc.setOutputTarget(target);
            proc.processReport();
            target.close();
            return true;
        }
        catch (Exception e)
        {
            new MsgBox(language.getText("error"),language.getText("fileopen"),false);
            Logger.Log(e,Logger.WRITE);
            return false;
        }
        finally
        {
            try
            {
                if (out != null)
                {
                    out.close();
                }
            }
            catch (Exception e)
            {
                Logger.Log(e,Logger.WRITE);
            }
        }
    }
}
*********************
Avatar billede myplacedk Nybegynder
15. juli 2005 - 17:00 #3
Hvor bliver rækkerne genereret?
Avatar billede sondergard Nybegynder
15. juli 2005 - 17:10 #4
Jeg har tidligere brugt % (modulo) til at skifte farve på hver anden række. Ved at gennemløbe en løkke, og tage modulo 2 af iteratoren:

loop
  if ((iterator % 2) == 0)
    // Udskriv med den ene farve
  else
    // Udskriv med den anden farve
end loop
Avatar billede myplacedk Nybegynder
15. juli 2005 - 17:12 #5
God ide. Gør det. ;-)
Avatar billede krukken Mester
15. juli 2005 - 18:04 #6
Rækkerne bliver generet i "createReportDefinition ()". Den metoder som du bruger kender jeg godt:-) Du finder jo sådan set bare ud at om tallet et lige eller ulige. Men det kan ikke bruges i denne sammenhæng. Som du kan se i funktion angiver man kun hvor mange kolonner der skal være - og rækkerne blive genereret automatisk.
Avatar billede myplacedk Nybegynder
15. juli 2005 - 18:11 #7
sondergard: Hov, sorry. Det var ikke for at være sarkastisk eller noget, jeg troede det var spørgeren der skrev. :)

krukken:
> Som du kan se i funktion angiver man kun hvor mange kolonner der skal være - og rækkerne blive
> genereret automatisk.
Så må du bruge noget funktionalitet i JFreeReport. Den kender jeg ikke, så jeg kan ikke hjælpe dig.
Avatar billede sondergard Nybegynder
15. juli 2005 - 23:46 #8
Nu ved jeg overhovedet ikke hvordan det fungerer, men du bruger
  report.getItemBand().addElement(factory.createElement());
Så jeg opfatter at et element i report er en række?

Kan du så ikke bruge
  Array[] elements = report.getItemBand().getElementArray();
For at få antallet af rækker ud?

http://www.jfree.org/jfreereport/javadoc/org/jfree/report/Band.html#getElementArray() <-- man skal så åbenbart ikke ændre i elementerne...........
Avatar billede sondergard Nybegynder
15. juli 2005 - 23:53 #9
Hov - det var jo self Element[]...
Avatar billede krukken Mester
25. juli 2005 - 11:13 #10
Hmm - jeg fandt aldrig frem til et svar.
Avatar billede krukken Mester
25. juli 2005 - 11:14 #11
Hvis nogen føler sig snydt må i jo give lyd fra Jer.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester