/*
* Copyright (C) 2009-2010 Open Wide
* Contact: contact@openwide.fr
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package fr.openwide.core.export.excel;
import java.awt.Color;
import java.util.HashMap;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFPalette;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.PrintSetup;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFFont;
/**
* <p>Classe abstraite permettant de construire un document Excel.</p>
*
* @author Open Wide
*/
public abstract class AbstractExcelExport {
private static final String SHEET_DEFAULT_TITLE = "Untitled";
private static final int SHEET_TITLE_MAX_LENGTH = 32;
/**
* Document Workbook POI.
*/
protected Workbook workbook;
/**
* Gestionnaire de formats
*/
protected DataFormat dataFormat;
/**
* Registre des styles.
*/
protected Map<String, CellStyle> styleRegistry = new HashMap<String, CellStyle>();
/**
* Registre des couleurs
*/
protected Map<Short, Color> colorRegistry = new HashMap<Short, Color>();
/**
* Registre des polices
*/
protected Map<String, Font> fontRegistry = new HashMap<String, Font>();
/**
* Composant d'instantiation indépendant du format HSSF/XSSF
*/
protected CreationHelper creationHelper;
/**
* Taille du papier.
*/
private short paperSize = PrintSetup.A4_PAPERSIZE;
/**
* Constructeur.
*/
public AbstractExcelExport(Workbook workbook) {
this.workbook = workbook;
this.creationHelper = this.workbook.getCreationHelper();
this.dataFormat = this.creationHelper.createDataFormat();
}
/**
* Crée une feuille de calcul.
*
* @param titre titre de la feuille de calcul
* @return feuille de calcul
*/
protected Sheet createSheet(String title) {
String sheetTitle = SHEET_DEFAULT_TITLE;
if (title != null) {
if (title.length() > SHEET_TITLE_MAX_LENGTH + 1) {
sheetTitle = title.substring(0, 31);
} else {
sheetTitle = title;
}
}
Sheet sheet = workbook.createSheet(sheetTitle);
sheet.getPrintSetup().setPaperSize(paperSize);
return sheet;
}
/**
* Enregistre un style dans le registre des styles.
*
* @param name nom du style
* @param style style
*/
protected final void registerStyle(String name, CellStyle style) {
styleRegistry.put(name, style);
}
/**
* Récupère un style depuis le registre.
*
* @param name nom du style
* @return style
*/
protected final CellStyle getStyle(String name) {
if (styleRegistry.containsKey(name)) {
return styleRegistry.get(name);
} else {
throw new IllegalArgumentException("Style " + name + " is not registered");
}
}
/**
* Clône les informations d'un style.
*
* @param style style à copier
* @return style
*/
protected final CellStyle cloneStyle(CellStyle style) {
CellStyle returnStyle = workbook.createCellStyle();
returnStyle.cloneStyleFrom(style);
return returnStyle;
}
/**
* Enregistre une police dans le registre des polices
*
* @param name nom de la police
* @param font police
*/
protected final void registerFont(String name, Font font) {
fontRegistry.put(name, font);
}
/**
* Récupère une police depuis le registre.
*
* @param name nom de la police
* @return police
*/
protected final Font getFont(String name) {
if (fontRegistry.containsKey(name)) {
return fontRegistry.get(name);
} else {
throw new IllegalArgumentException("Font " + name + " is not registered");
}
}
/**
* Enregistre une couleur dans le registre des couleurs
*
* @param index index de la couleur
* @param hexaColor code hexadécimal de la couleur
*/
protected final void registerColor(short index, String hexaColor) {
if (hexaColor != null && hexaColor.matches("#[0-9a-fA-F]{6}")) {
int red = Integer.parseInt(hexaColor.substring(1, 3), 16);
int green = Integer.parseInt(hexaColor.substring(3, 5), 16);
int blue = Integer.parseInt(hexaColor.substring(5, 7), 16);
colorRegistry.put(index, new Color(red, green, blue));
if (workbook instanceof HSSFWorkbook) {
HSSFPalette palette = ((HSSFWorkbook) workbook).getCustomPalette();
palette.setColorAtIndex(index, (byte) red, (byte) green, (byte) blue);
}
}
}
protected final void setFontColor(Font font, Map<Short, Color> colorRegistry, short color) {
if (font instanceof XSSFFont && colorRegistry.containsKey(color)) {
((XSSFFont) font).setColor(new XSSFColor(colorRegistry.get(color)));
} else {
font.setColor(color);
}
}
protected final void setStyleFillForegroundColor(CellStyle style, Map<Short, Color> colorRegistry, short color) {
if (style instanceof XSSFCellStyle && colorRegistry.containsKey(color)) {
((XSSFCellStyle) style).setFillForegroundColor(new XSSFColor(colorRegistry.get(color)));
} else {
style.setFillForegroundColor(color);
}
}
protected final void setStyleFillBackgroundColor(CellStyle style, Map<Short, Color> colorRegistry, short color) {
if (style instanceof XSSFCellStyle && colorRegistry.containsKey(color)) {
((XSSFCellStyle) style).setFillBackgroundColor(new XSSFColor(colorRegistry.get(color)));
} else {
style.setFillBackgroundColor(color);
}
}
protected final void setStyleTopBorderColor(CellStyle style, Map<Short, Color> colorRegistry, short color) {
if (style instanceof XSSFCellStyle && colorRegistry.containsKey(color)) {
((XSSFCellStyle) style).setTopBorderColor(new XSSFColor(colorRegistry.get(color)));
} else {
style.setTopBorderColor(color);
}
}
protected final void setStyleBottomBorderColor(CellStyle style, Map<Short, Color> colorRegistry, short color) {
if (style instanceof XSSFCellStyle && colorRegistry.containsKey(color)) {
((XSSFCellStyle) style).setBottomBorderColor(new XSSFColor(colorRegistry.get(color)));
} else {
style.setBottomBorderColor(color);
}
}
protected final void setStyleLeftBorderColor(CellStyle style, Map<Short, Color> colorRegistry, short color) {
if (style instanceof XSSFCellStyle && colorRegistry.containsKey(color)) {
((XSSFCellStyle) style).setLeftBorderColor(new XSSFColor(colorRegistry.get(color)));
} else {
style.setLeftBorderColor(color);
}
}
protected final void setStyleRightBorderColor(CellStyle style, Map<Short, Color> colorRegistry, short color) {
if (style instanceof XSSFCellStyle && colorRegistry.containsKey(color)) {
((XSSFCellStyle) style).setRightBorderColor(new XSSFColor(colorRegistry.get(color)));
} else {
style.setRightBorderColor(color);
}
}
public void setPaperSize(short paperSize) {
this.paperSize = paperSize;
}
}