Uso da Classe Extenso Ireport(Resolvido)

Estou com problema com uso da Classe Extenso no Ireport.
No meu Text Field nas configurações Text Field Expression esta assim:
(" + new Extenso(new BigDecimal($F{imovel_VALOR_TOTAL})) + ")

na hora de executar o relatório aparece o erro:

Errors compiling C:\Users\Jallisson\Desktop\SISTEMA SERF\SISTEMA

SIP\MYSQL\SIP\Projeto\Sip\relatorios\Atendimento.jasper!
Compilation exceptions: com.jaspersoft.ireport.designer.compiler.ErrorsCollector@53aefa  net.sf.jasperreports.engine.JRException: Errors were encountered when compiling report expressions class file: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: calculator_Atendimento_1460115738848_653725: 273: unable to resolve class Extenso   @ line 273, column 46. calculator_Atendimento_1460115738848_653725: 353: unable to resolve class Extenso   @ line 353, column 46. calculator_Atendimento_1460115738848_653725: 433: unable to resolve class Extenso   @ line 433, column 46. 3 errors      at net.sf.jasperreports.compilers.JRGroovyCompiler.compileUnits(JRGroovyCompiler.java:101)     at net.sf.jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompiler.java:188)     at net.sf.jasperreports.engine.JasperCompileManager.compileReport(JasperCompileManager.java:215)     at net.sf.jasperreports.engine.JasperCompileManager.compileReportToFile(JasperCompileManager.java:131)     at com.jaspersoft.ireport.designer.compiler.IReportCompiler.run(IReportCompiler.java:515)     at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:572)     at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:997) Caused by: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: calculator_Atendimento_1460115738848_653725: 273: unable to resolve class Extenso   @ line 273, column 46. calculator_Atendimento_1460115738848_653725: 353: unable to resolve class Extenso   @ line 353, column 46. calculator_Atendimento_1460115738848_653725: 433: unable to resolve class Extenso   @ line 433, column 46. 3 errors      at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:296)     at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:829)     at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:511)     at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:487)     at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:464)     at net.sf.jasperreports.compilers.JRGroovyCompiler.compileUnits(JRGroovyCompiler.java:97)     ... 6 more

classe é essa

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package extenso;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.DecimalFormatSymbols;
import java.util.ArrayList;
import java.util.Formatter;
import java.util.Iterator;
/**
 *
 * @author Jallisson
 */
public class Extenso {
 private ArrayList<Integer> nro;
    private BigInteger num;
    private BigDecimal valorMonetario;

    private String Qualificadores[][] = { { "centavo", "centavos" },
            { "", "" }, { "mil", "mil" }, { "milhão", "milhões" },
            { "bilhão", "bilhões" }, { "trilhão", "trilhões" },
            { "quatrilhão", "quatrilhões" }, { "quintilhão", "quintilhões" },
            { "sextilhão", "sextilhões" }, { "septilhão", "septilhões" } };

    private String Numeros[][] = {
            { "zero", "um", "dois", "três", "quatro", "cinco", "seis", "sete",
                    "oito", "nove", "dez", "onze", "doze", "treze", "quatorze",
                    "quinze", "desesseis", "desessete", "dezoito", "desenove" },
            { "vinte", "trinta", "quarenta", "cinquenta", "sessenta",
                    "setenta", "oitenta", "noventa" },
            { "cem", "cento", "duzentos", "trezentos", "quatrocentos",
                    "quinhentos", "seiscentos", "setecentos", "oitocentos",
                    "novecentos" } };


    public Extenso() {
        nro = new ArrayList<Integer>();
    }

    /**
     * <p>
     * Construtor.
     * </p>
     *
     * @param dec
     *            Valor para colocar por extenso.
     * @since JDK 1.5
     */
    public Extenso(BigDecimal dec) throws NumberFormatException {
        this();
        setNumber(dec);
    }

