gpt4 book ai didi

java - 碧 Jade 报告 : How to compile subreports

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:47:06 24 4
gpt4 key购买 nike

我有一个独立的应用程序,它的职责之一是获取 *.jrxml 文件的路径并进行编译。

在出现带有子报表的报表之前,我可以毫无问题地执行此操作,其中主报表的编译不会编译其任何子报表,从而导致子报表 *.jasper 文件在以后的跟踪中找不到。

有什么办法

1) 将 JasperCompileManager 设置为自动获取子报表?

2) 获取包含在 JasperDesign 或 JasperReport 对象中的子报表的路径列表?

我无法直接访问 jrxml 文件,因此无法修改报告以适应编译方法,也无法应用任何标准命名方案来推断哪些子报告属于哪些报告。

这里也有类似的问题:

http://jasperforge.org/plugins/espforum/view.php?group_id=102&forumid=103&topicid=40683

其中 JRVisitor 用于生成 JRSubreport 对象列表,但是没有解释如何使用它来获取子报表的路径以便编译它并递归查找子报表的子报表,我无法理解出来。

最佳答案

好吧,所以它需要一点技巧,但我能够想出一些办法...

subreport.getExpression().getText() 返回主报表中子报表小部件的表达式字段,是一个字符串,看起来像这样

$P{SUBREPORT_DIR} + "/report_sub1.jasper"

所以我能够使用以下方法将它拆开以获得名称。这并不理想,但应该能坚持下去。

JRElementsVisitor.visitReport(jasperReport, new JRVisitor(){

// ** snip other overrides **

@Override
public void visitSubreport(JRSubreport subreport){
String expression = subreport.getExpression().getText().replace(".jasper", ".jrxml");
StringTokenizer st = new StringTokenizer(expression, "\"/");
String subreportName = null;
while(st.hasMoreTokens())
subreportName = st.nextToken();
compileReport(subreportName);
}
}

编辑:

这是我的整个 compileReport 方法,演示了如何递归编译子报表等的子报表。不完美,但对我的应用程序来说已经足够好了。所有已编译的 *.jasper 文件都保存回磁盘上与未编译的 *.jrxml 文件相同的位置,但这并不难更改。编译后的主报告对象被传回,以防您想要运行它或其他任何东西。

请记住,此代码在进行此编辑时已有 9 个月的历史,较新版本的 Jasper Reports 现在可能具有针对此类内容的内置函数。

private static final String reportsPath = "someplace/nice/";
private ArrayList<String> completedSubReports = new ArrayList<String>(30);
private Throwable subReportException = null;

/**
* Recursively compile report and subreports
*/
public JasperReport compileReport(String reportName) throws Throwable{
JasperDesign jasperDesign = JRXmlLoader.load(reportsPath + reportName + ".jrxml");
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
JRSaver.saveObject(jasperReport, reportsPath + reportName + ".jasper");
toLog("Saving compiled report to: " + reportsPath + reportName + ".jasper");
//Compile sub reports
JRElementsVisitor.visitReport(jasperReport, new JRVisitor(){
@Override
public void visitBreak(JRBreak breakElement){}

@Override
public void visitChart(JRChart chart){}

@Override
public void visitCrosstab(JRCrosstab crosstab){}

@Override
public void visitElementGroup(JRElementGroup elementGroup){}

@Override
public void visitEllipse(JREllipse ellipse){}

@Override
public void visitFrame(JRFrame frame){}

@Override
public void visitImage(JRImage image){}

@Override
public void visitLine(JRLine line){}

@Override
public void visitRectangle(JRRectangle rectangle){}

@Override
public void visitStaticText(JRStaticText staticText){}

@Override
public void visitSubreport(JRSubreport subreport){
try{
String expression = subreport.getExpression().getText().replace(".jasper", "");
StringTokenizer st = new StringTokenizer(expression, "\"/");
String subReportName = null;
while(st.hasMoreTokens())
subReportName = st.nextToken();
//Sometimes the same subreport can be used multiple times, but
//there is no need to compile multiple times
if(completedSubReports.contains(subReportName)) return;
completedSubReports.add(subReportName);
compileReport(subReportName);
}
catch(Throwable e){
subReportException = e;
}
}
@Override
public void visitTextField(JRTextField textField){}

@Override
public void visitComponentElement(JRComponentElement componentElement){}

@Override
public void visitGenericElement(JRGenericElement element){}
});
if(subReportException != null) throw new RuntimeException(subReportException);
return jasperReport;
}

关于java - 碧 Jade 报告 : How to compile subreports,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10004800/

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