jasperreports中如何填补细节区域中的空白行

本文档详细介绍了在JasperReports中如何在打印细节区域时填补空白行的方法,包括fillDetail和fillDetailBlankBand等关键函数的使用,确保在断页和分组时正确处理空白行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近一直在学习jasperreports,看过 jasperreport  ultimate guide 1.2.5后,会了一般的使用,不过,还是碰到不少问题
1)在detail中画线,大家应该都用过,不过会出现下图中的问题
通过阅读代码,找到了一个解决办法
JRHorizontalFiller,水平添加实现
1)修改fillDetail
java 代码
 
  1. private void fillDetail() throws JRException {  
  2.      JRFillBand tmp = detail;  
  3.      if (log.isDebugEnabled() && !detail.isEmpty()) {  
  4.          log.debug("Fill " + fillerId + ": detail");  
  5.      }  
  6.   
  7.      if (!detail.isPrintWhenExpressionNull()) {  
  8.          calculator.estimateVariables();  
  9.          detail.evaluatePrintWhenExpression(JRExpression.EVALUATION_ESTIMATED);  
  10.      }  
  11.   
  12.      if (detail.isToPrint()) {  
  13.          while (  
  14.                  (columnIndex == columnCount - 1 || isNewGroup)  
  15.                          && detail.getHeight() > columnFooterOffsetY - offsetY  
  16.                  ) {判断什么时间断页  
  17.              //在断页前,填充细节区域中的空白行  
  18.              fillDetailBlankBand(tmp, JRExpression.EVALUATION_DEFAULT, false, columnFooterOffsetY - offsetY,offsetY);  
  19.              byte evalPrevPage = (isNewGroup ? JRExpression.EVALUATION_DEFAULT : JRExpression.EVALUATION_OLD);  
  20.   
  21.              fillPageBreak(  
  22.                      false,  
  23.                      evalPrevPage,  
  24.                      JRExpression.EVALUATION_DEFAULT,  
  25.                      true  
  26.              );  
  27.          }  
  28.      }  
  29.   
  30.      scriptlet.callBeforeDetailEval();  
  31.      calculator.calculateVariables();  
  32.      scriptlet.callAfterDetailEval();  
  33.   
  34.      if (!detail.isPrintWhenExpressionNull()) {  
  35.          detail.evaluatePrintWhenExpression(JRExpression.EVALUATION_DEFAULT);  
  36.      }  
  37.   
  38.      if (detail.isToPrint()) {  
  39.          if (  
  40.                  offsetX == lastDetailOffsetX  
  41.                          && offsetY == lastDetailOffsetY  
  42.                  ) {  
  43.              if (columnIndex == columnCount - 1) {  
  44.                  setFirstColumn();  
  45.              } else {  
  46.                  columnIndex++;  
  47.                  offsetX += columnWidth + columnSpacing;  
  48.                  offsetY -= detail.getHeight();  
  49.   
  50.                  setColumnNumberVariable();  
  51.              }  
  52.          }  
  53.   
  54.          fillFixedBand(detail, JRExpression.EVALUATION_DEFAULT, false);  
  55.   
  56.          lastDetailOffsetX = offsetX;  
  57.          lastDetailOffsetY = offsetY;  
  58.      }  
  59.   
  60.      isNewPage = false;  
  61.      isNewColumn = false;  
  62.      isNewGroup = false;  
  63.  }  

2)修改fillPageFooter
java 代码
 
  1. private void fillPageFooter(byte evaluation) throws JRException {  
  2.        JRFillBand crtPageFooter = getCurrentPageFooter();  
  3.   
  4.        if (log.isDebugEnabled() && !crtPageFooter.isEmpty()) {  
  5.            log.debug("Fill " + fillerId + ": " + (isLastPageFooter ? "last " : "") + "page footer");  
  6.        }  
  7.   
  8.        offsetX = leftMargin;  
  9.   
  10.        if (!isSubreport() && !fillContext.isIgnorePagination()) {  
  11.            offsetY = pageHeight - crtPageFooter.getHeight() - bottomMargin;  
  12.        }  
  13.   
  14.        crtPageFooter.evaluatePrintWhenExpression(evaluation);  
  15.   
  16.        if (crtPageFooter.isToPrint()) {  
  17.            //填充细节区域中的空白行  
  18.           fillDetailBlankBand(detail, evaluation, true, columnFooterOffsetY - lastDetailOffsetY,lastDetailOffsetY);  
  19.            fillFixedBand(crtPageFooter, evaluation);  
  20.        }  
  21.    }  

3)添加 fillDetailBlankBand
java 代码
 
  1. protected void fillDetailBlankBand(JRFillBand band, byte evaluation, boolean allowShrinking, int stretchHeight, int _offsetY) throws JRException {  
  2.        JRPrintBand printBand = band.fill(stretchHeight);  
  3.        printBand.setHeight(stretchHeight);  
  4.        JRPrintElement printElement = null;  
  5.        JRElement[] fillElements = band.getElements();  
  6.        for (int i = 0; i < fillElements.length; i++) {  
  7.            JRFillElement fillElement = (JRFillElement) fillElements[i];  
  8.            if (fillElement instanceof JRFillTextField) {  
  9.                JRFillTextField fillFieldElement = (JRFillTextField) fillElement;  
  10.                fillFieldElement.rewind();  
  11.                fillFieldElement.setRawText("");  
  12.                printElement = fillFieldElement.fill();  
  13.                printElement.setHeight(stretchHeight);  
  14.                printElement.setX(printElement.getX() + offsetX);  
  15.                printElement.setY(printElement.getY() + _offsetY);  
  16.                printPage.addElement(printElement);  
  17.                //  printBand.addElement(printElement);  
  18.            }  
  19.        }  
  20.        resolveBandBoundElements(band, evaluation);  
  21.    }  

通过以上步骤就解决了这个问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值