org.sigmah.server.report.renderer.excel.ExcelPivotTableRenderer.java Source code

Java tutorial

Introduction

Here is the source code for org.sigmah.server.report.renderer.excel.ExcelPivotTableRenderer.java

Source

/*
 * All Sigmah code is released under the GNU General Public License v3
 * See COPYRIGHT.txt and LICENSE.txt.
 */

package org.sigmah.server.report.renderer.excel;

import org.apache.poi.ss.usermodel.*;
import org.sigmah.shared.report.content.FilterDescription;
import org.sigmah.shared.report.content.PivotTableData;
import org.sigmah.shared.report.model.PivotTableElement;

import java.util.List;
import java.util.Map.Entry;

public class ExcelPivotTableRenderer implements ExcelRenderer<PivotTableElement> {

    @Override
    public void render(Workbook book, PivotTableElement element) {

        /* Generate the actual pivot table data */

        final PivotTableData table = element.getContent().getData();

        /* Generate the excel sheet */

        new BaseExcelTableRenderer<PivotTableElement, PivotTableData.Axis>(book, element) {

            @Override
            public List<FilterDescription> generateFilterDescriptions() {
                return element.getContent().getFilterDescriptions();
            }

            protected CellStyle[] rowHeaderStyles;

            @Override
            public void generate() {

                /* Initialize Cell Styles */

                initColHeaderStyles(table.getRootColumn());
                initRowHeaderStyles();

                /* Generate the column headers */

                generateColumnHeaders(1, table.getRootColumn());

                int headerHeight = rowIndex;

                /* Create the rows */
                // row headers are in column 1
                sheet.setColumnWidth(0, 40 * 256);
                generateRows(table.getRootRow().getChildList(), 0);

                /* Finalize the sheet */

                sheet.setRowSumsBelow(false);
                sheet.createFreezePane(1, headerHeight);

            }

            protected void initRowHeaderStyles() {

                int depth = table.getRootRow().getDepth();
                rowHeaderStyles = new CellStyle[depth];

                for (int i = 0; i != depth; ++i) {

                    CellStyle style = book.createCellStyle();
                    style.setIndention((short) i);
                    style.setWrapText(true);

                    Font font = createBaseFont();
                    if (i + 1 != depth) {
                        /* Has sub headers */
                        font.setBoldweight(Font.BOLDWEIGHT_BOLD);
                    } else {
                        font.setBoldweight(Font.BOLDWEIGHT_NORMAL);
                    }
                    style.setFont(font);

                    rowHeaderStyles[i] = style;
                }
            }

            protected void generateRows(List<PivotTableData.Axis> rows, int indent) {

                for (PivotTableData.Axis pivotRow : rows) {

                    Row row = sheet.createRow(rowIndex++);
                    Cell headerCell = row.createCell(0);
                    headerCell.setCellValue(factory.createRichTextString(pivotRow.getLabel()));
                    headerCell.setCellStyle(rowHeaderStyles[indent]);

                    if (pivotRow.isLeaf()) {

                        for (Entry<PivotTableData.Axis, Integer> entry : colIndexMap.entrySet()) {

                            PivotTableData.Cell pivotCell = pivotRow.getCell(entry.getKey());
                            if (pivotCell != null) {

                                Cell cell = row.createCell(entry.getValue());
                                cell.setCellValue(pivotCell.getValue());
                            }
                        }
                    } else {

                        int groupStart = rowIndex;

                        generateRows(pivotRow.getChildList(), indent + 1);

                        int groupEnd = rowIndex;

                        sheet.groupRow(groupStart, groupEnd);
                    }
                }
            }
        };
    }
}