    /**
     * <p>
     * Construtor.
     * </p>
     *
     * @param dec
     *            Valor para colocar por extenso.
     * @since JDK 1.5
     */
    public Extenso(double dec) throws NumberFormatException {
        this();
        setNumber(dec);
    }

    /**
     * <p>
     * Seta o atributo Number.
     * </p>
     *
     * @param dec
     *            O novo valor para Number.
     * @since JDK 1.5
     */
    public void setNumber(BigDecimal dec) throws NumberFormatException {

        // Mantém o valor informado no escopo da classe para utilização
        // posterior
        // pelo método DecimalFormat desta mesma classe.
        valorMonetario = dec;

        // Se o valor informado for negativo ou maior que 999 septilhões,
        // dispara uma exceção.
        BigDecimal maxNumber = new BigDecimal("999999999999999999999999999.99");
        if ((dec.signum() == -1) || (dec.compareTo(maxNumber) == 1)) {
            throw new NumberFormatException(
                    "\nNao sao suportados numeros negativos ou maiores que 999 septilhoes para a conversao de valores monetarios."
                            + "\nNumeros validos vao de 0,00 até 999.999.999.999.999.999.999.999.999,99"
                            + "\nO numero informado foi: " + DecimalFormat());
        }

        // Converte para inteiro arredondando os centavos.
        num = dec.setScale(2, BigDecimal.ROUND_HALF_UP).multiply(
                BigDecimal.valueOf(100)).toBigInteger();

        // Adiciona valores.
        nro.clear();
        if (num.equals(BigInteger.ZERO)) {
            // Centavos.
            nro.add(new Integer(0));
            // Valor.
            nro.add(new Integer(0));
        } else {
            // Adiciona centavos.
            addRemainder(100);

            // Adiciona grupos de 1000.
            while (!num.equals(BigInteger.ZERO)) {
                addRemainder(1000);
            }
        }
    }

    /**
     * <p>
     * Seta o atributo Number.
     * </p>
     *
     * @param dec
     *            O novo valor para Number.
     * @since JDK 1.5
     */
    public void setNumber(double dec) throws NumberFormatException {
        setNumber(new BigDecimal(dec));
    }

    /**
     * <p>
     * Mostra o valor por extenso no console.
     * </p>
     *
     * @since JDK 1.5
     */
    public void show() {
        Iterator<Integer> valores = nro.iterator();

        while (valores.hasNext()) {
            System.out.println(valores.next().intValue());
        }
        System.out.println(toString());
    }

    /**
     * <p>
     * Mostra o valor monetário formatado pelo International Locale Default.
     * </p>
     *
     * @return String O valor monetário (numérico) formatado pelo International
     *         Locale Default.
     * @since JDK 1.5
     */
    public String DecimalFormat() {
        // A classe Formatter() incluida desde o JDK 1.5.0 tem que ser utilizada
        // devido
        // a class DecimalFormat() não suportar o tipo BigDecimal(),
        // somente o tipo primitivo double.
        // System.out.println("Numero : " + (new
        // DecimalFormat().format(Double.valueOf(args[0]))));
        Formatter formatter = new Formatter();
        DecimalFormatSymbols sym = new DecimalFormatSymbols();
        Object[] objs = new Object[1];
        objs[0] = valorMonetario;
        formatter.format("%-,27.2f", objs);

        // retorna o número informado no formato de valor monetário,
        // International Locale Default.
        return sym.getCurrencySymbol() + " " + formatter.toString();
    }

