【问题标题】:How to add columns to the new page in JasperReports report when exceed the width of page?超过页面宽度时,如何在 JasperReports 报告的新页面中添加列?
【发布时间】:2013-10-21 15:06:19
【问题描述】:

我以 JasperDesign 的形式动态创建报告,每次都有不同的列数。
有时列数太多以至于无法在一页上显示。 我想在打印时将这些额外的列加上前两列放到新页面中。

我已经通过columnHeaderband.setSplitType(JRBand.SPLIT_TYPE_IMMEDIATE);尝试过这个

我使用 JasperReports 5.4.5Java 1.7

有人知道怎么做吗?

public class CarPlanDynamicReportCreator {
    private static JRDataSource dataSource;
    private static List<Map<String, String>> listOfExtractedMap;
    private static final Boolean EMPTY_BAND = true;
    private static List<String> fieldNameList;
    private static List<String> remarkList;

    public static void compile(DefaultTableModel tableModel, String title, String name, String id) throws JRException {
        dataSource = createReportDataSource(tableModel);
        JasperDesign jasperDesign = getJasperDesign(tableModel);
        Map<String, Object> parameters = retrieveParameter(title, name, id);

        JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
        JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource);
        Report report = new Report(jasperPrint);
        report.viewWithMaximumWindowSize();
    }

    public static JasperDesign getJasperDesign(DefaultTableModel tableModel) throws JRException {
        //JasperDesign
        JasperDesign jasperDesign = new JasperDesign();
        jasperDesign.setName("The dynamically generated report");
        jasperDesign.setPageWidth(842);
        jasperDesign.setPageHeight(595);
        jasperDesign.setOrientation(JRReport.ORIENTATION_LANDSCAPE);
        jasperDesign.setColumnWidth(802);
        jasperDesign.setColumnSpacing(2);
        jasperDesign.setLeftMargin(20);
        jasperDesign.setRightMargin(20);
        jasperDesign.setTopMargin(20);
        jasperDesign.setBottomMargin(20);
        jasperDesign.setTitleNewPage(false);
        jasperDesign.setFloatColumnFooter(true);
        jasperDesign.setSummaryNewPage(false);

        jasperDesign.addStyle(JasperDesignUtil.retrieveNormalStyle());
        jasperDesign.addStyle(JasperDesignUtil.retrieveBoldStyle());
        jasperDesign.addStyle(JasperDesignUtil.retrieveItalicStyle());

        //Parameters
        JasperDesignUtil.addParameters(jasperDesign, tableModel);

        //Fields
        JasperDesignUtil.addFields(jasperDesign, tableModel, fieldNameList);

        //Variables
        JasperDesignUtil.addVariables(jasperDesign, tableModel);

        //Page header
        JasperDesignUtil.addPageHeader(jasperDesign, tableModel, !EMPTY_BAND);

        //Column header
        JasperDesignUtil.addColumnHeader(jasperDesign, tableModel, !EMPTY_BAND);

        //Detail band
        JasperDesignUtil.addDetail(jasperDesign, tableModel, listOfExtractedMap, !EMPTY_BAND);

        //Page footer
        JasperDesignUtil.addPageFooter(jasperDesign, tableModel, !EMPTY_BAND);

        //Summary
        JasperDesignUtil.addSummary(jasperDesign, tableModel, remarkList, !EMPTY_BAND);

        return jasperDesign;
    }

    private static JRDataSource createReportDataSource(DefaultTableModel tableModel) {
        Map[] reportRows = initializeMapArray(tableModel);
        return new JRMapArrayDataSource(reportRows);
    }

    public static Map<String, Object> retrieveParameter(String title, String name, String id) {
        Map<String, Object> parameterMap = GenericsUtil.makeMap();
        parameterMap.put("TITLE", title);
        parameterMap.put("NAME", patient);
        parameterMap.put("ID", patientId);

        return parameterMap;
    }
}

我的实用程序类:

public class JasperDesignUtil {
    private static JRDesignBand band;
    private static JRDesignField field;
    private static JRDesignTextField textField;
    private static JRDesignStaticText staticText;
    private static JRDesignExpression expression;

