package org.activityinfo.server.report.renderer.excel;
/*
* #%L
* ActivityInfo Server
* %%
* Copyright (C) 2009 - 2013 UNICEF
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
import org.activityinfo.legacy.shared.reports.content.TreeNode;
import org.activityinfo.legacy.shared.reports.model.ReportElement;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public abstract class BaseExcelTableRenderer<ElementT extends ReportElement, ColumnT extends TreeNode> extends
BaseExcelRenderer<ElementT> {
protected Map<ColumnT, Integer> colIndexMap;
protected CellStyle colHeaderStyle;
protected CellStyle leafColHeaderStyle;
public BaseExcelTableRenderer(Workbook book, ElementT element) {
super(book, element);
}
protected void initColHeaderStyles(ColumnT root) {
Font font = createBaseFont();
font.setBoldweight(Font.BOLDWEIGHT_BOLD);
colHeaderStyle = book.createCellStyle();
colHeaderStyle.setWrapText(true);
colHeaderStyle.setFont(font);
colHeaderStyle.setAlignment(CellStyle.ALIGN_CENTER);
leafColHeaderStyle = book.createCellStyle();
leafColHeaderStyle.setWrapText(true);
leafColHeaderStyle.setFont(font);
leafColHeaderStyle.setAlignment(CellStyle.ALIGN_RIGHT);
}
protected void generateColumnHeaders(int firstCol, ColumnT root) {
/*
* Now try building the column headers
*/
int depth = root.getDepth();
colIndexMap = new HashMap<ColumnT, Integer>();
int startLevel = depth == 0 ? 0 : 1;
for (int level = startLevel; level <= depth; ++level) {
Row row = sheet.createRow(rowIndex);
int colIndex = firstCol;
List<ColumnT> cols = root.getDescendantsAtDepth(level, true);
for (ColumnT col : cols) {
if (col == null) {
colIndex++;
} else {
Cell cell = row.createCell(colIndex);
cell.setCellValue(factory.createRichTextString(col.getLabel()));
cell.setCellStyle(col.isLeaf() ? leafColHeaderStyle : colHeaderStyle);
int span = col.getLeaves().size();
if (span > 1) {
sheet.addMergedRegion(new CellRangeAddress(rowIndex, rowIndex, colIndex, colIndex + span - 1));
}
if (col.isLeaf()) {
colIndexMap.put(col, colIndex);
}
colIndex += span;
}
}
rowIndex++;
}
}
}