    /**
     * <p>
     * Mostra o valor do número por extenso.
     * </p>
     *
     * @return String com o valor do número por extenso.
     * @since JDK 1.5
     */
    @Override
    public String toString() {
        StringBuffer buf = new StringBuffer();

        int numero = nro.get(0).intValue();
        int ct;

        for (ct = nro.size() - 1; ct > 0; ct--) {
            // Se ja existe texto e o atual não é zero
            if (buf.length() > 0 && !ehGrupoZero(ct)) {
                buf.append(" e ");
            }
            buf.append(numToString(nro.get(ct).intValue(), ct));
        }
        if (buf.length() > 0) {
            if (ehUnicoGrupo())
                buf.append(" de ");
            while (buf.toString().endsWith(" "))
                buf.setLength(buf.length() - 1);
            if (ehPrimeiroGrupoUm())
                buf.insert(0, "h");
            if (nro.size() == 2 && nro.get(1).intValue() == 1) {
                buf.append(" real");
            } else {
                buf.append(" reais");
            }
            if (nro.get(0).intValue() != 0) {
                buf.append(" e ");
            }
        }
        if (nro.get(0).intValue() != 0) {
            buf.append(numToString(nro.get(0).intValue(), 0));
        }
        return buf.toString();
    }

    /**
     * <p>
     * Identifica se a quantidade de dígitos do primeiro grupo do valor for
     * igual a uma unidade.
     * </p>
     *
     * @return boolean <code><b>true</b></code> se a quantidade de dígitos do
     *         primeiro grupo for igual a 1. <code><b>false</b></code> se a
     *         quantidade de dígitos do primeiro grupo for maior que 1.
     * @since JDK 1.5
     */
    private boolean ehPrimeiroGrupoUm() {
        if (nro.get(nro.size() - 1).intValue() == 1)
            return true;
        return false;
    }

    /**
     * <p>
     * Adiciona uma característica para o atributo Remainder (resto de uma
     * divisão).
     * </p>
     *
     * @param divisor
     *            A característica a ser adicionada ao atributo Remainder.
     * @since JDK 1.5
     */
    private void addRemainder(int divisor) {
        // Encontra newNum[0] = num módulo divisor, newNum[1] = num dividido
        // divisor.
        BigInteger[] newNum = num.divideAndRemainder(BigInteger
                .valueOf(divisor));

        // Adiciona módulo.
        nro.add(new Integer(newNum[1].intValue()));

        // Altera número.
        num = newNum[0];
    }

    /**
     * <p>
     * Identifica se o número possui mais grupos.
     * </p>
     * <p>
     * Obs.: Grupos são também conhecidos por casas, assim como, casas decimais,
     * casas de milhar, milhão, bilhão, trilhão, etc.
     * </p>
     *
     * @param ps
     *            posição do dígito no número.
     * @return boolean <code><b>true</b></code> se a posição do dígito no
     *         número conter um valor maior que 1. <code><b>false</b></code>
     *         se a posição do dígito no número conter um valor igual a zero.
     * @since JDK 1.5
     */
    private boolean temMaisGrupos(int ps) {
        for (; ps > 0; ps--) {
            if (nro.get(ps).intValue() != 0)
                return true;
        }
        return false;
    }

    /**
     * <p>
     * Identifica se o grupo corrente é o último a ser convertido por extenso.
     * </p>
     * <p>
     * Obs.: Grupos são também conhecidos por casas, assim como, casas decimais,
     * casas de milhar, milhão, bilhão, trilhão, etc.
     * </p>
     *
     * @param ps
     *            posição do dígito no número.
     * @return boolean <code><b>true</b></code> se a posição do dígito no
     *         número conter um valor maior que 1. <code><b>false</b></code>
     *         se a posição do dígito no número conter um valor igual a zero.
     * @since JDK 1.5
     */
    private boolean ehUltimoGrupo(int ps) {
        return (ps > 0) && nro.get(ps).intValue() != 0
                && !temMaisGrupos(ps - 1);
    }

    /**
     * <p>
     * Identifica se o número só possui a casa decimal a ser convertida por
     * extenso, além da casa centezimal (dos centavos) obviamente.
     * </p>
     * <p>
     * Obs.: Grupos são também conhecidos por casas, assim como, casas decimais,
     * casas de milhar, milhão, bilhão, trilhão, etc.
     * </p>
     *
     * @return boolean <code><b>true</b></code> se a posição do dígito no
     *         número conter um valor maior que 1. <code><b>false</b></code>
     *         se a posição do dígito no número conter um valor igual a zero.
     * @since JDK 1.5
     */
    private boolean ehUnicoGrupo() {
        if (nro.size() <= 3)
            return false;
        if (!ehGrupoZero(1) && !ehGrupoZero(2))
            return false;
        boolean hasOne = false;
        for (int i = 3; i < nro.size(); i++) {
            if (nro.get(i).intValue() != 0) {
                if (hasOne)
                    return false;
                hasOne = true;
            }
        }
        return true;
    }