    // add Parameters
    public static void addParameters(JasperDesign jasperDesign, DefaultTableModel tableModel) throws JRException {
        JRDesignParameter parameter = new JRDesignParameter();
        parameter.setName("TITLE");
        parameter.setValueClass(java.lang.String.class);
        JRDesignExpression expression = new JRDesignExpression();
        expression.setText("");
        expression.setValueClass(java.lang.String.class);
        parameter.setDefaultValueExpression(expression);
        jasperDesign.addParameter(parameter);

        parameter = new JRDesignParameter();
        parameter.setName("NAME");
        parameter.setValueClass(java.lang.String.class);
        expression = new JRDesignExpression();
        expression.setText("");
        expression.setValueClass(java.lang.String.class);
        parameter.setDefaultValueExpression(expression);
        jasperDesign.addParameter(parameter);

        parameter = new JRDesignParameter();
        parameter.setName("ID");
        parameter.setValueClass(java.lang.String.class);
        expression = new JRDesignExpression();
        expression.setText("");
        expression.setValueClass(java.lang.String.class);
        parameter.setDefaultValueExpression(expression);
        jasperDesign.addParameter(parameter);
    }

    // Add Fields
    public static void addFields(JasperDesign jasperDesign, DefaultTableModel tableModel, List<String> fieldsName) throws JRException {
        if (!fieldsName.isEmpty()) {
            for (String name : fieldsName) {
                field = new JRDesignField();
                field.setName(name.replaceAll("\n", " "));
                field.setValueClass(String.class);
                jasperDesign.addField(field);
            }
        }
    }

    // Add Variables
    public static void addVariables(JasperDesign jasperDesign, DefaultTableModel tableModel) throws JRException {
        variable = new JRDesignVariable();
        variable.setName("COLUMNS");
        variable.setValueClass(java.lang.Integer.class);
        variable.setCalculation(JRVariable.CALCULATION_COUNT);
        expression = new JRDesignExpression();
        expression.setValueClass(java.lang.Integer.class);
        expression.setText("$V{COLUMN_COUNT}+1");
        variable.setInitialValueExpression(expression);
        variable.setResetType(JRVariable.RESET_TYPE_PAGE);
        jasperDesign.addVariable(variable);
    }

