/*
* 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 2
* 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, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package net.rrm.ehour.ui.common.report;
import net.rrm.ehour.report.criteria.ReportCriteria;
import net.rrm.ehour.ui.common.report.excel.CellFactory;
import net.rrm.ehour.ui.common.report.excel.ExcelStyle;
import net.rrm.ehour.ui.common.report.excel.ExcelWorkbook;
import net.rrm.ehour.ui.report.model.TreeReportElement;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.WorkbookUtil;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.ResourceModel;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.List;
/**
* Abstract aggregate excel report
*/
public abstract class AbstractExcelReport implements ExcelReport {
private static final long serialVersionUID = 1L;
private ReportConfig reportConfig;
private IModel<ReportCriteria> reportCriteriaModel;
public AbstractExcelReport(ReportConfig reportConfig, IModel<ReportCriteria> reportCriteriaModel) {
this.reportConfig = reportConfig;
this.reportCriteriaModel = reportCriteriaModel;
}
@Override
public void write(OutputStream stream) throws IOException {
ExcelWorkbook workbook = createWorkbook(createReport(reportCriteriaModel.getObject()));
workbook.write(stream);
}
protected abstract Report createReport(ReportCriteria reportCriteria);
/**
* Create the workbook
*/
protected ExcelWorkbook createWorkbook(Report treeReport) {
ExcelWorkbook wb = new ExcelWorkbook();
Sheet sheet = wb.createSheet(WorkbookUtil.createSafeSheetName(getExcelReportName().getObject()));
int rowNumber = 0;
short column;
for (column = 0; column < 4; column++) {
sheet.setColumnWidth(column, 5000);
}
for (; column < 7; column++) {
sheet.setColumnWidth(column, 3000);
}
rowNumber = createHeaders(rowNumber, sheet, treeReport, wb);
rowNumber = addColumnHeaders(rowNumber, sheet, wb);
fillReportSheet(treeReport, sheet, rowNumber, wb);
return wb;
}
protected abstract IModel<String> getExcelReportName();
protected abstract IModel<String> getHeaderReportName();
private int addColumnHeaders(int rowNumber, Sheet sheet, ExcelWorkbook workbook) {
int cellNumber = 0;
IModel<String> headerModel;
Row row = sheet.createRow(rowNumber++);
for (ReportColumn reportColumn : reportConfig.getReportColumns()) {
if (reportColumn.isVisible()) {
headerModel = new ResourceModel(reportColumn.getColumnHeaderResourceKey());
CellFactory.createCell(row, cellNumber++, headerModel, workbook, ExcelStyle.HEADER);
}
}
return rowNumber;
}
@SuppressWarnings("unchecked")
protected void fillReportSheet(Report reportData, Sheet sheet, int rowNumber, ExcelWorkbook workbook) {
List<TreeReportElement> matrix = (List<TreeReportElement>) reportData.getReportData().getReportElements();
ReportColumn[] columnHeaders = reportConfig.getReportColumns();
Row row;
for (TreeReportElement element : matrix) {
row = sheet.createRow(rowNumber++);
addColumns(workbook, columnHeaders, row, element);
}
}
private void addColumns(ExcelWorkbook workbook, ReportColumn[] columnHeaders, Row row, TreeReportElement element) {
int i = 0;
int cellNumber = 0;
// add cells for a row
for (Serializable cellValue : element.getRow()) {
if (columnHeaders[i].isVisible()) {
if (cellValue != null) {
switch (columnHeaders[i].getColumnType()) {
case HOUR:
CellFactory.createCell(row, cellNumber++, cellValue, workbook, ExcelStyle.DIGIT);
break;
case TURNOVER:
case RATE:
CellFactory.createCell(row, cellNumber++, cellValue, workbook, ExcelStyle.CURRENCY);
break;
case DATE:
CellFactory.createCell(row, cellNumber++, cellValue, workbook, ExcelStyle.DATE);
break;
default:
CellFactory.createCell(row, cellNumber++, cellValue, workbook, ExcelStyle.NORMAL_FONT);
break;
}
} else {
cellNumber++;
}
}
i++;
}
}
@Override
public String getFilenameWihoutSuffix() {
return getExcelReportName().getObject().toLowerCase().replace(' ', '_');
}
protected int createHeaders(int rowNumber, Sheet sheet, Report report, ExcelWorkbook workbook) {
Row row = sheet.createRow(rowNumber++);
CellFactory.createCell(row, 0, getHeaderReportName(), workbook, ExcelStyle.BOLD_FONT);
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 1));
row = sheet.createRow(rowNumber++);
CellFactory.createCell(row, 0, new ResourceModel("report.dateStart"), workbook, ExcelStyle.BOLD_FONT);
if (report.getReportRange() == null ||
report.getReportRange().getDateStart() == null) {
CellFactory.createCell(row, 1, "--", workbook, ExcelStyle.BOLD_FONT);
} else {
CellFactory.createCell(row, 1, report.getReportCriteria().getReportRange().getDateStart(), workbook, ExcelStyle.BOLD_DATE);
}
CellFactory.createCell(row, 3, new ResourceModel("report.dateEnd"), workbook, ExcelStyle.BOLD_FONT);
if (report.getReportRange() == null || report.getReportRange().getDateEnd() == null) {
CellFactory.createCell(row, 4, "--", workbook, ExcelStyle.BOLD_FONT);
} else {
CellFactory.createCell(row, 4, report.getReportCriteria().getReportRange().getDateEnd(), workbook, ExcelStyle.BOLD_DATE);
}
rowNumber++;
return rowNumber;
}
}