Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding limited font style support #40

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions src/main/java/com/miraisolutions/xlconnect/CellStyle.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,14 @@ public interface CellStyle {
void setFillPattern(FillPatternType bg);

void setWrapText(boolean wrap);

void setFontBold(boolean bold);

void setFontName(String name);

void setFontItalic(boolean italic);

void setFontSize(int size);

void setFontColor(short color, byte[] rgb);
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,12 @@

package com.miraisolutions.xlconnect;

import com.miraisolutions.xlconnect.data.DataType;
import java.util.EnumMap;

import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.FillPatternType;

import java.util.EnumMap;
import com.miraisolutions.xlconnect.data.DataType;

/**
* Marker cell style used to specify that a cell style
Expand Down Expand Up @@ -96,6 +97,30 @@ public void setWrapText(boolean wrap) {
throw new UnsupportedOperationException();
}

public void setFontBold(boolean bold) {
throw new UnsupportedOperationException();
}

public void setFontName(String name) {
throw new UnsupportedOperationException();
}

public void setFontItalic(boolean italic) {
throw new UnsupportedOperationException();
}

public void setFontUnderline(byte underlineType) {
throw new UnsupportedOperationException();
}

public void setFontSize(int size) {
throw new UnsupportedOperationException();
}

public void setFontColor(short color, byte[] rgb) {
throw new UnsupportedOperationException();
}

public static DataFormatOnlyCellStyle get(DataType type) {
DataFormatOnlyCellStyle cs;
if (instances.containsKey(type))
Expand Down
18 changes: 18 additions & 0 deletions src/main/java/com/miraisolutions/xlconnect/HCellStyle.java
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,24 @@ public void setWrapText(boolean wrap) {
cellStyle.setWrapText(wrap);
}

public void setFontBold(boolean bold) {
throw new UnsupportedOperationException("Font operations are not supported in HCellStyle.");
}
public void setFontName(String name) {
throw new UnsupportedOperationException("Font operations are not supported for SSCellStyle.");
}

public void setFontItalic(boolean italic) {
throw new UnsupportedOperationException("Font operations are not supported for SSCellStyle.");
}

public void setFontSize(int size) {
throw new UnsupportedOperationException("Font operations are not supported for SSCellStyle.");
}
public void setFontColor(short color, byte[] rgb) {
throw new UnsupportedOperationException("Font color is not supported for HCellStyle.");
}

public static HCellStyle create(HSSFWorkbook workbook, String name) {
HSSFCellStyle cellStyle = workbook.createCellStyle();
if (name != null) cellStyle.setUserStyleName(name);
Expand Down
21 changes: 21 additions & 0 deletions src/main/java/com/miraisolutions/xlconnect/SSCellStyle.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.FillPatternType;


public final class SSCellStyle implements CellStyle {

org.apache.poi.ss.usermodel.Workbook workbook;
Expand Down Expand Up @@ -91,4 +92,24 @@ public void setWrapText(boolean wrap) {
public static void set(Cell c, SSCellStyle cs) {
c.setCellStyle(cs.cellStyle);
}

public void setFontBold(boolean bold) {
throw new UnsupportedOperationException("Font operations are not supported in HCellStyle.");
}

public void setFontName(String name) {
throw new UnsupportedOperationException("Font operations are not supported for SSCellStyle.");
}

public void setFontItalic(boolean italic) {
throw new UnsupportedOperationException("Font operations are not supported for SSCellStyle.");
}

public void setFontSize(int size) {
throw new UnsupportedOperationException("Font operations are not supported for SSCellStyle.");
}
public void setFontColor(short color, byte[] rgb) {
throw new UnsupportedOperationException("Font color is not supported for SSCellStyle.");
}

}
127 changes: 125 additions & 2 deletions src/main/java/com/miraisolutions/xlconnect/XCellStyle.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,26 @@
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.xssf.model.StylesTable;
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.xssf.usermodel.DefaultIndexedColorMap;
import org.apache.poi.xssf.usermodel.IndexedColorMap;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.extensions.XSSFCellAlignment;
import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder;
import org.apache.poi.xssf.usermodel.extensions.XSSFCellFill;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.*;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBorder;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBorderPr;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCellAlignment;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCellStyle;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCellStyles;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTFill;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPatternFill;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTXf;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STBorderStyle;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STPatternType;

/**
* This class uses parts from
Expand Down Expand Up @@ -311,6 +326,113 @@ public void setFillForegroundColor(short fg) {
setFillForegroundColor(clr);
}


public void setFontBold(boolean bold) {
cloneAndModifyFont((font) -> font.setBold(bold));
}

public void setFontName(String name) {
cloneAndModifyFont((font) -> font.setFontName(name));
}

public void setFontItalic(boolean italic) {
cloneAndModifyFont((font) -> font.setItalic(italic));
}

public void setFontColor(short color, byte[] rgb) {
StylesTable stylesTable = workbook.getStylesSource();
CTXf xf = getXf();

// Store existing fill and border properties so we don't lose them
long oldFillId = xf.getFillId();
boolean oldApplyFill = xf.getApplyFill();
long oldBorderId = xf.getBorderId();
boolean oldApplyBorder = xf.getApplyBorder();
long oldNumFmtId = xf.getNumFmtId();
boolean oldApplyNumberFormat = xf.getApplyNumberFormat();

// Alignment and other properties could also be preserved if needed
CTCellAlignment oldAlignment = null;
if (xf.isSetAlignment()) {
oldAlignment = (CTCellAlignment) xf.getAlignment().copy();
}

int currentFontId = (int) xf.getFontId();
XSSFFont currentFont = workbook.getFontAt(currentFontId);

// Create a new font to isolate changes without affecting defaults
XSSFFont newFont = workbook.createFont();
copyFontProperties(currentFont, newFont);

// Apply custom color if RGB is given, otherwise use indexed color
if (rgb != null) {
XSSFColor customColor = new XSSFColor(rgb, stylesTable.getIndexedColors());
newFont.setColor(customColor);
} else {
newFont.setColor(color);
}

// Store the new font and update the style
int newFontIndex = stylesTable.putFont(newFont);
xf.setFontId(newFontIndex);
xf.setApplyFont(true);
getCoreXf().setFontId(newFontIndex);

// Restore the previously saved style attributes so they are not overwritten
xf.setFillId(oldFillId);
xf.setApplyFill(oldApplyFill);
xf.setBorderId(oldBorderId);
xf.setApplyBorder(oldApplyBorder);
xf.setNumFmtId(oldNumFmtId);
xf.setApplyNumberFormat(oldApplyNumberFormat);

if (oldAlignment != null) {
xf.setAlignment(oldAlignment);
}
}

public void setFontSize(int size) {
cloneAndModifyFont((font) -> font.setFontHeightInPoints((short) size));
}

private void cloneAndModifyFont(java.util.function.Consumer<XSSFFont> fontModifier) {
StylesTable stylesTable = workbook.getStylesSource();
int currentFontId = (int) getXf().getFontId();
XSSFFont oldFont = workbook.getFontAt(currentFontId);

// Create a brand new font to avoid modifying any existing shared font
XSSFFont newFont = workbook.createFont();

// Copy properties from the old font
copyFontProperties(oldFont, newFont);

// Apply the requested modification (bold, italic, name, color, size, etc.)
fontModifier.accept(newFont);

// Add the newly created font to the styles table and update the style
int newFontIndex = stylesTable.putFont(newFont);
CTXf xf = getXf();
xf.setFontId(newFontIndex);
xf.setApplyFont(true);
getCoreXf().setFontId(newFontIndex);
}

private void copyFontProperties(XSSFFont source, XSSFFont target) {
target.setFontName(source.getFontName());
target.setFontHeightInPoints(source.getFontHeightInPoints());
target.setBold(source.getBold());
target.setItalic(source.getItalic());
target.setUnderline(source.getUnderline());
target.setStrikeout(source.getStrikeout());

XSSFColor color = source.getXSSFColor();
if (color != null) {
target.setColor(color);
} else {
target.setColor(source.getColor());
}
}

public void setFillPattern(FillPatternType fp) {
CTFill ct = getCTFill();
CTPatternFill ptrn = ct.isSetPatternFill() ? ct.getPatternFill() : ct.addNewPatternFill();
Expand Down Expand Up @@ -373,6 +495,7 @@ public static XCellStyle create(XSSFWorkbook workbook, String name) {

return new XCellStyle(workbook, xfSize - 1, styleXfSize - 1);
}


/**
* Used for querying user-named cell styles (style xf only).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,11 @@

package com.miraisolutions.xlconnect.integration.r;

import com.miraisolutions.xlconnect.CellStyle;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.FillPatternType;

import com.miraisolutions.xlconnect.CellStyle;

public final class RCellStyleWrapper {

final CellStyle cellStyle;
Expand Down Expand Up @@ -76,4 +77,23 @@ public void setFillPattern(int bg) {
public void setWrapText(boolean wrap) {
cellStyle.setWrapText(wrap);
}

public void setFontBold(boolean bold) {
cellStyle.setFontBold(bold);
}

public void setFontName(String name) {
cellStyle.setFontName(name);
}

public void setFontItalic(boolean italic) {
cellStyle.setFontItalic(italic);
}

public void setFontSize(int size) {
cellStyle.setFontSize(size);
}
public void setFontColor(int indexedColor, byte[] rgb) {
cellStyle.setFontColor((short) indexedColor, rgb);
}
}