Jasper Reports:如何编译子报表

2024-01-27

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

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

有什么办法可以

1)设置JasperCompileManager自动拾取子报表?

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

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

这里有一个类似的问题:

其中 JRVistor 用于生成 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);
  }
}

EDIT:

这是我的整个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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jasper Reports:如何编译子报表 的相关文章

随机推荐

  • VB6 生成后,如何在 Azure Devops 中设置复制文件任务?

    作为回应关于为 VB6 项目制作 Azure 构建管道的问题 https stackoverflow com questions 54796027 how do i specify my custom agent in the build
  • PHP 中的静态函数变量和串联

    考虑以下 var foo bar Not a member of a class free standing or in a function 我一标记 var as static 然而 static var foo bar PHP WAM
  • 推送返回父函数

    有没有办法强制父函数返回输出 假设我有一个 做某事 的函数 并且在每个函数的开头想要 检查某事 如果检查失败我想返回 其他东西 在我下面的示例中 做某事 是对数 检查某事 意味着检查变量是否为非负数 其他事情 是否为负无穷大 weird l
  • 如果[获取变量]等于[数组]

    我正在尝试找到更简单的方法来编写逻辑 也就是说 如果一个变量等于数组中的任何键值 例如 someArray array a b c If GET foobar someArray return true else return false
  • 为什么当 btn 为 NIL 时我可以访问 btn.Caption?

    为什么这段代码不会崩溃 T为零 如何才能访问Caption if T is nil procedure Crash VAR T TButton begin T NIL T Caption lt this works end The TBut
  • 需要 Bash 整数表达式

    为了满足功能要求 我必须检索一个占空比参数 0 100 0 01 为了测试 我写了一些简单的东西 例如 bin bash if 1 lt 0 1 gt 100 then echo bad param else echo ok fi 我得到
  • 使用 javascript 显示/隐藏 div

    我有两个 div 一个是隐藏的 另一个是可见的 我正在使用CSSdisplay none 首先隐藏并使用style display block 当我刷新页面时 它在地址栏中给出相同的 div 名称 但 div 被隐藏 我只是希望 div 在
  • 在文本区域输入密钥

    I have a textarea On every Enter key pressed in textarea I want new line to be started with a bullet say How to go about
  • 图像类型文件 C# ASP.Net 所需的 IHttpHandler 示例

    任何人都可以提供 IHttpHnalder 处理图像类型的好例子 我想调整服务器上托管的图像的大小 使用 iHttpHandler 时出现问题 https stackoverflow com questions 385945 problem
  • 输出似乎只测试列表中最后一个的差异函数

    老问题链接 检查连续元素之间的差异是否相同 https stackoverflow com questions 52555706 checking if the difference between consecutive elements
  • 实体框架 4 - 连接 2 个表然后对它们进行分页的语法是什么?

    我有以下 linq to entities 查询 其中包含 2 个连接表 我想向其中添加分页 IQueryable
  • Acer Iconia A200 上的 VideoView getCurrentPosition() 不规则

    我有一个带有 VideoView 的应用程序 我设置了一个要在 VideoView 中播放的视频 视频播放时的某个时刻 它会暂停 然后 在暂停一段时间后 它将再次开始播放视频 但会向前播放到视频没有暂停时的位置 例如 视频开始播放 视频暂停
  • 我的 Excel 2010 添加仅在打开空白工作簿时显示。打开现有文档时不会显示

    我们已经制作了一个 Excel 插件 该插件已正确安装 并且仅在从主图标 或空白工作簿 打开 Excel 时才会显示 打开任何现有保存的 Excel 文档时 它不会显示在工具栏上 我已确保在打开现有文档时 在文件 gt 选项 gt 添加中
  • 如何在重新打开应用程序时显示相同的视图

    我有一个表视图 它在单击表中的某行时显示一个 Web 视图 该视图又从 SQLite 中获取数据 如果用户在 webview 中查看描述时按 home 键关闭应用程序 然后有时重新打开它 我应该让用户看到相同的屏幕 如何再次显示相同的视图
  • JQGrid 设置不同的 URL 进行添加、编辑、删除

    我想在网格顶部添加三个按钮 用于添加 编辑 删除 并希望为每个操作调用单独的 URL 我想为此使用表单编辑 谁能给我推荐一个示例代码 提前致谢 阿布舍克 如果您需要在网格顶部添加表单编辑按钮 您应该使用toppager truejqGrid
  • std.regex.regex 的返回值?

    我正在尝试编写一个函数 它接受一个输入字符串 一个正则表达式 由std regex regex来自原始字符串 和错误消息字符串 并尝试使用正则表达式匹配输入字符串中的某些内容 如果没有匹配则显示错误消息 到目前为止我想出了以下签名 stri
  • 从 Web api 返回 JsonResult,不带其属性

    我有一个 Web API 控制器 从那里我从一个操作返回一个 JSON 对象 我这样做是这样的 public ActionResult GetAllNotificationSettings var result new List
  • Paypal支付:在webview中加载paypal时如何获取成功请求

    Edit paypal登录后 我可以成功完成交易 但我需要匹配成功网址在 paypal 中验证两个 url 是否相同 然后显示成功的 toast 消息 但我没有从付款中获得成功网址 所以我无法匹配它 下面我发布了相关代码 WebActivi
  • 会话在 Firefox 中的通用处理程序 .ashx 中不起作用

    我创建了实现 IRequiresSessionState 的 ashx 因此我可以在该 ashx 中创建会话变量 它在 IE 中工作 但在 Firefox 中不起作用 当从其他页面访问此会话变量时 它为 NULL 任何想法 谢谢 也许您不允
  • Jasper Reports:如何编译子报表

    我有一个独立的应用程序 它的职责之一是获取 jrxml 文件的路径并编译它 我可以毫无问题地执行此操作 直到出现带有子报表的报表 其中主报表的编译不会编译其任何子报表 从而导致稍后找不到子报表 jasper 文件 有什么办法可以 1 设置J