    /**
     * <p>
     * Identifica se o número não possui a casa decimal (valor inteiro igual a
     * zero) restando apenas a casa centezimal (dos centavos) a ser convertida
     * por extenso.
     * </p>
     * <p>
     * Obs.: Grupos são também conhecidos por casas, assim como, casas decimais,
     * casas de milhar, milhão, bilhão, trilhão, etc.
     * </p>
     *
     * @param ps
     *            posição do dígito no número.
     * @return boolean <code><b>true</b></code> se a posição do dígito no
     *         número conter um valor maior que 1. <code><b>false</b></code>
     *         se a posição do dígito no número conter um valor igual a zero.
     * @since JDK 1.5
     */
    private boolean ehGrupoZero(int ps) {
        if (ps <= 0 || ps >= nro.size())
            return true;
        return nro.get(ps).intValue() == 0;
    }

    /**
     * <p>
     * Converte um número em uma String para identificar o posicionamento de
     * seus dígitos.
     * </p>
     *
     * @param numero
     *            Parte inteira do número (do valor monetário).
     * @param escala
     *            Parte centezimal do número (dos centavos).
     * @return String O número informado convertido em String.
     * @since JDK 1.5
     */
    private String numToString(int numero, int escala) {
        int unidade = (numero % 10);
        int dezena = (numero % 100); // * nao pode dividir por 10 pois
                                        // verifica
        // de 0..19
        int centena = (numero / 100);

        StringBuffer buf = new StringBuffer();

        if (numero != 0) {
            if (centena != 0) {
                if (dezena == 0 && centena == 1) {
                    buf.append(Numeros[2][0]);
                } else {
                    buf.append(Numeros[2][centena]);
                }
            }

            if ((buf.length() > 0) && (dezena != 0)) {
                buf.append(" e ");
            }
            if (dezena > 19) {
                dezena /= 10;
                buf.append(Numeros[1][dezena - 2]);
                if (unidade != 0) {
                    buf.append(" e ");
                    buf.append(Numeros[0][unidade]);
                }
            } else if (centena == 0 || dezena != 0) {
                buf.append(Numeros[0][dezena]);
            }

            buf.append(" ");
            if (numero == 1) {
                buf.append(Qualificadores[escala][0]);
            } else {
                buf.append(Qualificadores[escala][1]);
            }
        }

        return buf.toString();
    }
/*
    public static void main(String[] args) throws NumberFormatException {
        // Converte do tipo BigDecimal para a String por extenso.
        Extenso teste = new Extenso(new BigDecimal(55.69));

        // Mostra o número informado no formato de valor monetário.
        System.out.println("Numero  : " + teste.DecimalFormat());

        // Mostra o número informado no formato de valor por extenso.
        System.out.println("Extenso : " + teste.toString());
    }
*/
}

olá, experimente passar o valor por extenso como parâmetro para o Jasper no momento que está criando o relatório em sua classe geradora.

Algo como:

map.put("P_EXTENSO", valores.getExtenso());

Aí no seu relátorio você cria o parâmetro P_EXTENSO e coloca no TextField que for utilizá-lo.

Acredito que o erro acontece devido ao JasperReport não ter acesso a sua classe. somente as classes internas e as padrões do java.

aqui eu passo o valor extenso por parâmetro e dá certo.

Foi Resolvido

Primeiro tem que adicionar o .jar no Classpath do Ireport

No meu Projeto eu verifico em qual pacote está a classe conforme a imagem acima

Na propriedade do relatório na parte de Imports eu adiciono o pacote e a classe

por fim o relatório é impresso.