    // Add ColumnHeader
    public static void addColumnHeader(JasperDesign jasperDesign, DefaultTableModel tableModel, Boolean emptyBand) throws JRException {
        if (emptyBand)
            jasperDesign.setColumnHeader(retrieveEmptyBand(jasperDesign, 5));
        else {
            band = new JRDesignBand();
            band.setHeight(25);
            band.setSplitType(JRBand.SPLIT_TYPE_STRETCH);
            int headerPosition = 0;
            int columnCounter = 0;

            for (JRField field : jasperDesign.getFields()) {
                String fieldValue = field.getName();
                String[] values = fieldValue.split(" ");
                if (values.length != 1) {
                    String date = values[0];
                    String time = values[1];
                    fieldValue = "<html>".concat(date).concat("<BR>").concat(time).concat("</html>");
                } else
                    fieldValue = "<html>".concat(fieldValue).concat("</html>");

                int fieldLength = fieldValue.length();
                headerPosition = columnCounter == 0 ? headerPosition : (columnCounter == 1 ? headerPosition + 100 : headerPosition + fieldLength);

                JRDesignStaticText headerStaticText = new JRDesignStaticText();
                headerStaticText.setX(headerPosition);
                headerStaticText.setY(0);
                headerStaticText.setWidth(columnCounter == 0 ? 100 : (columnCounter == 1 ? 34 : fieldLength + 7));
                headerStaticText.setHeight(band.getHeight());
                headerStaticText.setMode(JRElement.MODE_TRANSPARENT);
                headerStaticText.setText(fieldValue);
                headerStaticText.setPrintRepeatedValues(true);
                headerStaticText.setPositionType(JRElement.POSITION_TYPE_FIX_RELATIVE_TO_TOP);
                headerStaticText.setFontSize(8);
                headerStaticText.setBold(true);
                headerStaticText.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_CENTER);
                headerStaticText.setVerticalAlignment(JRAlignment.VERTICAL_ALIGN_MIDDLE);
                headerStaticText.setMarkup("html");
                headerStaticText.getLineBox().setLeftPadding(2);
                headerStaticText.getLineBox().setRightPadding(2);

                columnCounter++;
                band.addElement(headerStaticText);
            }
            jasperDesign.setColumnHeader(band);
        }
    }

    // Add Detail
    public static void addDetail(JasperDesign jasperDesign, DefaultTableModel tableModel, List<Map<String, String>> maps, Boolean emptyBand) throws JRException {
        if (emptyBand)
            ((JRDesignSection) jasperDesign.getDetailSection()).addBand(retrieveEmptyBand(jasperDesign, 5));
        else {
            band = new JRDesignBand();
            band.setHeight(16);
            int position = 0;
            Map<String, String> headerMap = maps.get(0);
            int columnCounter = 0;
            for (Map.Entry<String, String> entry : headerMap.entrySet()) {
                //creating cell field on the detail band
                String cellValue = "$F{".concat(entry.getKey().replaceAll("\n", " ")).concat("}");
                int cellLength = cellValue.length();
                position = columnCounter == 0 ? position : (columnCounter == 1 ? position + 100 : position + 27);

                JRDesignTextField cellTextField = new JRDesignTextField();
                cellTextField.setX(position);
                cellTextField.setY(0);
                cellTextField.setWidth(columnCounter == 0 ? 100 : (columnCounter == 1 ? 34 : 27));
                cellTextField.setHeight(band.getHeight());
                cellTextField.setPrintRepeatedValues(true);
                cellTextField.setPositionType(JRElement.POSITION_TYPE_FIX_RELATIVE_TO_TOP);
                cellTextField.setFontSize(8);
                cellTextField.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_CENTER);
                cellTextField.setHorizontalAlignment(columnCounter == 0 ? JRAlignment.HORIZONTAL_ALIGN_LEFT : JRAlignment.HORIZONTAL_ALIGN_CENTER);
                cellTextField.setVerticalAlignment(JRAlignment.VERTICAL_ALIGN_MIDDLE);
                cellTextField.setStretchType(JRElement.STRETCH_TYPE_RELATIVE_TO_TALLEST_OBJECT);
                cellTextField.setStretchWithOverflow(true);
                cellTextField.setPositionType(JRElement.POSITION_TYPE_FLOAT);

                JRDesignExpression cellExpression = new JRDesignExpression();
                cellExpression.setValueClass(String.class);
                cellExpression.setText(cellValue);
                cellTextField.setExpression(cellExpression);

                if (columnCounter == 0)
                    cellTextField.getLineBox().getRightPen().setLineWidth(1);
                if (columnCounter != 0) {
                    cellTextField.setBold(true);
                    if (columnCounter % 2 != 0) {
                        cellTextField.setBackcolor(UIWebLook.secondary_4);
                        cellTextField.setMode(JRElement.MODE_OPAQUE);
                    }
                }
                band.addElement(cellTextField);
                columnCounter++;
            }
            band.addElement(retrieveLine(0, 0, jasperDesign.getColumnWidth(), 0, JRGraphicElement.FILL_SOLID));
            ((JRDesignSection) jasperDesign.getDetailSection()).addBand(band);
        }
    }

    private static JRDesignBand retrieveEmptyBand(JasperDesign jasperDesign, int height) {
        band = new JRDesignBand();
        band.setHeight(height);
        band.addElement(retrieveLine(0, 0, jasperDesign.getColumnWidth(), 0, JRGraphicElement.FILL_SOLID));

        return band;
    }

    public static JRDesignElement retrieveLine(int positionX, int positionY, int width, int height, @Nullable Byte fill) {
        JRDesignLine line = new JRDesignLine();
        line.setX(positionX);
        line.setY(positionY);
        line.setWidth(width);
        line.setHeight(height);
        line.setBackcolor(Color.white);
        line.setForecolor(Color.black);
        line.setPositionType(JRElement.POSITION_TYPE_FLOAT);
        line.setFill(fill == null ? JRGraphicElement.PEN_NONE : fill);

        return line;
    }
}

【问题讨论】:

  • 你在哪里定义了 JRDesignVariable 变量?它给了我编译时错误..!

标签: java jasper-reports


【解决方案1】:

使用子报表,这是最好的方法。

【讨论】:

    猜你喜欢
    • 2017-07-10
    • 1970-01-01
    • 2012-05-21
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 2012-08-14
    相关资源
    最近更新 更多