package com.bstek.bdf2.export.excel; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.apache.commons.lang.StringUtils; import com.bstek.bdf2.export.model.ReportGridHeader; import com.bstek.bdf2.export.model.ReportGrid; /** * @author matt.yao@bstek.com * @since 2.0 */ public abstract class AbstractExcelReportBuilder { public static final String DefaultSheetName = "Sheet1"; public Workbook createWorkBook2003() { return new HSSFWorkbook(); } public Workbook createWorkBook2007(int rowAccessWindowSize) { return new SXSSFWorkbook(rowAccessWindowSize); } public void writeFile(Workbook workbook, String fileLocation) throws FileNotFoundException, IOException { FileOutputStream out = new FileOutputStream(new File(fileLocation)); try { workbook.write(out); } finally { if (out != null) { out.close(); } } } public void writeOutputStream(Workbook workbook, OutputStream out) throws IOException { workbook.write(out); } public Sheet createSheet(Workbook workbook, String sheetName) { if (StringUtils.isNotEmpty(sheetName)) { return workbook.createSheet(sheetName); } else { return workbook.createSheet(DefaultSheetName); } } public void fillCellValue(Cell cell, Object value, SimpleDateFormat sdf) { if (value != null) { if (value instanceof Date) { String result = sdf.format(value); if (result.endsWith("00:00:00")) { result = result.substring(0, 11); } cell.setCellValue(result); } else if (value instanceof Double) { cell.setCellValue((Double) value); } else if (value instanceof Integer) { cell.setCellValue((Integer) value); } else if (value instanceof Byte) { cell.setCellValue((Byte) value); } else if (value instanceof Short) { cell.setCellValue((Short) value); } else if (value instanceof Boolean) { cell.setCellValue((Boolean) value); } else if (value instanceof Long) { cell.setCellValue((Long) value); } else if (value instanceof Float) { cell.setCellValue((Float) value); } else if (value instanceof BigDecimal) { double doubleVal = ((BigDecimal) value).doubleValue(); cell.setCellValue(doubleVal); } else { cell.setCellType(HSSFCell.CELL_TYPE_STRING); cell.setCellValue(value.toString()); } } else { cell.setCellValue(""); } } public void calculateMaxHeaderLevel(ReportGrid gridModel, List gridHeaders) { int maxLevel = gridModel.getMaxHeaderLevel(); for (ReportGridHeader header : gridHeaders) { if (header.getLevel() > maxLevel) { maxLevel = header.getLevel(); gridModel.setMaxHeaderLevel(maxLevel); } if (header.getHeaders().size() > 0) { this.calculateMaxHeaderLevel(gridModel, header.getHeaders()); } } } public void calculateGridHeadersByLevel(List columnHeaderModels, int level, List result) { for (ReportGridHeader reportGridHeaderModel : columnHeaderModels) { if (reportGridHeaderModel.getLevel() == level) { result.add(reportGridHeaderModel); } else if (reportGridHeaderModel.getHeaders().size() > 0) { calculateGridHeadersByLevel(reportGridHeaderModel.getHeaders(), level, result); } } } public void calculateBottomColumnHeader(List gridHeader, List result) { for (ReportGridHeader header : gridHeader) { if (header.getHeaders().size() == 0) { result.add(header); } else { this.calculateBottomColumnHeader(header.getHeaders(), result); } } } public int calculateGridHeaderColspan(ReportGridHeader headerModel) { if (headerModel.getHeaders().size() == 0) { return 1; } else { List result = new ArrayList(); calculateBottomColumnHeader(headerModel.getHeaders(), result); return result.size(); } } }