package com.ipcglobal.awscwxls.xls;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
* BaseXls encapsulates the much of the complexity of generating XLS's using POI.
*
* To minimize memory usage, Fonts and CellStyles are managed in Maps. For example,
* a given Font or CellStyle exists only once in the map and is reused across the document.
*/
public class BaseXls {
/** The log. */
private static Log log = LogFactory.getLog(BaseXls.class);
/**
* The Enum HdrAlign.
*/
public enum HdrAlign {
/** The Left. */
Left,
/** The Center. */
Center,
/** The Right. */
Right };
/**
* The Enum DataAlign.
*/
public enum DataAlign {
/** The Left. */
Left,
/** The Center. */
Center,
/** The Right. */
Right };
/**
* The Enum DataType.
*/
public enum DataType {
/** The Text. */
Text,
/** The Date. */
Date,
/** The Numeric. */
Numeric,
/** The Numeric dec2. */
NumericDec2,
/** The Accounting. */
Accounting,
/** The Formula. */
Formula,
/** The Percent. */
Percent };
/** The Constant COLUMN_WIDTH_FACTOR. */
public static final int COLUMN_WIDTH_FACTOR = 278;
/** The wb. */
protected Workbook wb;
/** The format general. */
protected Short formatGeneral;
/** The format numeric. */
protected Short formatNumeric;
/** The format numeric dec2. */
protected Short formatNumericDec2;
/** The format mm dd yyyy. */
protected Short formatMmDdYyyy;
/** The format accounting. */
protected Short formatAccounting;
/** The format percent. */
protected Short formatPercent;
/** The fonts. */
protected Map<String,Font> fonts = new HashMap<String,Font>();
/** The cell styles. */
protected Map<String,CellStyle> cellStyles = new HashMap<String,CellStyle>();
/**
* The Enum CellBorder.
*/
public enum CellBorder {
/** The None. */
None,
/** The All_ thin. */
All_Thin,
/** The Top_ thin. */
Top_Thin,
/** The Bottom_ thin. */
Bottom_Thin,
/** The Right_ thin. */
Right_Thin,
/** The Left_ thin. */
Left_Thin,
/** The All_ medium. */
All_Medium,
/** The Top_ medium. */
Top_Medium,
/** The Bottom_ medium. */
Bottom_Medium,
/** The Right_ medium. */
Right_Medium,
/** The Left_ medium. */
Left_Medium,
/** The All_ thick. */
All_Thick,
/** The Top_ thick. */
Top_Thick,
/** The Bottom_ thick. */
Bottom_Thick,
/** The Right_ thick. */
Right_Thick,
/** The Left_ thick. */
Left_Thick
};
/** The bg color none. */
public short BG_COLOR_NONE = -1;
/**
* Instantiates a new base xls.
*/
public BaseXls() {
this.wb = new XSSFWorkbook();
CreationHelper creationHelper = wb.getCreationHelper();
this.formatGeneral = creationHelper.createDataFormat().getFormat("General");
this.formatNumeric = creationHelper.createDataFormat().getFormat("#,##0");
this.formatNumericDec2 = creationHelper.createDataFormat().getFormat("#,##0.00");
this.formatMmDdYyyy = creationHelper.createDataFormat().getFormat("yyyy-mm-dd hh:mm:ss");
this.formatAccounting = creationHelper.createDataFormat().getFormat("_($* #,##0.00_);_($* (#,##0.00);_($* \"-\"??_);_(@_)");
this.formatPercent = creationHelper.createDataFormat().getFormat("0.00%");
}
/**
* Find cell style.
*
* @param fontName the font name
* @param fontColor the font color
* @param fontHeight the font height
* @param fontWeight the font weight
* @return the cell style
* @throws Exception the exception
*/
public CellStyle findCellStyle( String fontName, short fontColor, short fontHeight,
short fontWeight ) throws Exception {
return findCellStyle( fontName, fontColor, fontHeight,
fontWeight, (short)-1, (short)-1, BG_COLOR_NONE, CellBorder.None, (short)-1 );
}
/**
* Find cell style.
*
* @param fontName the font name
* @param fontColor the font color
* @param fontHeight the font height
* @param fontWeight the font weight
* @param alignHorz the align horz
* @param alignVert the align vert
* @param bgColor the bg color
* @param cellBorder the cell border
* @return the cell style
* @throws Exception the exception
*/
public CellStyle findCellStyle( String fontName, short fontColor, short fontHeight,
short fontWeight, short alignHorz, short alignVert,
short bgColor, CellBorder cellBorder ) throws Exception {
return findCellStyle( fontName, fontColor, fontHeight,
fontWeight, alignHorz, alignVert, bgColor, cellBorder, (short)-1 );
}
/**
* Find cell style.
*
* @param fontName the font name
* @param fontColor the font color
* @param fontHeight the font height
* @param fontWeight the font weight
* @param alignHorz the align horz
* @param alignVert the align vert
* @param bgColor the bg color
* @param cellBorder the cell border
* @param dataFormat the data format
* @return the cell style
* @throws Exception the exception
*/
public CellStyle findCellStyle( String fontName, short fontColor, short fontHeight,
short fontWeight, short alignHorz, short alignVert,
short bgColor, CellBorder cellBorder,
short dataFormat ) throws Exception {
String keyStyle = new StringBuffer()
.append( fontName ).append("|")
.append( fontColor ).append("|")
.append( fontHeight ).append("|")
.append( fontWeight ).append("|")
.append( alignHorz ).append("|")
.append( alignVert ).append("|")
.append( bgColor ).append("|")
.append( cellBorder ).append("|")
.append( dataFormat ).append("|")
.toString();
CellStyle cellStyle = cellStyles.get( keyStyle );
if( cellStyle == null ) {
String keyFont = new StringBuffer()
.append( fontName ).append("|")
.append( fontColor ).append("|")
.append( fontHeight ).append("|")
.append( fontWeight ).append("|")
.toString();
Font font = fonts.get( keyFont );
if( font == null ) {
font = wb.createFont();
fonts.put( keyFont, font );
font.setFontName(fontName);
font.setFontHeightInPoints( fontHeight );
font.setBoldweight( fontWeight );
font.setColor( fontColor );
}
cellStyle = wb.createCellStyle();
cellStyles.put( keyStyle, cellStyle );
cellStyle.setWrapText(true);
cellStyle.setFont( font );
if( bgColor != BG_COLOR_NONE ) {
cellStyle.setFillForegroundColor( bgColor );
cellStyle.setFillPattern( CellStyle.SOLID_FOREGROUND);
}
if( alignHorz != -1 )
cellStyle.setAlignment( alignHorz );
if( alignVert != -1 )
cellStyle.setVerticalAlignment( alignVert );
if( dataFormat != -1 ) {
cellStyle.setDataFormat( dataFormat );
}
if( cellBorder != null )
addBorderToStyle( cellStyle, cellBorder );
}
return cellStyle;
}
/**
* Adds the border to style.
*
* @param style the style
* @param cellBorder the cell border
* @throws Exception the exception
*/
protected void addBorderToStyle( CellStyle style, CellBorder cellBorder ) throws Exception {
if( cellBorder == CellBorder.All_Thin || cellBorder == CellBorder.Bottom_Thin ) {
style.setBorderBottom(CellStyle.BORDER_THIN);
style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
}
if( cellBorder == CellBorder.All_Thin || cellBorder == CellBorder.Left_Thin ) {
style.setBorderLeft(CellStyle.BORDER_THIN);
style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
}
if( cellBorder == CellBorder.All_Thin || cellBorder == CellBorder.Right_Thin ) {
style.setBorderRight(CellStyle.BORDER_THIN);
style.setRightBorderColor(IndexedColors.BLACK.getIndex());
}
if( cellBorder == CellBorder.All_Thin || cellBorder == CellBorder.Top_Thin ) {
style.setBorderTop(CellStyle.BORDER_THIN);
style.setTopBorderColor(IndexedColors.BLACK.getIndex());
}
if( cellBorder == CellBorder.All_Medium || cellBorder == CellBorder.Bottom_Medium ) {
style.setBorderBottom(CellStyle.BORDER_MEDIUM);
style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
}
if( cellBorder == CellBorder.All_Medium || cellBorder == CellBorder.Left_Medium ) {
style.setBorderLeft(CellStyle.BORDER_MEDIUM);
style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
}
if( cellBorder == CellBorder.All_Medium || cellBorder == CellBorder.Right_Medium ) {
style.setBorderRight(CellStyle.BORDER_MEDIUM);
style.setRightBorderColor(IndexedColors.BLACK.getIndex());
}
if( cellBorder == CellBorder.All_Medium || cellBorder == CellBorder.Top_Medium ) {
style.setBorderTop(CellStyle.BORDER_MEDIUM);
style.setTopBorderColor(IndexedColors.BLACK.getIndex());
}
if( cellBorder == CellBorder.All_Thick || cellBorder == CellBorder.Bottom_Thick ) {
style.setBorderBottom(CellStyle.BORDER_THICK);
style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
}
if( cellBorder == CellBorder.All_Thick || cellBorder == CellBorder.Left_Thick ) {
style.setBorderLeft(CellStyle.BORDER_THICK);
style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
}
if( cellBorder == CellBorder.All_Thick || cellBorder == CellBorder.Right_Thick ) {
style.setBorderRight(CellStyle.BORDER_THICK);
style.setRightBorderColor(IndexedColors.BLACK.getIndex());
}
if( cellBorder == CellBorder.All_Thick || cellBorder == CellBorder.Top_Thick ) {
style.setBorderTop(CellStyle.BORDER_THICK);
style.setTopBorderColor(IndexedColors.BLACK.getIndex());
}
}
/**
* Find align by data type.
*
* @param dataType the data type
* @return the data align
*/
protected DataAlign findAlignByDataType(DataType dataType) {
if (dataType == DataType.Text)
return DataAlign.Left;
else if (dataType == DataType.Numeric
|| dataType == DataType.NumericDec2
|| dataType == DataType.Accounting
|| dataType == DataType.Percent )
return DataAlign.Right;
else if (dataType == DataType.Date)
return DataAlign.Center;
else
return DataAlign.Left;
}
/**
* Convert sql to xls data type.
*
* @param sqlType the sql type
* @return the data type
*/
protected DataType convertSqlToXlsDataType(int sqlType) {
DataType dataType = DataType.Text;
switch (sqlType) {
case java.sql.Types.BIGINT:
case java.sql.Types.DOUBLE:
case java.sql.Types.INTEGER:
case java.sql.Types.NUMERIC:
case java.sql.Types.REAL:
case java.sql.Types.SMALLINT:
case java.sql.Types.TINYINT:
dataType = DataType.Numeric;
break;
case java.sql.Types.DECIMAL:
case java.sql.Types.FLOAT:
dataType = DataType.Accounting;
break;
case java.sql.Types.CHAR:
case java.sql.Types.LONGVARCHAR:
case java.sql.Types.VARCHAR:
dataType = DataType.Text;
break;
case java.sql.Types.DATE:
case java.sql.Types.TIME:
case java.sql.Types.TIMESTAMP:
dataType = DataType.Date;
break;
}
return dataType;
}
/**
* Cell style from hdr align.
*
* @param dataAlign the data align
* @return the short
*/
protected short cellStyleFromHdrAlign(HdrAlign dataAlign) {
if (dataAlign == HdrAlign.Left)
return XSSFCellStyle.ALIGN_LEFT;
else if (dataAlign == HdrAlign.Center)
return XSSFCellStyle.ALIGN_CENTER;
else if (dataAlign == HdrAlign.Right)
return XSSFCellStyle.ALIGN_RIGHT;
else
return XSSFCellStyle.ALIGN_LEFT;
}
/**
* Cell style from data align.
*
* @param dataAlign the data align
* @return the short
*/
protected short cellStyleFromDataAlign(DataAlign dataAlign) {
if (dataAlign == DataAlign.Left)
return XSSFCellStyle.ALIGN_LEFT;
else if (dataAlign == DataAlign.Center)
return XSSFCellStyle.ALIGN_CENTER;
else if (dataAlign == DataAlign.Right)
return XSSFCellStyle.ALIGN_RIGHT;
else
return XSSFCellStyle.ALIGN_LEFT;
}
/**
* Gets the Workbook.
*
* @return the wb
*/
public Workbook getWb() {
return wb;
}
}