Я могу создать эффект условного форматирования цветовой шкалы (при этом цвет переднего плана ячеек зависит от того, как текущее значение ячейки сравнивается со значениями всех ячеек в диапазоне), однако я не могу найти реализацию условного форматирования Excel. Может ли Apache POI создать такое правило форматирования?

1
Dave Ross 14 Авг 2014 в 00:42
Вы собираетесь сделать это для .xls (HSSF) или .xlsx (XSSF)?
 – 
Gagravarr
14 Авг 2014 в 12:48
В идеале XSSF, но решение в любом из них было бы полезно.
 – 
Dave Ross
14 Авг 2014 в 16:01
Вы пробовали посмотреть ссылку Пример условного форматирования POI в Apache? Насколько близко это к вам?
 – 
Gagravarr
14 Авг 2014 в 16:25
Я прочитал это, к сожалению, он охватывает все, кроме форматирования цветовой шкалы. Все функции сравнения основаны на формулах, поэтому, возможно, есть формула, которая будет работать для этого, но это кажется более сложным решением, чем статическая раскраска, которую я уже сделал.
 – 
Dave Ross
14 Авг 2014 в 16:37
Что произойдет, если вы определите правило форматирования цветовой шкалы в Excel (.xlsx) и прочитаете его с помощью Apache POI, как это будет сохранено?
 – 
Gagravarr
14 Авг 2014 в 16:48

1 ответ

Лучший ответ

Ответ - да, в версии Apache POI 3.16.

sheet.getSheetConditionalFormatting().createConditionalFormattingColorScaleRule()

Прочтите этот пост, чтобы узнать, когда он был добавлен (3.13 beta 2): https://stackoverflow.com/a/32164925/231860

Вот модульный тест, демонстрирующий использование: https://svn.apache.org/repos/asf/poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestConditionalFormatting.java

@Test
public void testCreateColorScaleFormatting() throws IOException {
    Workbook wb1 = _testDataProvider.createWorkbook();
    Sheet sheet = wb1.createSheet();

    SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();
    ConditionalFormattingRule rule1 = 
            sheetCF.createConditionalFormattingColorScaleRule();
    ColorScaleFormatting clrFmt = rule1.getColorScaleFormatting();

    assertEquals(3, clrFmt.getNumControlPoints());
    assertEquals(3, clrFmt.getColors().length);
    assertEquals(3, clrFmt.getThresholds().length);

    clrFmt.getThresholds()[0].setRangeType(RangeType.MIN);
    clrFmt.getThresholds()[1].setRangeType(RangeType.NUMBER);
    clrFmt.getThresholds()[1].setValue(10d);
    clrFmt.getThresholds()[2].setRangeType(RangeType.MAX);

    CellRangeAddress [] regions = { CellRangeAddress.valueOf("A1:A5") };
    sheetCF.addConditionalFormatting(regions, rule1);
4
Community 23 Май 2017 в 15:10
Рад слышать, что он был добавлен, я еще не перешел на новую версию. Спасибо за обновление.
 – 
Dave Ross
11 Май 2017 в 21:45