123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732 |
- /*
- * ====================================================================
- * 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.examples.ss;
-
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.util.List;
-
- import org.apache.poi.hssf.usermodel.HSSFWorkbook;
- import org.apache.poi.ss.formula.ConditionalFormattingEvaluator;
- import org.apache.poi.ss.formula.EvaluationConditionalFormatRule;
- import org.apache.poi.ss.formula.WorkbookEvaluatorProvider;
- import org.apache.poi.ss.usermodel.BuiltinFormats;
- import org.apache.poi.ss.usermodel.Cell;
- import org.apache.poi.ss.usermodel.CellStyle;
- import org.apache.poi.ss.usermodel.ColorScaleFormatting;
- import org.apache.poi.ss.usermodel.ComparisonOperator;
- import org.apache.poi.ss.usermodel.ConditionalFormattingRule;
- import org.apache.poi.ss.usermodel.ConditionalFormattingThreshold.RangeType;
- import org.apache.poi.ss.usermodel.DataBarFormatting;
- import org.apache.poi.ss.usermodel.ExtendedColor;
- import org.apache.poi.ss.usermodel.FontFormatting;
- import org.apache.poi.ss.usermodel.IconMultiStateFormatting;
- import org.apache.poi.ss.usermodel.IconMultiStateFormatting.IconSet;
- import org.apache.poi.ss.usermodel.IndexedColors;
- import org.apache.poi.ss.usermodel.PatternFormatting;
- import org.apache.poi.ss.usermodel.Row;
- import org.apache.poi.ss.usermodel.Sheet;
- import org.apache.poi.ss.usermodel.SheetConditionalFormatting;
- import org.apache.poi.ss.usermodel.Workbook;
- import org.apache.poi.ss.util.CellRangeAddress;
- import org.apache.poi.ss.util.CellReference;
- import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-
- /**
- * Excel Conditional Formatting -- Examples
- *
- * <p>
- * Partly based on the code snippets from
- * http://www.contextures.com/xlcondformat03.html
- * </p>
- */
- @SuppressWarnings({"java:S106","java:S4823","java:S1192"})
- public final class ConditionalFormats {
-
- private ConditionalFormats() {}
-
- /**
- * generates a sample workbook with conditional formatting,
- * and prints out a summary of applied formats for one sheet
- * @param args pass "-xls" to generate an HSSF workbook, default is XSSF
- */
- public static void main(String[] args) throws IOException {
- final boolean isHSSF = args.length > 0 && args[0].equals("-xls");
- try (Workbook wb = isHSSF ? new HSSFWorkbook() : new XSSFWorkbook()) {
-
- sameCell(wb.createSheet("Same Cell"));
- multiCell(wb.createSheet("MultiCell"));
- overlapping(wb.createSheet("Overlapping"));
- errors(wb.createSheet("Errors"));
- hideDupplicates(wb.createSheet("Hide Dups"));
- formatDuplicates(wb.createSheet("Duplicates"));
- inList(wb.createSheet("In List"));
- expiry(wb.createSheet("Expiry"));
- shadeAlt(wb.createSheet("Shade Alt"));
- shadeBands(wb.createSheet("Shade Bands"));
- iconSets(wb.createSheet("Icon Sets"));
- colourScales(wb.createSheet("Colour Scales"));
- dataBars(wb.createSheet("Data Bars"));
-
- // print overlapping rule results
- evaluateRules(wb, "Overlapping");
-
- // Write the output to a file
- String file = "cf-poi.xls";
- if (wb instanceof XSSFWorkbook) {
- file += "x";
- }
- try (FileOutputStream out = new FileOutputStream(file)) {
- wb.write(out);
- }
- System.out.println("Generated: " + file);
- }
- }
-
- /**
- * Highlight cells based on their values
- */
- static void sameCell(Sheet sheet) {
- sheet.createRow(0).createCell(0).setCellValue(84);
- sheet.createRow(1).createCell(0).setCellValue(74);
- sheet.createRow(2).createCell(0).setCellValue(50);
- sheet.createRow(3).createCell(0).setCellValue(51);
- sheet.createRow(4).createCell(0).setCellValue(49);
- sheet.createRow(5).createCell(0).setCellValue(41);
-
- SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();
-
- // Condition 1: Cell Value Is greater than 70 (Blue Fill)
- ConditionalFormattingRule rule1 = sheetCF.createConditionalFormattingRule(ComparisonOperator.GT, "70");
- PatternFormatting fill1 = rule1.createPatternFormatting();
- fill1.setFillBackgroundColor(IndexedColors.BLUE.index);
- fill1.setFillPattern(PatternFormatting.SOLID_FOREGROUND);
-
- // Condition 2: Cell Value Is less than 50 (Green Fill)
- ConditionalFormattingRule rule2 = sheetCF.createConditionalFormattingRule(ComparisonOperator.LT, "50");
- PatternFormatting fill2 = rule2.createPatternFormatting();
- fill2.setFillBackgroundColor(IndexedColors.GREEN.index);
- fill2.setFillPattern(PatternFormatting.SOLID_FOREGROUND);
-
- CellRangeAddress[] regions = {
- CellRangeAddress.valueOf("A1:A6")
- };
-
- sheetCF.addConditionalFormatting(regions, rule1, rule2);
-
- sheet.getRow(0).createCell(2).setCellValue("<== Condition 1: Cell Value Is greater than 70 (Blue Fill)");
- sheet.getRow(4).createCell(2).setCellValue("<== Condition 2: Cell Value Is less than 50 (Green Fill)");
- }
-
- /**
- * Highlight multiple cells based on a formula
- */
- static void multiCell(Sheet sheet) {
- // header row
- Row row0 = sheet.createRow(0);
- row0.createCell(0).setCellValue("Units");
- row0.createCell(1).setCellValue("Cost");
- row0.createCell(2).setCellValue("Total");
-
- Row row1 = sheet.createRow(1);
- row1.createCell(0).setCellValue(71);
- row1.createCell(1).setCellValue(29);
- row1.createCell(2).setCellValue(2059);
-
- Row row2 = sheet.createRow(2);
- row2.createCell(0).setCellValue(85);
- row2.createCell(1).setCellValue(29);
- row2.createCell(2).setCellValue(2059);
-
- Row row3 = sheet.createRow(3);
- row3.createCell(0).setCellValue(71);
- row3.createCell(1).setCellValue(29);
- row3.createCell(2).setCellValue(2059);
-
- SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();
-
- // Condition 1: Formula Is =$B2>75 (Blue Fill)
- ConditionalFormattingRule rule1 = sheetCF.createConditionalFormattingRule("$A2>75");
- PatternFormatting fill1 = rule1.createPatternFormatting();
- fill1.setFillBackgroundColor(IndexedColors.BLUE.index);
- fill1.setFillPattern(PatternFormatting.SOLID_FOREGROUND);
-
- CellRangeAddress[] regions = {
- CellRangeAddress.valueOf("A2:C4")
- };
-
- sheetCF.addConditionalFormatting(regions, rule1);
-
- sheet.getRow(2).createCell(4).setCellValue("<== Condition 1: Formula Is =$B2>75 (Blue Fill)");
- }
-
- /**
- * Multiple conditional formatting rules can apply to
- * one cell, some combining, some beating others.
- * Done in order of the rules added to the
- * SheetConditionalFormatting object
- */
- static void overlapping(Sheet sheet) {
- for (int i=0; i<40; i++) {
- int rn = i+1;
- Row r = sheet.createRow(i);
- r.createCell(0).setCellValue("This is row " + rn + " (" + i + ")");
- String str = "";
- if (rn%2 == 0) {
- str = str + "even ";
- }
- if (rn%3 == 0) {
- str = str + "x3 ";
- }
- if (rn%5 == 0) {
- str = str + "x5 ";
- }
- if (rn%10 == 0) {
- str = str + "x10 ";
- }
- if (str.length() == 0) {
- str = "nothing special...";
- }
- r.createCell(1).setCellValue("It is " + str);
- }
- sheet.autoSizeColumn(0);
- sheet.autoSizeColumn(1);
-
- sheet.getRow(1).createCell(3).setCellValue("Even rows are blue");
- sheet.getRow(2).createCell(3).setCellValue("Multiples of 3 have a grey background");
- sheet.getRow(4).createCell(3).setCellValue("Multiples of 5 are bold");
- sheet.getRow(9).createCell(3).setCellValue("Multiples of 10 are red (beats even)");
-
- SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();
-
- // Condition 1: Row divides by 10, red (will beat #1)
- ConditionalFormattingRule rule1 =
- sheetCF.createConditionalFormattingRule("MOD(ROW(),10)=0");
- FontFormatting font1 = rule1.createFontFormatting();
- font1.setFontColorIndex(IndexedColors.RED.index);
-
- // Condition 2: Row is even, blue
- ConditionalFormattingRule rule2 =
- sheetCF.createConditionalFormattingRule("MOD(ROW(),2)=0");
- FontFormatting font2 = rule2.createFontFormatting();
- font2.setFontColorIndex(IndexedColors.BLUE.index);
-
- // Condition 3: Row divides by 5, bold
- ConditionalFormattingRule rule3 =
- sheetCF.createConditionalFormattingRule("MOD(ROW(),5)=0");
- FontFormatting font3 = rule3.createFontFormatting();
- font3.setFontStyle(false, true);
-
- // Condition 4: Row divides by 3, grey background
- ConditionalFormattingRule rule4 =
- sheetCF.createConditionalFormattingRule("MOD(ROW(),3)=0");
- PatternFormatting fill4 = rule4.createPatternFormatting();
- fill4.setFillBackgroundColor(IndexedColors.GREY_25_PERCENT.index);
- fill4.setFillPattern(PatternFormatting.SOLID_FOREGROUND);
-
- // Apply
- CellRangeAddress[] regions = {
- CellRangeAddress.valueOf("A1:F41")
- };
-
- sheetCF.addConditionalFormatting(regions, rule1);
- sheetCF.addConditionalFormatting(regions, rule2);
- sheetCF.addConditionalFormatting(regions, rule3);
- sheetCF.addConditionalFormatting(regions, rule4);
- }
-
- /**
- * Use Excel conditional formatting to check for errors,
- * and change the font colour to match the cell colour.
- * In this example, if formula result is #DIV/0! then it will have white font colour.
- */
- static void errors(Sheet sheet) {
- sheet.createRow(0).createCell(0).setCellValue(84);
- sheet.createRow(1).createCell(0).setCellValue(0);
- sheet.createRow(2).createCell(0).setCellFormula("ROUND(A1/A2,0)");
- sheet.createRow(3).createCell(0).setCellValue(0);
- sheet.createRow(4).createCell(0).setCellFormula("ROUND(A6/A4,0)");
- sheet.createRow(5).createCell(0).setCellValue(41);
-
- SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();
-
- // Condition 1: Formula Is =ISERROR(C2) (White Font)
- ConditionalFormattingRule rule1 = sheetCF.createConditionalFormattingRule("ISERROR(A1)");
- FontFormatting font = rule1.createFontFormatting();
- font.setFontColorIndex(IndexedColors.WHITE.index);
-
- CellRangeAddress[] regions = {
- CellRangeAddress.valueOf("A1:A6")
- };
-
- sheetCF.addConditionalFormatting(regions, rule1);
-
- sheet.getRow(2).createCell(1).setCellValue("<== The error in this cell is hidden. Condition: Formula Is =ISERROR(C2) (White Font)");
- sheet.getRow(4).createCell(1).setCellValue("<== The error in this cell is hidden. Condition: Formula Is =ISERROR(C2) (White Font)");
- }
-
- /**
- * Use Excel conditional formatting to hide the duplicate values,
- * and make the list easier to read. In this example, when the table is sorted by Region,
- * the second (and subsequent) occurences of each region name will have white font colour.
- */
- static void hideDupplicates(Sheet sheet) {
- sheet.createRow(0).createCell(0).setCellValue("City");
- sheet.createRow(1).createCell(0).setCellValue("Boston");
- sheet.createRow(2).createCell(0).setCellValue("Boston");
- sheet.createRow(3).createCell(0).setCellValue("Chicago");
- sheet.createRow(4).createCell(0).setCellValue("Chicago");
- sheet.createRow(5).createCell(0).setCellValue("New York");
-
- SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();
-
- // Condition 1: Formula Is =A2=A1 (White Font)
- ConditionalFormattingRule rule1 = sheetCF.createConditionalFormattingRule("A2=A1");
- FontFormatting font = rule1.createFontFormatting();
- font.setFontColorIndex(IndexedColors.WHITE.index);
-
- CellRangeAddress[] regions = {
- CellRangeAddress.valueOf("A2:A6")
- };
-
- sheetCF.addConditionalFormatting(regions, rule1);
-
- sheet.getRow(1).createCell(1).setCellValue("<== the second (and subsequent) " +
- "occurences of each region name will have white font colour. " +
- "Condition: Formula Is =A2=A1 (White Font)");
- }
-
- /**
- * Use Excel conditional formatting to highlight duplicate entries in a column.
- */
- static void formatDuplicates(Sheet sheet) {
- sheet.createRow(0).createCell(0).setCellValue("Code");
- sheet.createRow(1).createCell(0).setCellValue(4);
- sheet.createRow(2).createCell(0).setCellValue(3);
- sheet.createRow(3).createCell(0).setCellValue(6);
- sheet.createRow(4).createCell(0).setCellValue(3);
- sheet.createRow(5).createCell(0).setCellValue(5);
- sheet.createRow(6).createCell(0).setCellValue(8);
- sheet.createRow(7).createCell(0).setCellValue(0);
- sheet.createRow(8).createCell(0).setCellValue(2);
- sheet.createRow(9).createCell(0).setCellValue(8);
- sheet.createRow(10).createCell(0).setCellValue(6);
-
- SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();
-
- // Condition 1: Formula Is =A2=A1 (White Font)
- ConditionalFormattingRule rule1 = sheetCF.createConditionalFormattingRule("COUNTIF($A$2:$A$11,A2)>1");
- FontFormatting font = rule1.createFontFormatting();
- font.setFontStyle(false, true);
- font.setFontColorIndex(IndexedColors.BLUE.index);
-
- CellRangeAddress[] regions = {
- CellRangeAddress.valueOf("A2:A11")
- };
-
- sheetCF.addConditionalFormatting(regions, rule1);
-
- sheet.getRow(2).createCell(1).setCellValue("<== Duplicates numbers in the column are highlighted. " +
- "Condition: Formula Is =COUNTIF($A$2:$A$11,A2)>1 (Blue Font)");
- }
-
- /**
- * Use Excel conditional formatting to highlight items that are in a list on the worksheet.
- */
- static void inList(Sheet sheet) {
- sheet.createRow(0).createCell(0).setCellValue("Codes");
- sheet.createRow(1).createCell(0).setCellValue("AA");
- sheet.createRow(2).createCell(0).setCellValue("BB");
- sheet.createRow(3).createCell(0).setCellValue("GG");
- sheet.createRow(4).createCell(0).setCellValue("AA");
- sheet.createRow(5).createCell(0).setCellValue("FF");
- sheet.createRow(6).createCell(0).setCellValue("XX");
- sheet.createRow(7).createCell(0).setCellValue("CC");
-
- sheet.getRow(0).createCell(2).setCellValue("Valid");
- sheet.getRow(1).createCell(2).setCellValue("AA");
- sheet.getRow(2).createCell(2).setCellValue("BB");
- sheet.getRow(3).createCell(2).setCellValue("CC");
-
- SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();
-
- // Condition 1: Formula Is =A2=A1 (White Font)
- ConditionalFormattingRule rule1 = sheetCF.createConditionalFormattingRule("COUNTIF($C$2:$C$4,A2)");
- PatternFormatting fill1 = rule1.createPatternFormatting();
- fill1.setFillBackgroundColor(IndexedColors.LIGHT_BLUE.index);
- fill1.setFillPattern(PatternFormatting.SOLID_FOREGROUND);
-
- CellRangeAddress[] regions = {
- CellRangeAddress.valueOf("A2:A8")
- };
-
- sheetCF.addConditionalFormatting(regions, rule1);
-
- sheet.getRow(2).createCell(3).setCellValue("<== Use Excel conditional formatting to highlight items that are in a list on the worksheet");
- }
-
- /**
- * Use Excel conditional formatting to highlight payments that are due in the next thirty days.
- * In this example, Due dates are entered in cells A2:A4.
- */
- static void expiry(Sheet sheet) {
- CellStyle style = sheet.getWorkbook().createCellStyle();
- style.setDataFormat((short)BuiltinFormats.getBuiltinFormat("d-mmm"));
-
- sheet.createRow(0).createCell(0).setCellValue("Date");
- sheet.createRow(1).createCell(0).setCellFormula("TODAY()+29");
- sheet.createRow(2).createCell(0).setCellFormula("A2+1");
- sheet.createRow(3).createCell(0).setCellFormula("A3+1");
-
- for(int rownum = 1; rownum <= 3; rownum++) {
- sheet.getRow(rownum).getCell(0).setCellStyle(style);
- }
-
- SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();
-
- // Condition 1: Formula Is =A2=A1 (White Font)
- ConditionalFormattingRule rule1 = sheetCF.createConditionalFormattingRule("AND(A2-TODAY()>=0,A2-TODAY()<=30)");
- FontFormatting font = rule1.createFontFormatting();
- font.setFontStyle(false, true);
- font.setFontColorIndex(IndexedColors.BLUE.index);
-
- CellRangeAddress[] regions = {
- CellRangeAddress.valueOf("A2:A4")
- };
-
- sheetCF.addConditionalFormatting(regions, rule1);
-
- sheet.getRow(0).createCell(1).setCellValue("Dates within the next 30 days are highlighted");
- }
-
- /**
- * Use Excel conditional formatting to shade alternating rows on the worksheet
- */
- static void shadeAlt(Sheet sheet) {
- SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();
-
- // Condition 1: Formula Is =A2=A1 (White Font)
- ConditionalFormattingRule rule1 = sheetCF.createConditionalFormattingRule("MOD(ROW(),2)");
- PatternFormatting fill1 = rule1.createPatternFormatting();
- fill1.setFillBackgroundColor(IndexedColors.LIGHT_GREEN.index);
- fill1.setFillPattern(PatternFormatting.SOLID_FOREGROUND);
-
- CellRangeAddress[] regions = {
- CellRangeAddress.valueOf("A1:Z100")
- };
-
- sheetCF.addConditionalFormatting(regions, rule1);
-
- sheet.createRow(0).createCell(1).setCellValue("Shade Alternating Rows");
- sheet.createRow(1).createCell(1).setCellValue("Condition: Formula Is =MOD(ROW(),2) (Light Green Fill)");
- }
-
- /**
- * You can use Excel conditional formatting to shade bands of rows on the worksheet.
- * In this example, 3 rows are shaded light grey, and 3 are left with no shading.
- * In the MOD function, the total number of rows in the set of banded rows (6) is entered.
- */
- static void shadeBands(Sheet sheet) {
- SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();
-
- ConditionalFormattingRule rule1 = sheetCF.createConditionalFormattingRule("MOD(ROW(),6)<3");
- PatternFormatting fill1 = rule1.createPatternFormatting();
- fill1.setFillBackgroundColor(IndexedColors.GREY_25_PERCENT.index);
- fill1.setFillPattern(PatternFormatting.SOLID_FOREGROUND);
-
- CellRangeAddress[] regions = {
- CellRangeAddress.valueOf("A1:Z100")
- };
-
- sheetCF.addConditionalFormatting(regions, rule1);
-
- sheet.createRow(0).createCell(1).setCellValue("Shade Bands of Rows");
- sheet.createRow(1).createCell(1).setCellValue("Condition: Formula Is =MOD(ROW(),6)<2 (Light Grey Fill)");
- }
-
- /**
- * Icon Sets / Multi-States allow you to have icons shown which vary
- * based on the values, eg Red traffic light / Yellow traffic light /
- * Green traffic light
- */
- static void iconSets(Sheet sheet) {
- sheet.createRow(0).createCell(0).setCellValue("Icon Sets");
- Row r = sheet.createRow(1);
- r.createCell(0).setCellValue("Reds");
- r.createCell(1).setCellValue(0);
- r.createCell(2).setCellValue(0);
- r.createCell(3).setCellValue(0);
- r = sheet.createRow(2);
- r.createCell(0).setCellValue("Yellows");
- r.createCell(1).setCellValue(5);
- r.createCell(2).setCellValue(5);
- r.createCell(3).setCellValue(5);
- r = sheet.createRow(3);
- r.createCell(0).setCellValue("Greens");
- r.createCell(1).setCellValue(10);
- r.createCell(2).setCellValue(10);
- r.createCell(3).setCellValue(10);
-
- SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();
-
- CellRangeAddress[] regions = { CellRangeAddress.valueOf("B1:B4") };
- ConditionalFormattingRule rule1 =
- sheetCF.createConditionalFormattingRule(IconSet.GYR_3_TRAFFIC_LIGHTS);
- IconMultiStateFormatting im1 = rule1.getMultiStateFormatting();
- im1.getThresholds()[0].setRangeType(RangeType.MIN);
- im1.getThresholds()[1].setRangeType(RangeType.PERCENT);
- im1.getThresholds()[1].setValue(33d);
- im1.getThresholds()[2].setRangeType(RangeType.MAX);
- sheetCF.addConditionalFormatting(regions, rule1);
-
- regions = new CellRangeAddress[] { CellRangeAddress.valueOf("C1:C4") };
- ConditionalFormattingRule rule2 =
- sheetCF.createConditionalFormattingRule(IconSet.GYR_3_FLAGS);
- IconMultiStateFormatting im2 = rule1.getMultiStateFormatting();
- im2.getThresholds()[0].setRangeType(RangeType.PERCENT);
- im2.getThresholds()[0].setValue(0d);
- im2.getThresholds()[1].setRangeType(RangeType.PERCENT);
- im2.getThresholds()[1].setValue(33d);
- im2.getThresholds()[2].setRangeType(RangeType.PERCENT);
- im2.getThresholds()[2].setValue(67d);
- sheetCF.addConditionalFormatting(regions, rule2);
-
- regions = new CellRangeAddress[] { CellRangeAddress.valueOf("D1:D4") };
- ConditionalFormattingRule rule3 =
- sheetCF.createConditionalFormattingRule(IconSet.GYR_3_SYMBOLS_CIRCLE);
- IconMultiStateFormatting im3 = rule1.getMultiStateFormatting();
- im3.setIconOnly(true);
- im3.getThresholds()[0].setRangeType(RangeType.MIN);
- im3.getThresholds()[1].setRangeType(RangeType.NUMBER);
- im3.getThresholds()[1].setValue(3d);
- im3.getThresholds()[2].setRangeType(RangeType.NUMBER);
- im3.getThresholds()[2].setValue(7d);
- sheetCF.addConditionalFormatting(regions, rule3);
- }
-
- /**
- * Color Scales / Colour Scales / Colour Gradients allow you shade the
- * background colour of the cell based on the values, eg from Red to
- * Yellow to Green.
- */
- static void colourScales(Sheet sheet) {
- sheet.createRow(0).createCell(0).setCellValue("Colour Scales");
- Row r = sheet.createRow(1);
- r.createCell(0).setCellValue("Red-Yellow-Green");
- for (int i=1; i<=7; i++) {
- r.createCell(i).setCellValue((i-1)*5.0);
- }
- r = sheet.createRow(2);
- r.createCell(0).setCellValue("Red-White-Blue");
- for (int i=1; i<=9; i++) {
- r.createCell(i).setCellValue((i-1)*5.0);
- }
- r = sheet.createRow(3);
- r.createCell(0).setCellValue("Blue-Green");
- for (int i=1; i<=16; i++) {
- r.createCell(i).setCellValue((i-1));
- }
- sheet.setColumnWidth(0, 5000);
-
- SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();
-
- CellRangeAddress[] regions = { CellRangeAddress.valueOf("B2:H2") };
- ConditionalFormattingRule rule1 =
- sheetCF.createConditionalFormattingColorScaleRule();
- ColorScaleFormatting cs1 = rule1.getColorScaleFormatting();
- cs1.getThresholds()[0].setRangeType(RangeType.MIN);
- cs1.getThresholds()[1].setRangeType(RangeType.PERCENTILE);
- cs1.getThresholds()[1].setValue(50d);
- cs1.getThresholds()[2].setRangeType(RangeType.MAX);
- ((ExtendedColor)cs1.getColors()[0]).setARGBHex("FFF8696B");
- ((ExtendedColor)cs1.getColors()[1]).setARGBHex("FFFFEB84");
- ((ExtendedColor)cs1.getColors()[2]).setARGBHex("FF63BE7B");
- sheetCF.addConditionalFormatting(regions, rule1);
-
- regions = new CellRangeAddress[] { CellRangeAddress.valueOf("B3:J3") };
- ConditionalFormattingRule rule2 =
- sheetCF.createConditionalFormattingColorScaleRule();
- ColorScaleFormatting cs2 = rule2.getColorScaleFormatting();
- cs2.getThresholds()[0].setRangeType(RangeType.MIN);
- cs2.getThresholds()[1].setRangeType(RangeType.PERCENTILE);
- cs2.getThresholds()[1].setValue(50d);
- cs2.getThresholds()[2].setRangeType(RangeType.MAX);
- ((ExtendedColor)cs2.getColors()[0]).setARGBHex("FFF8696B");
- ((ExtendedColor)cs2.getColors()[1]).setARGBHex("FFFCFCFF");
- ((ExtendedColor)cs2.getColors()[2]).setARGBHex("FF5A8AC6");
- sheetCF.addConditionalFormatting(regions, rule2);
-
- regions = new CellRangeAddress[] { CellRangeAddress.valueOf("B4:Q4") };
- ConditionalFormattingRule rule3=
- sheetCF.createConditionalFormattingColorScaleRule();
- ColorScaleFormatting cs3 = rule3.getColorScaleFormatting();
- cs3.setNumControlPoints(2);
- cs3.getThresholds()[0].setRangeType(RangeType.MIN);
- cs3.getThresholds()[1].setRangeType(RangeType.MAX);
- ((ExtendedColor)cs3.getColors()[0]).setARGBHex("FF5A8AC6");
- ((ExtendedColor)cs3.getColors()[1]).setARGBHex("FF63BE7B");
- sheetCF.addConditionalFormatting(regions, rule3);
- }
-
- /**
- * DataBars / Data-Bars allow you to have bars shown vary
- * based on the values, from full to empty
- */
- static void dataBars(Sheet sheet) {
- sheet.createRow(0).createCell(0).setCellValue("Data Bars");
- Row r = sheet.createRow(1);
- r.createCell(1).setCellValue("Green Positive");
- r.createCell(2).setCellValue("Blue Mix");
- r.createCell(3).setCellValue("Red Negative");
- r = sheet.createRow(2);
- r.createCell(1).setCellValue(0);
- r.createCell(2).setCellValue(0);
- r.createCell(3).setCellValue(0);
- r = sheet.createRow(3);
- r.createCell(1).setCellValue(5);
- r.createCell(2).setCellValue(-5);
- r.createCell(3).setCellValue(-5);
- r = sheet.createRow(4);
- r.createCell(1).setCellValue(10);
- r.createCell(2).setCellValue(10);
- r.createCell(3).setCellValue(-10);
- r = sheet.createRow(5);
- r.createCell(1).setCellValue(5);
- r.createCell(2).setCellValue(5);
- r.createCell(3).setCellValue(-5);
- r = sheet.createRow(6);
- r.createCell(1).setCellValue(20);
- r.createCell(2).setCellValue(-10);
- r.createCell(3).setCellValue(-20);
- sheet.setColumnWidth(0, 3000);
- sheet.setColumnWidth(1, 5000);
- sheet.setColumnWidth(2, 5000);
- sheet.setColumnWidth(3, 5000);
-
- SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();
-
- ExtendedColor color = sheet.getWorkbook().getCreationHelper().createExtendedColor();
- color.setARGBHex("FF63BE7B");
- CellRangeAddress[] regions = { CellRangeAddress.valueOf("B2:B7") };
- ConditionalFormattingRule rule1 = sheetCF.createConditionalFormattingRule(color);
- DataBarFormatting db1 = rule1.getDataBarFormatting();
- db1.getMinThreshold().setRangeType(RangeType.MIN);
- db1.getMaxThreshold().setRangeType(RangeType.MAX);
- sheetCF.addConditionalFormatting(regions, rule1);
-
- color = sheet.getWorkbook().getCreationHelper().createExtendedColor();
- color.setARGBHex("FF5A8AC6");
- regions = new CellRangeAddress[] { CellRangeAddress.valueOf("C2:C7") };
- ConditionalFormattingRule rule2 = sheetCF.createConditionalFormattingRule(color);
- DataBarFormatting db2 = rule2.getDataBarFormatting();
- db2.getMinThreshold().setRangeType(RangeType.MIN);
- db2.getMaxThreshold().setRangeType(RangeType.MAX);
- sheetCF.addConditionalFormatting(regions, rule2);
-
- color = sheet.getWorkbook().getCreationHelper().createExtendedColor();
- color.setARGBHex("FFF8696B");
- regions = new CellRangeAddress[] { CellRangeAddress.valueOf("D2:D7") };
- ConditionalFormattingRule rule3 = sheetCF.createConditionalFormattingRule(color);
- DataBarFormatting db3 = rule3.getDataBarFormatting();
- db3.getMinThreshold().setRangeType(RangeType.MIN);
- db3.getMaxThreshold().setRangeType(RangeType.MAX);
- sheetCF.addConditionalFormatting(regions, rule3);
- }
-
- /**
- * Print out a summary of the conditional formatting rules applied to cells on the given sheet.
- * Only cells with a matching rule are printed, and for those, all matching rules are sumarized.
- */
- static void evaluateRules(Workbook wb, String sheetName) {
- final WorkbookEvaluatorProvider wbEvalProv = (WorkbookEvaluatorProvider) wb.getCreationHelper().createFormulaEvaluator();
- final ConditionalFormattingEvaluator cfEval = new ConditionalFormattingEvaluator(wb, wbEvalProv);
- // if cell values have changed, clear cached format results
- cfEval.clearAllCachedValues();
-
- final Sheet sheet = wb.getSheet(sheetName);
- for (Row r : sheet) {
- for (Cell c : r) {
- final List<EvaluationConditionalFormatRule> rules = cfEval.getConditionalFormattingForCell(c);
- // check rules list for null, although current implementation will return an empty list, not null, then do what you want with results
- if (rules == null || rules.isEmpty()) {
- continue;
- }
- final CellReference ref = ConditionalFormattingEvaluator.getRef(c);
- if (rules.isEmpty()) {
- continue;
- }
-
- System.out.println("\n"
- + ref.formatAsString()
- + " has conditional formatting.");
-
- for (EvaluationConditionalFormatRule rule : rules) {
- ConditionalFormattingRule cf = rule.getRule();
-
- StringBuilder b = new StringBuilder();
- b.append("\tRule ")
- .append(rule.getFormattingIndex())
- .append(": ");
-
- // check for color scale
- if (cf.getColorScaleFormatting() != null) {
- b.append("\n\t\tcolor scale (caller must calculate bucket)");
- }
- // check for data bar
- if (cf.getDataBarFormatting() != null) {
- b.append("\n\t\tdata bar (caller must calculate bucket)");
- }
- // check for icon set
- if (cf.getMultiStateFormatting() != null) {
- b.append("\n\t\ticon set (caller must calculate icon bucket)");
- }
- // check for fill
- if (cf.getPatternFormatting() != null) {
- final PatternFormatting fill = cf.getPatternFormatting();
- b.append("\n\t\tfill pattern ")
- .append(fill.getFillPattern())
- .append(" color index ")
- .append(fill.getFillBackgroundColor());
- }
- // font stuff
- if (cf.getFontFormatting() != null) {
- final FontFormatting ff = cf.getFontFormatting();
- b.append("\n\t\tfont format ")
- .append("color index ")
- .append(ff.getFontColorIndex());
- if (ff.isBold()) {
- b.append(" bold");
- }
- if (ff.isItalic()) {
- b.append(" italic");
- }
- if (ff.isStruckout()) {
- b.append(" strikeout");
- }
- b.append(" underline index ")
- .append(ff.getUnderlineType());
- }
-
- System.out.println(b);
- }
- }
- }
- }
- }
|