XSSFSheetConditionalFormatting с использованием правила цветовой шкалы не форматирует данные в Excel, созданные с использованием ПОИ из Java - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь создать условное форматирование цветовой шкалы в Excel, сгенерированном через poi (4.0.1) в Java, используя функциональные возможности XSSFWorkbook.Я не вижу каких-либо изменений в форматировании данных, хотя я пробовал много вариантов образцов кодов, доступных онлайн, чтобы создать КРАСНО-ЖЕЛТЫЙ-ЗЕЛЕНЫЙ форматирование цветовой шкалы.Я вставляю код, над которым я сейчас работаю.Может ли кто-нибудь помочь найти проблему?

        applyColorScale(cf, "J2:J21", "00FF0000", "0000FFFF", "0000FF00");
        applyColorScale(XSSFSheetConditionalFormatting cf, String region, String... colors) {
            XSSFConditionalFormattingRule cr = cf.createConditionalFormattingColorScaleRule();
            XSSFColorScaleFormatting color = cr.createColorScaleFormatting();
            int steps = 100 / (colors.length - 1);
            for (int i = 0; i < colors.length; i++) {
                XSSFConditionalFormattingThreshold th = color.createThreshold();
                if (i == 0) {
                    th.setRangeType(XSSFConditionalFormattingThreshold.RangeType.MIN);
                } else if (i == colors.length - 1) {
                    th.setRangeType(XSSFConditionalFormattingThreshold.RangeType.MAX);
                } else {
                    th.setRangeType(XSSFConditionalFormattingThreshold.RangeType.PERCENTILE);
                }
                th.setValue((double)steps*i);
                XSSFColor clr = color.createColor();
                clr.setARGBHex(colors[i]);
            }
            CellRangeAddress[] regions = {CellRangeAddress.valueOf(region)};
            cf.addConditionalFormatting(regions, cr);
        }

Expected output in excel

1 Ответ

0 голосов
/ 11 февраля 2019

Если вы посмотрите на Условное форматирование , вы найдете ссылку

См. Дополнительные примеры условного форматирования в Excel в ConditionalFormats.java

После этогопримеры, которые мы получаем:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import org.apache.poi.ss.util.CellRangeAddress;

import java.io.FileOutputStream;

public class ConditionalFormatting {

 public static void applyColorScale(SheetConditionalFormatting sheetCF, String region, String... colors) {
  CellRangeAddress[] regions = { CellRangeAddress.valueOf(region) };
  ConditionalFormattingRule rule = sheetCF.createConditionalFormattingColorScaleRule();
  ColorScaleFormatting csf = rule.getColorScaleFormatting();
  if (colors.length == 3) {
   csf.getThresholds()[0].setRangeType(ConditionalFormattingThreshold.RangeType.MIN);
   csf.getThresholds()[1].setRangeType(ConditionalFormattingThreshold.RangeType.PERCENTILE);
   csf.getThresholds()[1].setValue(50d);
   csf.getThresholds()[2].setRangeType(ConditionalFormattingThreshold.RangeType.MAX);
   for (int c = 0; c < 3; c++) {
    ((ExtendedColor)csf.getColors()[c]).setARGBHex(colors[c]);
   }
  } else if (colors.length == 2) {
   csf.setNumControlPoints(2);
   csf.getThresholds()[0].setRangeType(ConditionalFormattingThreshold.RangeType.MIN);
   csf.getThresholds()[1].setRangeType(ConditionalFormattingThreshold.RangeType.MAX);
   for (int c = 0; c < 2; c++) {
    ((ExtendedColor)csf.getColors()[c]).setARGBHex(colors[c]);
   }
  }

  sheetCF.addConditionalFormatting(regions, rule);
 }

 public static void main(String[] args) throws Exception {
  Workbook workbook = new XSSFWorkbook();

  Sheet sheet = workbook.createSheet("new sheet");

  for (int r = 1; r < 20; r++) {
   sheet.createRow(r).createCell(9).setCellFormula("RANDBETWEEN(-100, 100)");
   sheet.getRow(r).createCell(11).setCellFormula("RANDBETWEEN(-100, 100)");
  }

  SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();

  applyColorScale(sheetCF, "J2:J21", "FFFF0000", "FFFFFF00", "FF00FF00");
  applyColorScale(sheetCF, "L2:L21", "FFFF0000", "FF00FF00");

  FileOutputStream out = new FileOutputStream("ConditionalFormatting.xlsx");
  workbook.write(out);
  out.close();
  workbook.close();

 }
}

Основные отличия вашего кода: Ваши созданные XSSFColor s нигде не используются.Только RangeType.PERCENTILE нужно значение вообще.Альфа в ARGB должна быть FF вместо 00, чтобы быть полностью непрозрачной.Желтый FFFF00 не 00FFFF

...