gpt4 book ai didi

java - 如何将用户函数添加到从 JasperCompilerManager 编译的 jrxml 中

转载 作者:行者123 更新时间:2023-12-02 04:50:42 26 4
gpt4 key购买 nike

我在一个 Java 项目中使用 Jasper Report,其中有一个 JRXML 文件,在一个特定的类中,我编译该文件,然后用数据填充它。但现在,我想创建一个函数,以字母形式返回整数和的结果值。

我尝试使用 iReport 并创建一个 JAR 文件,它可以在 Jasper 的 IDE 上预览,但我正在 IntelliJ IDE 上处理 spring-boot 项目,我不知道如何在其中复制这是我使用 JasperCompilerManager 从代码编译 JRXML 的另一个环境。

在文件sr_front_kardex_1.jrxml中是我想添加功能的地方,例如:

<textField>
<reportElement x="240" y="95" width="100" height="30" uuid="e531b6f4-146b-4b62-b613-3122554c6d01"/>
<textFieldExpression><![CDATA[NumToWord.convert(1)]]</textFieldExpression>
</textField>

NumToWord.java 文件中的代码是:

import java.util.HashMap;
import java.util.Map;

public class NumToWord {

public static String convert(Integer anioscursados){
Map<Integer,String> mapGradosText = new HashMap<>();
mapGradosText.put(1,"UN AÑO");
mapGradosText.put(2,"DOS AÑOS");
mapGradosText.put(3,"TRES AÑOS");
mapGradosText.put(4,"CUATRO AÑOS");
mapGradosText.put(5,"CINCO AÑOS");
mapGradosText.put(6,"SEIS AÑOS");
mapGradosText.put(7,"SIETE AÑOS");
mapGradosText.put(8,"OCHO AÑOS");
mapGradosText.put(9,"NUEVE AÑOS");
mapGradosText.put(10,"DIEZ AÑOS");
mapGradosText.put(11,"ONCE AÑOS");
mapGradosText.put(12,"DOCE AÑOS");

return mapGradosText.containsKey(anioscursados) ? mapGradosText.get(anioscursados) : "-" ;
}
}

我编译 JRXML 的部分在下面的代码中:

System.out.println(NumToWord.convert(1)); //print UN AÑO
String path = resourceLoader.getResource("classpath:" + mainReport).getURI().getPath();
JasperReport jasperReport = JasperCompileManager.compileReport(path);

String pathSr = resourceLoader.getResource("classpath:" + subReport).getURI().getPath();
JasperCompileManager.compileReportToFile(pathSr);

String pathSrb = resourceLoader.getResource("classpath:sr_front_kardex_1.jrxml").getURI().getPath();
JasperCompileManager.compileReportToFile(pathSrb);

jasperPrint = JasperFillManager.fillReport(jasperReport, new HashMap<String,Object>(),new JRBeanCollectionDataSource(lsDataSource));

这就是出现的错误。

error en ReporteCajaManagerImpl net.sf.jasperreports.engine.JRException: Errors were encountered when compiling report expressions class file:
1. NumToWord cannot be resolved
value = NumToWord.convert(1); //$JR_EXPR_ID=36$
<------->
2. NumToWord cannot be resolved
value = NumToWord.convert(1); //$JR_EXPR_ID=36$
<------->
3. NumToWord cannot be resolved
value = NumToWord.convert(1); //$JR_EXPR_ID=36$
<------->
3 errors

我确定这是因为 JAR 文件未包含在内,但我不知道如何执行此操作。

目录树如下所示:

enter image description here

解决方案:

根据在评论中帮助我的人和其中之一(Oscar Perez 和 Petter Friberg)的回答,我将类放入项目中(如上图所示,其中显示了目录树)并且我在 jrxml 文件中写入类的绝对路径,如下例所示:

<textFieldExpression><![CDATA[org.eduadvent.reportes.NumToWord.convert(1)]]></textFieldExpression>

最佳答案

编译 JRXML 会将其转换为位于类路径中的常规 java 类。因此它可以访问所有类路径对象。

要访问成员函数,您只需在报告中指定它的绝对名称。所以:

  1. 确保您的 NumToWork 类位于源类路径中。
  2. 更改您的 JRXML 以绝对引用此类:
<textFieldExpression><![CDATA[org.eduadvent.reportes.NumToWord.convert(1)]]></textFieldExpression>

关于java - 如何将用户函数添加到从 JasperCompilerManager 编译的 jrxml 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56445458/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com