Skip to content

Commit 6551f2e

Browse files
authored
handle indexed and rgb colors (#6824)
1 parent 61e507d commit 6551f2e

File tree

3 files changed

+110
-12
lines changed

3 files changed

+110
-12
lines changed

vaadin-spreadsheet-flow-parent/vaadin-spreadsheet-flow/src/main/java/com/vaadin/flow/component/spreadsheet/ColorConverterUtil.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,19 @@ public class ColorConverterUtil implements Serializable {
1414

1515
public static String toRGBA(byte[] argb) {
1616
int rgba[] = new int[3];
17-
for (int i = 1; i < argb.length; i++) {
17+
boolean hasAlpha = argb.length == 4;
18+
float alpha = hasAlpha ? argb[0] : 1.0f;
19+
int channelOffset = hasAlpha ? 1 : 0;
20+
21+
for (int i = channelOffset; i < argb.length; i++) {
1822
int x = argb[i];
1923
if (x < 0) {
2024
x += 256;
2125
}
22-
rgba[i - 1] = x;
26+
rgba[i - channelOffset] = x;
2327
}
2428

25-
float x = argb[0];
26-
return buildRgba(rgba, x);
29+
return buildRgba(rgba, alpha);
2730
}
2831

2932
public static String toRGBA(String hexARGB) {

vaadin-spreadsheet-flow-parent/vaadin-spreadsheet-flow/src/main/java/com/vaadin/flow/component/spreadsheet/XSSFColorConverter.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.apache.poi.ss.usermodel.BorderFormatting;
1515
import org.apache.poi.ss.usermodel.CellStyle;
1616
import org.apache.poi.ss.usermodel.ConditionalFormattingRule;
17+
import org.apache.poi.ss.usermodel.IndexedColors;
1718
import org.apache.poi.xssf.model.ThemesTable;
1819
import org.apache.poi.xssf.usermodel.XSSFBorderFormatting;
1920
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
@@ -24,7 +25,6 @@
2425
import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder.BorderSide;
2526
import org.apache.poi.xssf.usermodel.extensions.XSSFCellFill;
2627
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBorder;
27-
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCfRule;
2828
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTColor;
2929
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDxf;
3030
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTFont;
@@ -288,6 +288,11 @@ public String getBackgroundColorCSS(ConditionalFormattingRule rule) {
288288

289289
// CF rules have tint in bgColor but not the XSSFColor.
290290
return styleColor(themeColor, bgColor.getTint());
291+
} else if (bgColor.isSetIndexed()) {
292+
XSSFColor mappedColor = new XSSFColor(
293+
IndexedColors.fromInt((int) bgColor.getIndexed()),
294+
workbook.getStylesSource().getIndexedColors());
295+
return styleColor(mappedColor, bgColor.getTint());
291296
} else {
292297
byte[] rgb = bgColor.getRgb();
293298
return rgb == null ? null : ColorConverterUtil.toRGBA(rgb);
@@ -320,6 +325,11 @@ public String getFontColorCSS(ConditionalFormattingRule rule) {
320325
.getThemeColor((int) ctColor.getTheme());
321326

322327
return styleColor(themeColor, ctColor.getTint());
328+
} else if (ctColor.isSetIndexed()) {
329+
XSSFColor mappedColor = new XSSFColor(
330+
IndexedColors.fromInt((int) ctColor.getIndexed()),
331+
workbook.getStylesSource().getIndexedColors());
332+
return styleColor(mappedColor, ctColor.getTint());
323333
} else {
324334
byte[] rgb = ctColor.getRgb();
325335
return rgb == null ? null : ColorConverterUtil.toRGBA(rgb);
@@ -405,16 +415,12 @@ private byte applyTint(int lum, double tint) {
405415
*/
406416
private CTDxf getXMLColorDataWithReflection(
407417
XSSFConditionalFormattingRule rule) {
408-
CTCfRule realRule = null;
409-
410418
Method declaredMethod = null;
411419
try {
412-
declaredMethod = rule.getClass().getDeclaredMethod("getCTCfRule");
420+
declaredMethod = rule.getClass().getDeclaredMethod("getDxf",
421+
boolean.class);
413422
declaredMethod.setAccessible(true);
414-
realRule = (CTCfRule) declaredMethod.invoke(rule);
415-
CTDxf dxf = workbook.getStylesSource().getCTStylesheet().getDxfs()
416-
.getDxfArray((int) realRule.getDxfId());
417-
return dxf;
423+
return (CTDxf) declaredMethod.invoke(rule, false);
418424
} catch (Exception e) {
419425
LOGGER.debug(e.getMessage());
420426
return null;
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/**
2+
* Copyright 2000-2024 Vaadin Ltd.
3+
*
4+
* This program is available under Vaadin Commercial License and Service Terms.
5+
*
6+
* See {@literal <https://vaadin.com/commercial-license-and-service-terms>} for the full
7+
* license.
8+
*/
9+
package com.vaadin.flow.component.spreadsheet.tests;
10+
11+
import org.apache.poi.ss.usermodel.ComparisonOperator;
12+
import org.apache.poi.ss.usermodel.ConditionalFormattingRule;
13+
import org.apache.poi.ss.usermodel.IndexedColors;
14+
import org.apache.poi.xssf.usermodel.XSSFColor;
15+
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
16+
import org.junit.Assert;
17+
import org.junit.Before;
18+
import org.junit.Test;
19+
20+
import com.vaadin.flow.component.spreadsheet.Spreadsheet;
21+
import com.vaadin.flow.component.spreadsheet.XSSFColorConverter;
22+
23+
public class XSSFColorConverterTest {
24+
25+
private Spreadsheet spreadsheet;
26+
private XSSFColorConverter converter;
27+
28+
@Before
29+
public void setUp() {
30+
spreadsheet = new Spreadsheet();
31+
converter = new XSSFColorConverter(
32+
(XSSFWorkbook) spreadsheet.getWorkbook());
33+
}
34+
35+
@Test
36+
public void getFontColorCSS_withIndexedColor() {
37+
var rule = createRule();
38+
var font = rule.createFontFormatting();
39+
font.setFontColorIndex(IndexedColors.RED.index);
40+
41+
var cssColor = converter.getFontColorCSS(rule);
42+
43+
Assert.assertEquals("rgba(255, 0, 0, 1.0);", cssColor);
44+
}
45+
46+
@Test
47+
public void getFontColorCSS_withRgbColor() {
48+
var rule = createRule();
49+
var font = rule.createFontFormatting();
50+
var color = new XSSFColor(
51+
new byte[] { (byte) 255, (byte) 128, (byte) 64 });
52+
font.setFontColor(color);
53+
54+
var cssColor = converter.getFontColorCSS(rule);
55+
56+
Assert.assertEquals("rgba(255, 128, 64, 1.0);", cssColor);
57+
}
58+
59+
@Test
60+
public void getBackgroundColorCSS_withIndexedColor() {
61+
var rule = createRule();
62+
var pattern = rule.createPatternFormatting();
63+
pattern.setFillBackgroundColor(IndexedColors.RED.index);
64+
65+
var cssColor = converter.getBackgroundColorCSS(rule);
66+
67+
Assert.assertEquals("rgba(255, 0, 0, 1.0);", cssColor);
68+
}
69+
70+
@Test
71+
public void getBackgroundColorCSS_withRgbColor() {
72+
var rule = createRule();
73+
var pattern = rule.createPatternFormatting();
74+
var color = new XSSFColor(
75+
new byte[] { (byte) 255, (byte) 128, (byte) 64 });
76+
pattern.setFillBackgroundColor(color);
77+
78+
var cssColor = converter.getBackgroundColorCSS(rule);
79+
80+
Assert.assertEquals("rgba(255, 128, 64, 1.0);", cssColor);
81+
}
82+
83+
private ConditionalFormattingRule createRule() {
84+
var conditionalFormatting = spreadsheet.getActiveSheet()
85+
.getSheetConditionalFormatting();
86+
return conditionalFormatting
87+
.createConditionalFormattingRule(ComparisonOperator.LT, "0");
88+
}
89+
}

0 commit comments

Comments
 (0)