/* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You 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 org.apache.poi.xssf.usermodel; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.XSSFTestDataSamples; import org.apache.poi.xssf.model.StylesTable; import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder; import org.apache.poi.xssf.usermodel.extensions.XSSFCellFill; import org.junit.Before; import org.junit.Test; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBorder; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCellXfs; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTFill; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTFont; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTStylesheet; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTXf; import org.openxmlformats.schemas.spreadsheetml.x2006.main.STBorderStyle; import org.openxmlformats.schemas.spreadsheetml.x2006.main.STHorizontalAlignment; import org.openxmlformats.schemas.spreadsheetml.x2006.main.STPatternType; import org.openxmlformats.schemas.spreadsheetml.x2006.main.STVerticalAlignment; public class TestXSSFCellStyle { private StylesTable stylesTable; private CTBorder ctBorderA; private CTFill ctFill; private CTFont ctFont; private CTXf cellStyleXf; private CTXf cellXf; private CTCellXfs cellXfs; private XSSFCellStyle cellStyle; private CTStylesheet ctStylesheet; @Before public void setUp() { stylesTable = new StylesTable(); ctStylesheet = stylesTable.getCTStylesheet(); ctBorderA = CTBorder.Factory.newInstance(); XSSFCellBorder borderA = new XSSFCellBorder(ctBorderA); long borderId = stylesTable.putBorder(borderA); assertEquals(1, borderId); XSSFCellBorder borderB = new XSSFCellBorder(); assertEquals(1, stylesTable.putBorder(borderB)); ctFill = CTFill.Factory.newInstance(); XSSFCellFill fill = new XSSFCellFill(ctFill); long fillId = stylesTable.putFill(fill); assertEquals(2, fillId); ctFont = CTFont.Factory.newInstance(); XSSFFont font = new XSSFFont(ctFont); long fontId = stylesTable.putFont(font); assertEquals(1, fontId); cellStyleXf = ctStylesheet.addNewCellStyleXfs().addNewXf(); cellStyleXf.setBorderId(1); cellStyleXf.setFillId(1); cellStyleXf.setFontId(1); cellXfs = ctStylesheet.addNewCellXfs(); cellXf = cellXfs.addNewXf(); cellXf.setXfId(1); cellXf.setBorderId(1); cellXf.setFillId(1); cellXf.setFontId(1); stylesTable.putCellStyleXf(cellStyleXf); stylesTable.putCellXf(cellXf); cellStyle = new XSSFCellStyle(1, 1, stylesTable, null); assertNotNull(stylesTable.getFillAt(1).getCTFill().getPatternFill()); assertEquals(STPatternType.INT_DARK_GRAY, stylesTable.getFillAt(1).getCTFill().getPatternFill().getPatternType().intValue()); } @Test public void testGetSetBorderBottom() { //default values assertEquals(BorderStyle.NONE, cellStyle.getBorderBottomEnum()); int num = stylesTable.getBorders().size(); cellStyle.setBorderBottom(BorderStyle.MEDIUM); assertEquals(BorderStyle.MEDIUM, cellStyle.getBorderBottomEnum()); //a new border has been added assertEquals(num + 1, stylesTable.getBorders().size()); //id of the created border int borderId = (int)cellStyle.getCoreXf().getBorderId(); assertTrue(borderId > 0); //check changes in the underlying xml bean CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder(); assertEquals(STBorderStyle.MEDIUM, ctBorder.getBottom().getStyle()); num = stylesTable.getBorders().size(); //setting the same border multiple times should not change borderId for (int i = 0; i < 3; i++) { cellStyle.setBorderBottom(BorderStyle.MEDIUM); assertEquals(BorderStyle.MEDIUM, cellStyle.getBorderBottomEnum()); } assertEquals(borderId, cellStyle.getCoreXf().getBorderId()); assertEquals(num, stylesTable.getBorders().size()); assertSame(ctBorder, stylesTable.getBorderAt(borderId).getCTBorder()); //setting border to none removes the <bottom> element cellStyle.setBorderBottom(BorderStyle.NONE); assertEquals(num, stylesTable.getBorders().size()); borderId = (int)cellStyle.getCoreXf().getBorderId(); ctBorder = stylesTable.getBorderAt(borderId).getCTBorder(); assertFalse(ctBorder.isSetBottom()); } @Test public void testGetSetBorderRight() { //default values assertEquals(BorderStyle.NONE, cellStyle.getBorderRightEnum()); int num = stylesTable.getBorders().size(); cellStyle.setBorderRight(BorderStyle.MEDIUM); assertEquals(BorderStyle.MEDIUM, cellStyle.getBorderRightEnum()); //a new border has been added assertEquals(num + 1, stylesTable.getBorders().size()); //id of the created border int borderId = (int)cellStyle.getCoreXf().getBorderId(); assertTrue(borderId > 0); //check changes in the underlying xml bean CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder(); assertEquals(STBorderStyle.MEDIUM, ctBorder.getRight().getStyle()); num = stylesTable.getBorders().size(); //setting the same border multiple times should not change borderId for (int i = 0; i < 3; i++) { cellStyle.setBorderRight(BorderStyle.MEDIUM); assertEquals(BorderStyle.MEDIUM, cellStyle.getBorderRightEnum()); } assertEquals(borderId, cellStyle.getCoreXf().getBorderId()); assertEquals(num, stylesTable.getBorders().size()); assertSame(ctBorder, stylesTable.getBorderAt(borderId).getCTBorder()); //setting border to none removes the <right> element cellStyle.setBorderRight(BorderStyle.NONE); assertEquals(num, stylesTable.getBorders().size()); borderId = (int)cellStyle.getCoreXf().getBorderId(); ctBorder = stylesTable.getBorderAt(borderId).getCTBorder(); assertFalse(ctBorder.isSetRight()); } @Test public void testGetSetBorderLeft() { //default values assertEquals(BorderStyle.NONE, cellStyle.getBorderLeftEnum()); int num = stylesTable.getBorders().size(); cellStyle.setBorderLeft(BorderStyle.MEDIUM); assertEquals(BorderStyle.MEDIUM, cellStyle.getBorderLeftEnum()); //a new border has been added assertEquals(num + 1, stylesTable.getBorders().size()); //id of the created border int borderId = (int)cellStyle.getCoreXf().getBorderId(); assertTrue(borderId > 0); //check changes in the underlying xml bean CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder(); assertEquals(STBorderStyle.MEDIUM, ctBorder.getLeft().getStyle()); num = stylesTable.getBorders().size(); //setting the same border multiple times should not change borderId for (int i = 0; i < 3; i++) { cellStyle.setBorderLeft(BorderStyle.MEDIUM); assertEquals(BorderStyle.MEDIUM, cellStyle.getBorderLeftEnum()); } assertEquals(borderId, cellStyle.getCoreXf().getBorderId()); assertEquals(num, stylesTable.getBorders().size()); assertSame(ctBorder, stylesTable.getBorderAt(borderId).getCTBorder()); //setting border to none removes the <left> element cellStyle.setBorderLeft(BorderStyle.NONE); assertEquals(num, stylesTable.getBorders().size()); borderId = (int)cellStyle.getCoreXf().getBorderId(); ctBorder = stylesTable.getBorderAt(borderId).getCTBorder(); assertFalse(ctBorder.isSetLeft()); } @Test public void testGetSetBorderTop() { //default values assertEquals(BorderStyle.NONE, cellStyle.getBorderTopEnum()); int num = stylesTable.getBorders().size(); cellStyle.setBorderTop(BorderStyle.MEDIUM); assertEquals(BorderStyle.MEDIUM, cellStyle.getBorderTopEnum()); //a new border has been added assertEquals(num + 1, stylesTable.getBorders().size()); //id of the created border int borderId = (int)cellStyle.getCoreXf().getBorderId(); assertTrue(borderId > 0); //check changes in the underlying xml bean CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder(); assertEquals(STBorderStyle.MEDIUM, ctBorder.getTop().getStyle()); num = stylesTable.getBorders().size(); //setting the same border multiple times should not change borderId for (int i = 0; i < 3; i++) { cellStyle.setBorderTop(BorderStyle.MEDIUM); assertEquals(BorderStyle.MEDIUM, cellStyle.getBorderTopEnum()); } assertEquals(borderId, cellStyle.getCoreXf().getBorderId()); assertEquals(num, stylesTable.getBorders().size()); assertSame(ctBorder, stylesTable.getBorderAt(borderId).getCTBorder()); //setting border to none removes the <top> element cellStyle.setBorderTop(BorderStyle.NONE); assertEquals(num, stylesTable.getBorders().size()); borderId = (int)cellStyle.getCoreXf().getBorderId(); ctBorder = stylesTable.getBorderAt(borderId).getCTBorder(); assertFalse(ctBorder.isSetTop()); } private void testGetSetBorderXMLBean(BorderStyle border, STBorderStyle.Enum expected) { cellStyle.setBorderTop(border); assertEquals(border, cellStyle.getBorderTopEnum()); int borderId = (int)cellStyle.getCoreXf().getBorderId(); assertTrue(borderId > 0); //check changes in the underlying xml bean CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder(); assertEquals(expected, ctBorder.getTop().getStyle()); } // Border Styles, in BorderStyle/STBorderStyle enum order @Test public void testGetSetBorderNone() { cellStyle.setBorderTop(BorderStyle.NONE); assertEquals(BorderStyle.NONE, cellStyle.getBorderTopEnum()); int borderId = (int)cellStyle.getCoreXf().getBorderId(); assertTrue(borderId > 0); //check changes in the underlying xml bean CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder(); assertNull(ctBorder.getTop()); // no border style and STBorderStyle.NONE are equivalent // POI prefers to unset the border style than explicitly set it STBorderStyle.NONE } @Test public void testGetSetBorderThin() { testGetSetBorderXMLBean(BorderStyle.THIN, STBorderStyle.THIN); } @Test public void testGetSetBorderMedium() { testGetSetBorderXMLBean(BorderStyle.MEDIUM, STBorderStyle.MEDIUM); } @Test public void testGetSetBorderDashed() { testGetSetBorderXMLBean(BorderStyle.DASHED, STBorderStyle.DASHED); } @Test public void testGetSetBorderDotted() { testGetSetBorderXMLBean(BorderStyle.DOTTED, STBorderStyle.DOTTED); } @Test public void testGetSetBorderThick() { testGetSetBorderXMLBean(BorderStyle.THICK, STBorderStyle.THICK); } @Test public void testGetSetBorderDouble() { testGetSetBorderXMLBean(BorderStyle.DOUBLE, STBorderStyle.DOUBLE); } @Test public void testGetSetBorderHair() { testGetSetBorderXMLBean(BorderStyle.HAIR, STBorderStyle.HAIR); } @Test public void testGetSetBorderMediumDashed() { testGetSetBorderXMLBean(BorderStyle.MEDIUM_DASHED, STBorderStyle.MEDIUM_DASHED); } @Test public void testGetSetBorderDashDot() { testGetSetBorderXMLBean(BorderStyle.DASH_DOT, STBorderStyle.DASH_DOT); } @Test public void testGetSetBorderMediumDashDot() { testGetSetBorderXMLBean(BorderStyle.MEDIUM_DASH_DOT, STBorderStyle.MEDIUM_DASH_DOT); } @Test public void testGetSetBorderDashDotDot() { testGetSetBorderXMLBean(BorderStyle.DASH_DOT_DOT, STBorderStyle.DASH_DOT_DOT); } @Test public void testGetSetBorderMediumDashDotDot() { testGetSetBorderXMLBean(BorderStyle.MEDIUM_DASH_DOT_DOT, STBorderStyle.MEDIUM_DASH_DOT_DOT); } @Test public void testGetSetBorderSlantDashDot() { testGetSetBorderXMLBean(BorderStyle.SLANTED_DASH_DOT, STBorderStyle.SLANT_DASH_DOT); } @Test public void testGetSetBottomBorderColor() { //defaults assertEquals(IndexedColors.BLACK.getIndex(), cellStyle.getBottomBorderColor()); assertNull(cellStyle.getBottomBorderXSSFColor()); int num = stylesTable.getBorders().size(); XSSFColor clr; //setting indexed color cellStyle.setBottomBorderColor(IndexedColors.BLUE_GREY.getIndex()); assertEquals(IndexedColors.BLUE_GREY.getIndex(), cellStyle.getBottomBorderColor()); clr = cellStyle.getBottomBorderXSSFColor(); assertTrue(clr.getCTColor().isSetIndexed()); assertEquals(IndexedColors.BLUE_GREY.getIndex(), clr.getIndexed()); //a new border was added to the styles table assertEquals(num + 1, stylesTable.getBorders().size()); //id of the created border int borderId = (int)cellStyle.getCoreXf().getBorderId(); assertTrue(borderId > 0); //check changes in the underlying xml bean CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder(); assertEquals(IndexedColors.BLUE_GREY.getIndex(), ctBorder.getBottom().getColor().getIndexed()); //setting XSSFColor num = stylesTable.getBorders().size(); clr = new XSSFColor(java.awt.Color.CYAN); cellStyle.setBottomBorderColor(clr); assertEquals(clr.getCTColor().toString(), cellStyle.getBottomBorderXSSFColor().getCTColor().toString()); byte[] rgb = cellStyle.getBottomBorderXSSFColor().getRGB(); assertEquals(java.awt.Color.CYAN, new java.awt.Color(rgb[0] & 0xFF, rgb[1] & 0xFF, rgb[2] & 0xFF)); //another border was added to the styles table assertEquals(num + 1, stylesTable.getBorders().size()); //passing null unsets the color cellStyle.setBottomBorderColor(null); assertNull(cellStyle.getBottomBorderXSSFColor()); } @Test public void testGetSetTopBorderColor() { //defaults assertEquals(IndexedColors.BLACK.getIndex(), cellStyle.getTopBorderColor()); assertNull(cellStyle.getTopBorderXSSFColor()); int num = stylesTable.getBorders().size(); XSSFColor clr; //setting indexed color cellStyle.setTopBorderColor(IndexedColors.BLUE_GREY.getIndex()); assertEquals(IndexedColors.BLUE_GREY.getIndex(), cellStyle.getTopBorderColor()); clr = cellStyle.getTopBorderXSSFColor(); assertTrue(clr.getCTColor().isSetIndexed()); assertEquals(IndexedColors.BLUE_GREY.getIndex(), clr.getIndexed()); //a new border was added to the styles table assertEquals(num + 1, stylesTable.getBorders().size()); //id of the created border int borderId = (int)cellStyle.getCoreXf().getBorderId(); assertTrue(borderId > 0); //check changes in the underlying xml bean CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder(); assertEquals(IndexedColors.BLUE_GREY.getIndex(), ctBorder.getTop().getColor().getIndexed()); //setting XSSFColor num = stylesTable.getBorders().size(); clr = new XSSFColor(java.awt.Color.CYAN); cellStyle.setTopBorderColor(clr); assertEquals(clr.getCTColor().toString(), cellStyle.getTopBorderXSSFColor().getCTColor().toString()); byte[] rgb = cellStyle.getTopBorderXSSFColor().getRGB(); assertEquals(java.awt.Color.CYAN, new java.awt.Color(rgb[0] & 0xFF, rgb[1] & 0xFF, rgb[2] & 0xFF)); //another border was added to the styles table assertEquals(num + 1, stylesTable.getBorders().size()); //passing null unsets the color cellStyle.setTopBorderColor(null); assertNull(cellStyle.getTopBorderXSSFColor()); } @Test public void testGetSetLeftBorderColor() { //defaults assertEquals(IndexedColors.BLACK.getIndex(), cellStyle.getLeftBorderColor()); assertNull(cellStyle.getLeftBorderXSSFColor()); int num = stylesTable.getBorders().size(); XSSFColor clr; //setting indexed color cellStyle.setLeftBorderColor(IndexedColors.BLUE_GREY.getIndex()); assertEquals(IndexedColors.BLUE_GREY.getIndex(), cellStyle.getLeftBorderColor()); clr = cellStyle.getLeftBorderXSSFColor(); assertTrue(clr.getCTColor().isSetIndexed()); assertEquals(IndexedColors.BLUE_GREY.getIndex(), clr.getIndexed()); //a new border was added to the styles table assertEquals(num + 1, stylesTable.getBorders().size()); //id of the created border int borderId = (int)cellStyle.getCoreXf().getBorderId(); assertTrue(borderId > 0); //check changes in the underlying xml bean CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder(); assertEquals(IndexedColors.BLUE_GREY.getIndex(), ctBorder.getLeft().getColor().getIndexed()); //setting XSSFColor num = stylesTable.getBorders().size(); clr = new XSSFColor(java.awt.Color.CYAN); cellStyle.setLeftBorderColor(clr); assertEquals(clr.getCTColor().toString(), cellStyle.getLeftBorderXSSFColor().getCTColor().toString()); byte[] rgb = cellStyle.getLeftBorderXSSFColor().getRGB(); assertEquals(java.awt.Color.CYAN, new java.awt.Color(rgb[0] & 0xFF, rgb[1] & 0xFF, rgb[2] & 0xFF)); //another border was added to the styles table assertEquals(num + 1, stylesTable.getBorders().size()); //passing null unsets the color cellStyle.setLeftBorderColor(null); assertNull(cellStyle.getLeftBorderXSSFColor()); } @Test public void testGetSetRightBorderColor() { //defaults assertEquals(IndexedColors.BLACK.getIndex(), cellStyle.getRightBorderColor()); assertNull(cellStyle.getRightBorderXSSFColor()); int num = stylesTable.getBorders().size(); XSSFColor clr; //setting indexed color cellStyle.setRightBorderColor(IndexedColors.BLUE_GREY.getIndex()); assertEquals(IndexedColors.BLUE_GREY.getIndex(), cellStyle.getRightBorderColor()); clr = cellStyle.getRightBorderXSSFColor(); assertTrue(clr.getCTColor().isSetIndexed()); assertEquals(IndexedColors.BLUE_GREY.getIndex(), clr.getIndexed()); //a new border was added to the styles table assertEquals(num + 1, stylesTable.getBorders().size()); //id of the created border int borderId = (int)cellStyle.getCoreXf().getBorderId(); assertTrue(borderId > 0); //check changes in the underlying xml bean CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder(); assertEquals(IndexedColors.BLUE_GREY.getIndex(), ctBorder.getRight().getColor().getIndexed()); //setting XSSFColor num = stylesTable.getBorders().size(); clr = new XSSFColor(java.awt.Color.CYAN); cellStyle.setRightBorderColor(clr); assertEquals(clr.getCTColor().toString(), cellStyle.getRightBorderXSSFColor().getCTColor().toString()); byte[] rgb = cellStyle.getRightBorderXSSFColor().getRGB(); assertEquals(java.awt.Color.CYAN, new java.awt.Color(rgb[0] & 0xFF, rgb[1] & 0xFF, rgb[2] & 0xFF)); //another border was added to the styles table assertEquals(num + 1, stylesTable.getBorders().size()); //passing null unsets the color cellStyle.setRightBorderColor(null); assertNull(cellStyle.getRightBorderXSSFColor()); } @Test public void testGetSetFillBackgroundColor() { assertEquals(IndexedColors.AUTOMATIC.getIndex(), cellStyle.getFillBackgroundColor()); assertNull(cellStyle.getFillBackgroundXSSFColor()); XSSFColor clr; int num = stylesTable.getFills().size(); //setting indexed color cellStyle.setFillBackgroundColor(IndexedColors.RED.getIndex()); assertEquals(IndexedColors.RED.getIndex(), cellStyle.getFillBackgroundColor()); clr = cellStyle.getFillBackgroundXSSFColor(); assertTrue(clr.getCTColor().isSetIndexed()); assertEquals(IndexedColors.RED.getIndex(), clr.getIndexed()); //a new fill was added to the styles table assertEquals(num + 1, stylesTable.getFills().size()); //id of the created border int fillId = (int)cellStyle.getCoreXf().getFillId(); assertTrue(fillId > 0); //check changes in the underlying xml bean CTFill ctFill2 = stylesTable.getFillAt(fillId).getCTFill(); assertEquals(IndexedColors.RED.getIndex(), ctFill2.getPatternFill().getBgColor().getIndexed()); //setting XSSFColor num = stylesTable.getFills().size(); clr = new XSSFColor(java.awt.Color.CYAN); cellStyle.setFillBackgroundColor(clr); assertEquals(clr.getCTColor().toString(), cellStyle.getFillBackgroundXSSFColor().getCTColor().toString()); byte[] rgb = cellStyle.getFillBackgroundXSSFColor().getRGB(); assertEquals(java.awt.Color.CYAN, new java.awt.Color(rgb[0] & 0xFF, rgb[1] & 0xFF, rgb[2] & 0xFF)); //another border was added to the styles table assertEquals(num + 1, stylesTable.getFills().size()); //passing null unsets the color cellStyle.setFillBackgroundColor(null); assertNull(cellStyle.getFillBackgroundXSSFColor()); assertEquals(IndexedColors.AUTOMATIC.getIndex(), cellStyle.getFillBackgroundColor()); } @Test public void testDefaultStyles() throws IOException { XSSFWorkbook wb1 = new XSSFWorkbook(); XSSFCellStyle style1 = wb1.createCellStyle(); assertEquals(IndexedColors.AUTOMATIC.getIndex(), style1.getFillBackgroundColor()); assertNull(style1.getFillBackgroundXSSFColor()); assertNotNull(XSSFTestDataSamples.writeOutAndReadBack(wb1)); wb1.close(); //compatibility with HSSF HSSFWorkbook wb2 = new HSSFWorkbook(); HSSFCellStyle style2 = wb2.createCellStyle(); assertEquals(style2.getFillBackgroundColor(), style1.getFillBackgroundColor()); assertEquals(style2.getFillForegroundColor(), style1.getFillForegroundColor()); assertEquals(style2.getFillPatternEnum(), style1.getFillPatternEnum()); assertEquals(style2.getFillPattern(), style1.getFillPattern()); assertEquals(style2.getLeftBorderColor(), style1.getLeftBorderColor()); assertEquals(style2.getTopBorderColor(), style1.getTopBorderColor()); assertEquals(style2.getRightBorderColor(), style1.getRightBorderColor()); assertEquals(style2.getBottomBorderColor(), style1.getBottomBorderColor()); assertEquals(style2.getBorderBottomEnum(), style1.getBorderBottomEnum()); assertEquals(style2.getBorderLeftEnum(), style1.getBorderLeftEnum()); assertEquals(style2.getBorderRightEnum(), style1.getBorderRightEnum()); assertEquals(style2.getBorderTopEnum(), style1.getBorderTopEnum()); wb2.close(); } @Test public void testGetFillForegroundColor() throws IOException { XSSFWorkbook wb = new XSSFWorkbook(); StylesTable styles = wb.getStylesSource(); assertEquals(1, wb.getNumCellStyles()); assertEquals(2, styles.getFills().size()); XSSFCellStyle defaultStyle = wb.getCellStyleAt((short)0); assertEquals(IndexedColors.AUTOMATIC.getIndex(), defaultStyle.getFillForegroundColor()); assertEquals(null, defaultStyle.getFillForegroundXSSFColor()); assertEquals(FillPatternType.NO_FILL, defaultStyle.getFillPatternEnum()); assertEquals(CellStyle.NO_FILL, defaultStyle.getFillPattern()); XSSFCellStyle customStyle = wb.createCellStyle(); customStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); assertEquals(FillPatternType.SOLID_FOREGROUND, customStyle.getFillPatternEnum()); assertEquals(CellStyle.SOLID_FOREGROUND, customStyle.getFillPattern()); assertEquals(3, styles.getFills().size()); customStyle.setFillForegroundColor(IndexedColors.BRIGHT_GREEN.getIndex()); assertEquals(IndexedColors.BRIGHT_GREEN.getIndex(), customStyle.getFillForegroundColor()); assertEquals(4, styles.getFills().size()); for (int i = 0; i < 3; i++) { XSSFCellStyle style = wb.createCellStyle(); style.setFillPattern(FillPatternType.SOLID_FOREGROUND); assertEquals(FillPatternType.SOLID_FOREGROUND, style.getFillPatternEnum()); assertEquals(CellStyle.SOLID_FOREGROUND, style.getFillPattern()); assertEquals(4, styles.getFills().size()); style.setFillForegroundColor(IndexedColors.BRIGHT_GREEN.getIndex()); assertEquals(IndexedColors.BRIGHT_GREEN.getIndex(), style.getFillForegroundColor()); assertEquals(4, styles.getFills().size()); } assertNotNull(XSSFTestDataSamples.writeOutAndReadBack(wb)); wb.close(); } @Test public void testGetFillPattern() { assertEquals(STPatternType.INT_DARK_GRAY-1, cellStyle.getFillPatternEnum().getCode()); assertEquals(STPatternType.INT_DARK_GRAY-1, cellStyle.getFillPattern()); int num = stylesTable.getFills().size(); cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); assertEquals(FillPatternType.SOLID_FOREGROUND, cellStyle.getFillPatternEnum()); assertEquals(CellStyle.SOLID_FOREGROUND, cellStyle.getFillPattern()); assertEquals(num + 1, stylesTable.getFills().size()); int fillId = (int)cellStyle.getCoreXf().getFillId(); assertTrue(fillId > 0); //check changes in the underlying xml bean CTFill ctFill2 = stylesTable.getFillAt(fillId).getCTFill(); assertEquals(STPatternType.SOLID, ctFill2.getPatternFill().getPatternType()); //setting the same fill multiple time does not update the styles table for (int i = 0; i < 3; i++) { cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); } assertEquals(num + 1, stylesTable.getFills().size()); cellStyle.setFillPattern(FillPatternType.NO_FILL); assertEquals(FillPatternType.NO_FILL, cellStyle.getFillPatternEnum()); assertEquals(CellStyle.NO_FILL, cellStyle.getFillPattern()); fillId = (int)cellStyle.getCoreXf().getFillId(); ctFill2 = stylesTable.getFillAt(fillId).getCTFill(); assertFalse(ctFill2.getPatternFill().isSetPatternType()); } @Test public void testGetFont() { assertNotNull(cellStyle.getFont()); } @Test public void testGetSetHidden() { assertFalse(cellStyle.getHidden()); cellStyle.setHidden(true); assertTrue(cellStyle.getHidden()); cellStyle.setHidden(false); assertFalse(cellStyle.getHidden()); } @Test public void testGetSetLocked() { assertTrue(cellStyle.getLocked()); cellStyle.setLocked(true); assertTrue(cellStyle.getLocked()); cellStyle.setLocked(false); assertFalse(cellStyle.getLocked()); } @Test public void testGetSetIndent() { assertEquals((short)0, cellStyle.getIndention()); cellStyle.setIndention((short)3); assertEquals((short)3, cellStyle.getIndention()); cellStyle.setIndention((short) 13); assertEquals((short)13, cellStyle.getIndention()); } @Test public void testGetSetAlignement() { assertNull(cellStyle.getCellAlignment().getCTCellAlignment().getHorizontal()); assertEquals(HorizontalAlignment.GENERAL, cellStyle.getAlignmentEnum()); cellStyle.setAlignment(XSSFCellStyle.ALIGN_LEFT); assertEquals(XSSFCellStyle.ALIGN_LEFT, cellStyle.getAlignment()); assertEquals(HorizontalAlignment.LEFT, cellStyle.getAlignmentEnum()); assertEquals(STHorizontalAlignment.LEFT, cellStyle.getCellAlignment().getCTCellAlignment().getHorizontal()); cellStyle.setAlignment(HorizontalAlignment.JUSTIFY); assertEquals(XSSFCellStyle.ALIGN_JUSTIFY, cellStyle.getAlignment()); assertEquals(HorizontalAlignment.JUSTIFY, cellStyle.getAlignmentEnum()); assertEquals(STHorizontalAlignment.JUSTIFY, cellStyle.getCellAlignment().getCTCellAlignment().getHorizontal()); cellStyle.setAlignment(HorizontalAlignment.CENTER); assertEquals(XSSFCellStyle.ALIGN_CENTER, cellStyle.getAlignment()); assertEquals(HorizontalAlignment.CENTER, cellStyle.getAlignmentEnum()); assertEquals(STHorizontalAlignment.CENTER, cellStyle.getCellAlignment().getCTCellAlignment().getHorizontal()); } @Test public void testGetSetVerticalAlignment() { assertEquals(VerticalAlignment.BOTTOM, cellStyle.getVerticalAlignmentEnum()); assertEquals(XSSFCellStyle.VERTICAL_BOTTOM, cellStyle.getVerticalAlignment()); assertNull(cellStyle.getCellAlignment().getCTCellAlignment().getVertical()); cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER); assertEquals(XSSFCellStyle.VERTICAL_CENTER, cellStyle.getVerticalAlignment()); assertEquals(VerticalAlignment.CENTER, cellStyle.getVerticalAlignmentEnum()); assertEquals(STVerticalAlignment.CENTER, cellStyle.getCellAlignment().getCTCellAlignment().getVertical()); cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_JUSTIFY); assertEquals(XSSFCellStyle.VERTICAL_JUSTIFY, cellStyle.getVerticalAlignment()); assertEquals(VerticalAlignment.JUSTIFY, cellStyle.getVerticalAlignmentEnum()); assertEquals(STVerticalAlignment.JUSTIFY, cellStyle.getCellAlignment().getCTCellAlignment().getVertical()); } @Test public void testGetSetWrapText() { assertFalse(cellStyle.getWrapText()); cellStyle.setWrapText(true); assertTrue(cellStyle.getWrapText()); cellStyle.setWrapText(false); assertFalse(cellStyle.getWrapText()); } /** * Cloning one XSSFCellStyle onto Another, same XSSFWorkbook */ @Test public void testCloneStyleSameWB() throws IOException { XSSFWorkbook wb = new XSSFWorkbook(); assertEquals(1, wb.getNumberOfFonts()); XSSFFont fnt = wb.createFont(); fnt.setFontName("TestingFont"); assertEquals(2, wb.getNumberOfFonts()); XSSFCellStyle orig = wb.createCellStyle(); orig.setAlignment(CellStyle.ALIGN_RIGHT); orig.setFont(fnt); orig.setDataFormat((short)18); assertTrue(CellStyle.ALIGN_RIGHT == orig.getAlignment()); assertTrue(fnt == orig.getFont()); assertTrue(18 == orig.getDataFormat()); XSSFCellStyle clone = wb.createCellStyle(); assertFalse(CellStyle.ALIGN_RIGHT == clone.getAlignment()); assertFalse(fnt == clone.getFont()); assertFalse(18 == clone.getDataFormat()); clone.cloneStyleFrom(orig); assertTrue(CellStyle.ALIGN_RIGHT == clone.getAlignment()); assertTrue(fnt == clone.getFont()); assertTrue(18 == clone.getDataFormat()); assertEquals(2, wb.getNumberOfFonts()); XSSFWorkbook wb2 = XSSFTestDataSamples.writeOutAndReadBack(wb); assertNotNull(wb2); wb2.close(); wb.close(); } /** * Cloning one XSSFCellStyle onto Another, different XSSFWorkbooks */ @Test public void testCloneStyleDiffWB() throws IOException { XSSFWorkbook wbOrig = new XSSFWorkbook(); assertEquals(1, wbOrig.getNumberOfFonts()); assertEquals(0, wbOrig.getStylesSource().getNumberFormats().size()); XSSFFont fnt = wbOrig.createFont(); fnt.setFontName("TestingFont"); assertEquals(2, wbOrig.getNumberOfFonts()); assertEquals(0, wbOrig.getStylesSource().getNumberFormats().size()); XSSFDataFormat fmt = wbOrig.createDataFormat(); fmt.getFormat("MadeUpOne"); fmt.getFormat("MadeUpTwo"); XSSFCellStyle orig = wbOrig.createCellStyle(); orig.setAlignment(HSSFCellStyle.ALIGN_RIGHT); orig.setFont(fnt); orig.setDataFormat(fmt.getFormat("Test##")); assertTrue(XSSFCellStyle.ALIGN_RIGHT == orig.getAlignment()); assertTrue(fnt == orig.getFont()); assertTrue(fmt.getFormat("Test##") == orig.getDataFormat()); assertEquals(2, wbOrig.getNumberOfFonts()); assertEquals(3, wbOrig.getStylesSource().getNumberFormats().size()); // Now a style on another workbook XSSFWorkbook wbClone = new XSSFWorkbook(); assertEquals(1, wbClone.getNumberOfFonts()); assertEquals(0, wbClone.getStylesSource().getNumberFormats().size()); assertEquals(1, wbClone.getNumCellStyles()); XSSFDataFormat fmtClone = wbClone.createDataFormat(); XSSFCellStyle clone = wbClone.createCellStyle(); assertEquals(1, wbClone.getNumberOfFonts()); assertEquals(0, wbClone.getStylesSource().getNumberFormats().size()); assertFalse(HSSFCellStyle.ALIGN_RIGHT == clone.getAlignment()); assertNotEquals("TestingFont", clone.getFont().getFontName()); clone.cloneStyleFrom(orig); assertEquals(2, wbClone.getNumberOfFonts()); assertEquals(2, wbClone.getNumCellStyles()); assertEquals(1, wbClone.getStylesSource().getNumberFormats().size()); assertEquals(HSSFCellStyle.ALIGN_RIGHT, clone.getAlignment()); assertEquals("TestingFont", clone.getFont().getFontName()); assertEquals(fmtClone.getFormat("Test##"), clone.getDataFormat()); assertFalse(fmtClone.getFormat("Test##") == fmt.getFormat("Test##")); // Save it and re-check XSSFWorkbook wbReload = XSSFTestDataSamples.writeOutAndReadBack(wbClone); assertEquals(2, wbReload.getNumberOfFonts()); assertEquals(2, wbReload.getNumCellStyles()); assertEquals(1, wbReload.getStylesSource().getNumberFormats().size()); XSSFCellStyle reload = wbReload.getCellStyleAt((short)1); assertEquals(HSSFCellStyle.ALIGN_RIGHT, reload.getAlignment()); assertEquals("TestingFont", reload.getFont().getFontName()); assertEquals(fmtClone.getFormat("Test##"), reload.getDataFormat()); assertFalse(fmtClone.getFormat("Test##") == fmt.getFormat("Test##")); XSSFWorkbook wbOrig2 = XSSFTestDataSamples.writeOutAndReadBack(wbOrig); assertNotNull(wbOrig2); wbOrig2.close(); XSSFWorkbook wbClone2 = XSSFTestDataSamples.writeOutAndReadBack(wbClone); assertNotNull(wbClone2); wbClone2.close(); wbReload.close(); wbClone.close(); wbOrig.close(); } /** * Avoid ArrayIndexOutOfBoundsException when creating cell style * in a workbook that has an empty xf table. */ @Test public void testBug52348() throws IOException { XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("52348.xlsx"); StylesTable st = workbook.getStylesSource(); assertEquals(0, st._getStyleXfsSize()); XSSFCellStyle style = workbook.createCellStyle(); // no exception at this point assertNull(style.getStyleXf()); XSSFWorkbook wb2 = XSSFTestDataSamples.writeOutAndReadBack(workbook); assertNotNull(wb2); wb2.close(); workbook.close(); } /** * Avoid ArrayIndexOutOfBoundsException when getting cell style * in a workbook that has an empty xf table. */ @Test public void testBug55650() throws IOException { XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("52348.xlsx"); StylesTable st = workbook.getStylesSource(); assertEquals(0, st._getStyleXfsSize()); // no exception at this point XSSFCellStyle style = workbook.getSheetAt(0).getRow(0).getCell(0).getCellStyle(); assertNull(style.getStyleXf()); XSSFWorkbook wb2 = XSSFTestDataSamples.writeOutAndReadBack(workbook); assertNotNull(wb2); wb2.close(); workbook.close(); } @Test public void testShrinkToFit() throws IOException { // Existing file XSSFWorkbook wb1 = XSSFTestDataSamples.openSampleWorkbook("ShrinkToFit.xlsx"); Sheet s = wb1.getSheetAt(0); Row r = s.getRow(0); CellStyle cs = r.getCell(0).getCellStyle(); assertEquals(true, cs.getShrinkToFit()); // New file XSSFWorkbook wb2 = new XSSFWorkbook(); s = wb2.createSheet(); r = s.createRow(0); cs = wb2.createCellStyle(); cs.setShrinkToFit(false); r.createCell(0).setCellStyle(cs); cs = wb2.createCellStyle(); cs.setShrinkToFit(true); r.createCell(1).setCellStyle(cs); // Write out, read, and check XSSFWorkbook wb3 = XSSFTestDataSamples.writeOutAndReadBack(wb2); s = wb3.getSheetAt(0); r = s.getRow(0); assertEquals(false, r.getCell(0).getCellStyle().getShrinkToFit()); assertEquals(true, r.getCell(1).getCellStyle().getShrinkToFit()); XSSFWorkbook wb4 = XSSFTestDataSamples.writeOutAndReadBack(wb2); assertNotNull(wb4); wb4.close(); XSSFWorkbook wb5 = XSSFTestDataSamples.writeOutAndReadBack(wb3); assertNotNull(wb5); wb5.close(); wb3.close(); wb2.close(); wb1.close(); } @Test public void testSetColor() throws IOException { Workbook wb = new XSSFWorkbook(); Sheet sheet = wb.createSheet(); Row row = sheet.createRow(0); DataFormat format = wb.createDataFormat(); Cell cell = row.createCell(1); cell.setCellValue("somevalue"); CellStyle cellStyle2 = wb.createCellStyle(); cellStyle2.setDataFormat(format.getFormat("###0")); cellStyle2.setFillBackgroundColor(IndexedColors.DARK_BLUE.getIndex()); cellStyle2.setFillForegroundColor(IndexedColors.DARK_BLUE.getIndex()); cellStyle2.setFillPattern(FillPatternType.SOLID_FOREGROUND); cellStyle2.setAlignment(CellStyle.ALIGN_RIGHT); cellStyle2.setVerticalAlignment(CellStyle.VERTICAL_TOP); cell.setCellStyle(cellStyle2); Workbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb); Cell cellBack = wbBack.getSheetAt(0).getRow(0).getCell(1); assertNotNull(cellBack); CellStyle styleBack = cellBack.getCellStyle(); assertEquals(IndexedColors.DARK_BLUE.getIndex(), styleBack.getFillBackgroundColor()); assertEquals(IndexedColors.DARK_BLUE.getIndex(), styleBack.getFillForegroundColor()); assertEquals(CellStyle.ALIGN_RIGHT, styleBack.getAlignment()); assertEquals(CellStyle.VERTICAL_TOP, styleBack.getVerticalAlignment()); assertEquals(FillPatternType.SOLID_FOREGROUND, styleBack.getFillPatternEnum()); assertEquals(CellStyle.SOLID_FOREGROUND, styleBack.getFillPattern()); wbBack.close(); wb.close(); } public static void copyStyles(Workbook reference, Workbook target) { final int numberOfStyles = reference.getNumCellStyles(); // don't copy default style (style index 0) for (int i = 1; i < numberOfStyles; i++) { final CellStyle referenceStyle = reference.getCellStyleAt(i); final CellStyle targetStyle = target.createCellStyle(); targetStyle.cloneStyleFrom(referenceStyle); } /*System.out.println("Reference : "+reference.getNumCellStyles()); System.out.println("Target : "+target.getNumCellStyles());*/ } @Test public void test58084() throws IOException { Workbook reference = XSSFTestDataSamples.openSampleWorkbook("template.xlsx"); Workbook target = new XSSFWorkbook(); copyStyles(reference, target); assertEquals(reference.getNumCellStyles(), target.getNumCellStyles()); final Sheet sheet = target.createSheet(); final Row row = sheet.createRow(0); int col = 0; for (short i = 1; i < target.getNumCellStyles(); i++) { final Cell cell = row.createCell(col++); cell.setCellValue("Coucou"+i); cell.setCellStyle(target.getCellStyleAt(i)); } /*OutputStream out = new FileOutputStream("C:\\temp\\58084.xlsx"); target.write(out); out.close();*/ Workbook copy = XSSFTestDataSamples.writeOutAndReadBack(target); // previously this failed because the border-element was not copied over copy.getCellStyleAt((short)1).getBorderBottomEnum(); copy.close(); target.close(); reference.close(); } @Test public void test58043() { assertEquals(0, cellStyle.getRotation()); cellStyle.setRotation((short)89); assertEquals(89, cellStyle.getRotation()); cellStyle.setRotation((short)90); assertEquals(90, cellStyle.getRotation()); cellStyle.setRotation((short)179); assertEquals(179, cellStyle.getRotation()); cellStyle.setRotation((short)180); assertEquals(180, cellStyle.getRotation()); // negative values are mapped to the correct values for compatibility between HSSF and XSSF cellStyle.setRotation((short)-1); assertEquals(91, cellStyle.getRotation()); cellStyle.setRotation((short)-89); assertEquals(179, cellStyle.getRotation()); cellStyle.setRotation((short)-90); assertEquals(180, cellStyle.getRotation()); } @Test public void bug58996_UsedToWorkIn3_11_ButNotIn3_13() throws IOException { XSSFWorkbook workbook = new XSSFWorkbook(); XSSFCellStyle cellStyle = workbook.createCellStyle(); cellStyle.setFillForegroundColor(null); assertNull(cellStyle.getFillForegroundColorColor()); cellStyle.setFillBackgroundColor(null); assertNull(cellStyle.getFillBackgroundColorColor()); cellStyle.setFillPattern(FillPatternType.NO_FILL); assertEquals(FillPatternType.NO_FILL, cellStyle.getFillPatternEnum()); cellStyle.setBottomBorderColor(null); assertNull(cellStyle.getBottomBorderXSSFColor()); cellStyle.setTopBorderColor(null); assertNull(cellStyle.getTopBorderXSSFColor()); cellStyle.setLeftBorderColor(null); assertNull(cellStyle.getLeftBorderXSSFColor()); cellStyle.setRightBorderColor(null); assertNull(cellStyle.getRightBorderXSSFColor()); workbook.close(); } }