2007-06-26

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

关键字: 补细节区域中的空白行
最近一直在学习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.    }  

通过以上步骤就解决了这个问题
  • 6dc54cc9-9181-4798-a316-dd09c3ddd9af-thumb
  • 描述:
  • 大小: 37.2 KB
  • 58b8cdc3-60d6-41b4-a411-9f7d328e4a17-thumb
  • 描述: 修改后填充的的图片
  • 大小: 37.9 KB
评论
发表评论

您还没有登录,请登录后发表评论

dellsoft
搜索本博客
我的相册
5d0d42bc-4234-4e78-9bcd-e51aa5ccf380-thumb
detail
共 1 张
存档
最新评论