Jasper reports 在运行时更改jasper报表参数
我知道,但我们真的需要它。 我们有明确的分工。 他们创建模板,我根据一些规则在运行时填充它们Jasper reports 在运行时更改jasper报表参数,jasper-reports,Jasper Reports,我知道,但我们真的需要它。 我们有明确的分工。 他们创建模板,我根据一些规则在运行时填充它们 无法教会我的企业插入类似的内容,并确保他们确实做得很好(因此无法将任何逻辑移动到模板): $p{risk\u type}.get($F{risk\u type})?:“未定义” 也不能从一些适配器中硬编码的文件中填充,这些适配器是由上帝知道谁编写的,并且在运行时是不可更改的。这是一个网络应用程序。最好的选择是找到一种方法,将该文件源从适配器替换为ByteArrayStream 因此: 需要在运行
- 无法教会我的企业插入类似的内容,并确保他们确实做得很好(因此无法将任何逻辑移动到模板):
- 也不能从一些适配器中硬编码的文件中填充,这些适配器是由上帝知道谁编写的,并且在运行时是不可更改的。这是一个网络应用程序。最好的选择是找到一种方法,将该文件源从适配器替换为ByteArrayStream
谢谢大家! 我们做到这一点的最简单、最干净的方法(绕过大量不推荐使用的文档和未完成的有缺陷的未记录静态反模式新功能): 使用存储库扩展创建上下文
SimpleJasperReportsContext jasperReportsContext = new SimpleJasperReportsContext();
jasperReportsContext.setExtensions(RepositoryService.class, Collections.singletonList(new MyRepositoryService(jasperReportsContext, yourOptionalParams)));
以这种方式填充(在编译和其他常规操作之后)
现在感谢你无用的名誉改变。您试图隐藏jasper糟糕而肮脏的实现细节以强制购买更多商业版本的尝试失败了。
JasperPrint print = JasperFillManager.getInstance(jasperReportsContext).fill(compiled, new HashMap<>());
public class PrintFormsRepositoryService extends DefaultRepositoryService {
@Override
public InputStream getInputStream(RepositoryContext context, String uri) {
// return here your own good simple poj inputStream even from memory if you found source
// or pass to another repository service(default one probably)
return null;
}
}