最近一直在学习jasperreports,看过 jasperreport ultimate guide 1.2.5后,会了一般的使用,不过,还是碰到不少问题
1)在detail中画线,大家应该都用过,不过会出现下图中的问题
通过阅读代码,找到了一个解决办法
JRHorizontalFiller,水平添加实现
1)修改fillDetail
2)修改fillPageFooter
3)添加 fillDetailBlankBand
通过以上步骤就解决了这个问题
1)在detail中画线,大家应该都用过,不过会出现下图中的问题
通过阅读代码,找到了一个解决办法
JRHorizontalFiller,水平添加实现
1)修改fillDetail
java 代码
- private void fillDetail() throws JRException {
- JRFillBand tmp = detail;
- if (log.isDebugEnabled() && !detail.isEmpty()) {
- log.debug("Fill " + fillerId + ": detail");
- }
- if (!detail.isPrintWhenExpressionNull()) {
- calculator.estimateVariables();
- detail.evaluatePrintWhenExpression(JRExpression.EVALUATION_ESTIMATED);
- }
- if (detail.isToPrint()) {
- while (
- (columnIndex == columnCount - 1 || isNewGroup)
- && detail.getHeight() > columnFooterOffsetY - offsetY
- ) {判断什么时间断页
- //在断页前,填充细节区域中的空白行
- fillDetailBlankBand(tmp, JRExpression.EVALUATION_DEFAULT, false, columnFooterOffsetY - offsetY,offsetY);
- byte evalPrevPage = (isNewGroup ? JRExpression.EVALUATION_DEFAULT : JRExpression.EVALUATION_OLD);
- fillPageBreak(
- false,
- evalPrevPage,
- JRExpression.EVALUATION_DEFAULT,
- true
- );
- }
- }
- scriptlet.callBeforeDetailEval();
- calculator.calculateVariables();
- scriptlet.callAfterDetailEval();
- if (!detail.isPrintWhenExpressionNull()) {
- detail.evaluatePrintWhenExpression(JRExpression.EVALUATION_DEFAULT);
- }
- if (detail.isToPrint()) {
- if (
- offsetX == lastDetailOffsetX
- && offsetY == lastDetailOffsetY
- ) {
- if (columnIndex == columnCount - 1) {
- setFirstColumn();
- } else {
- columnIndex++;
- offsetX += columnWidth + columnSpacing;
- offsetY -= detail.getHeight();
- setColumnNumberVariable();
- }
- }
- fillFixedBand(detail, JRExpression.EVALUATION_DEFAULT, false);
- lastDetailOffsetX = offsetX;
- lastDetailOffsetY = offsetY;
- }
- isNewPage = false;
- isNewColumn = false;
- isNewGroup = false;
- }
2)修改fillPageFooter
java 代码
- private void fillPageFooter(byte evaluation) throws JRException {
- JRFillBand crtPageFooter = getCurrentPageFooter();
- if (log.isDebugEnabled() && !crtPageFooter.isEmpty()) {
- log.debug("Fill " + fillerId + ": " + (isLastPageFooter ? "last " : "") + "page footer");
- }
- offsetX = leftMargin;
- if (!isSubreport() && !fillContext.isIgnorePagination()) {
- offsetY = pageHeight - crtPageFooter.getHeight() - bottomMargin;
- }
- crtPageFooter.evaluatePrintWhenExpression(evaluation);
- if (crtPageFooter.isToPrint()) {
- //填充细节区域中的空白行
- fillDetailBlankBand(detail, evaluation, true, columnFooterOffsetY - lastDetailOffsetY,lastDetailOffsetY);
- fillFixedBand(crtPageFooter, evaluation);
- }
- }
3)添加 fillDetailBlankBand
java 代码
- protected void fillDetailBlankBand(JRFillBand band, byte evaluation, boolean allowShrinking, int stretchHeight, int _offsetY) throws JRException {
- JRPrintBand printBand = band.fill(stretchHeight);
- printBand.setHeight(stretchHeight);
- JRPrintElement printElement = null;
- JRElement[] fillElements = band.getElements();
- for (int i = 0; i < fillElements.length; i++) {
- JRFillElement fillElement = (JRFillElement) fillElements[i];
- if (fillElement instanceof JRFillTextField) {
- JRFillTextField fillFieldElement = (JRFillTextField) fillElement;
- fillFieldElement.rewind();
- fillFieldElement.setRawText("");
- printElement = fillFieldElement.fill();
- printElement.setHeight(stretchHeight);
- printElement.setX(printElement.getX() + offsetX);
- printElement.setY(printElement.getY() + _offsetY);
- printPage.addElement(printElement);
- // printBand.addElement(printElement);
- }
- }
- resolveBandBoundElements(band, evaluation);
- }
通过以上步骤就解决了这个问题