- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个独立的应用程序,它的职责之一是获取 *.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/
我在 SSRS 中创建报告时收到上述错误。我试图从 2 个数据库获取 2 个数据集,为此我使用 Dataset1 中的数据创建一个主报告,并使用另一个数据集创建一个子报告。 当我创建同一数据集的子报表
Windows 7 上的 iReport 4.5.1 我有一个包含 7 个子报表的报表。该报告针对一组数据运行...大约 10 个项目。大约 9 个项目包含 3 个子报表。其他报告针对一个特定项目运行
如何将参数传递给 JasperReports 中的子报表? 我可以将参数传递给主报告,但我无法将参数传递给它的子报告。 任何人都可以给我解决方案吗? 最佳答案 尝试使用 iReport如果你不是。 在
无法查看带有子报表的主报表... 主要 Java 类 public class SubRepoExample { public static void main(String[] arg
我有一个独立的应用程序,它的职责之一是获取 *.jrxml 文件的路径并进行编译。 在出现带有子报表的报表之前,我可以毫无问题地执行此操作,其中主报表的编译不会编译其任何子报表,从而导致子报表 *.j
如何设置子报表的参数?我已成功连接到 SubreportProcessing 事件,我可以通过 e.ReportPath 找到正确的子报表,并且可以通过 e.DataSources.Add 添加数据源
这让我发疯.. 上一小时我试图弄清楚为什么我的报告在添加子报表后立即停止工作..我已经检查并尝试了所有类似的问题 here , here和 here .没有成功.. 子报表肯定在同一目录中..定义如下
我有一个运行多个子报告的主报告。我的一个子报告在预览版中运行得非常好,但是当我部署报告并从浏览器运行它时,我只是得到: 错误:无法显示子报表。 我已经做了一些研究,但我仍然不确定问题是什么。我在不同的
我想让用户单击直方图的一列,并让该操作加载基于该列的属性包含的子报表。 这将使 SSRS 报告更具交互性并且更有用。 我注意到,在指定操作时,我们会看到以下对话框,其中包含“转到报告”,但没有“加载子
情况我有一个报告,其中包含一个标题和详细信息区域中的四个子报告。子报表通过查询数据库来获取数据。 要求如果所有子报表都没有数据,那么我希望不要生成主报表 - 类似于属性“没有数据时”设置为“无页面”。
是否可以将纵向和横向子报表合并到一个报表中?我正在使用 iReport 2.0.4,但似乎找不到任何选项来执行此操作。 最佳答案 不幸的是,我认为这是不可能的。 所有子报表都遵循主报表的方向。 关于j
在我的项目中,有三个报表 - 主报表和两个子报表,每个子报表都有自己的数据集(所有数据集唯一共有的列是 ItemID)。主报表将 ItemID 作为参数传递给它的两个子报表。 主报表以类似表单的布局构
我的要求是在一个报告中显示两个子报告。我正在做的是,我创建了两个子报告并将其放入报告中。 但问题是,两个子报告都在增长(即它们的高度不是静态的,因为记录数是可变的)。我只希望第二个 sub=repor
我有一个通常大于一页的子报表。子报表有一个标题,如果子报表多于一页,该标题应重复。 我的解决方案是创建一个 Tablix 控件并将标题放在第一行。在详细信息行中,我放置了子报表。 首先我试着检查 Re
我正在使用 JesperRports 创建一个包含 SubReport 的报告,但它不起作用,而且代码看起来不错。 我得到的警告是:提供的 java.sql.Connection 对象为 null。
我有一个包含用户信息的主报表和一个包含所述用户的多个项目的子报表。 问题是,我需要根据输入数据源的用户数量,将主报告复制尽可能多的次数——我该怎么做才能生成一个大报告(包含主报告的倍数)报告)? 编辑
在这个例子中子报表重叠——我做错了什么?第二个应该“ float ”在第一个之下,它的 'y' 属性被忽略,但事实并非如此。 谢谢 !!
我需要在 JasperReports 中开发一份报告,其中包含一个子报告,但该子报告会针对列表参数中的每个值重复。例如: 要传递给ONE 子报表 的参数列表:1,2,3,4 我的报告: 传递参数的
场景: 我有两个报告:主报告(我们称之为 A)和子报告(我们称之为 B)。 报表 A 在详细信息带中包含子报表 B,因此子报表 B 会针对报表 A 数据源中的每个元素显示。子报表 B 也返回一个变量给
我知道以前有人问过这个问题,但所有问题都是针对使用 C# 或 VB.NET 代码访问的报告。我的问题是我正在使用商业智能工作室构建和访问报告,我基本上是在尝试为报告添加一个子报告,并且我从参数中确保它
我是一名优秀的程序员,十分优秀!