2017-02-12 13 views
0

Как изменить только цвет шрифта одной ячейки без изменения прежних свойств стиля книг. Пожалуйста, ознакомьтесь с приложением «Рабочая тетрадь» для четкого понимания. Цвет шрифта вкладки дельта-столбца следует изменить, но его свойства стиля фона не должны быть изменены.Как изменить только одно свойство стиля в xssf, сохраняя при этом все остальные свойства

EDIT: Я изменил код.

Ранжирование столбцов и средний вклад в шаблон имеют предопределенный дизайн некоторых альтернативных цветов, которые установлены в самом excel. Шаблон разработан моей командой, и я боюсь, что не могу изменить его с Java.

Моя работа - заполнить последний столбец Delta Contribution, фоновые стили которого должны быть такими же, как и общий лист, при условии изменения цвета в соответствии с условиями.

String deltaContribution = line.getDeltaContribution() != null 
         ? Double.parseDouble(line.getDeltaContribution()) + "" : ""; 
       if (!deltaContribution.equals("")) { 

        XSSFCell cell = (XSSFCell) row.getCell(8); 
        XSSFCellStyle style = cell.getCellStyle(); 
        XSSFFont redFont = style.getFont(); 
        XSSFFont blueFont = style.getFont(); 
        XSSFFont greenFont = style.getFont(); 
        if(Double.parseDouble(deltaContribution) >= 0.20) { 
         redFont.setColor(IndexedColors.RED.getIndex()); 
         CellUtil.setFont(cell, workbook, redFont); 
         //log.info("The colour is " + colour.getARGBHex()); 
        } 
        else if(Double.parseDouble(deltaContribution) <= -0.20) { 
         greenFont.setColor(IndexedColors.GREEN.getIndex()); 
         CellUtil.setFont(cell, workbook, greenFont); 
         //log.info("The colour is " + colour.getARGBHex()); 
        } 
        else { 
         blueFont.setColor(IndexedColors.BLUE.getIndex()); 
         CellUtil.setFont(cell, workbook, blueFont); 
         //log.info("The colour is " + colour.getARGBHex()); 
        } 

        row.getCell(8).setCellValue(line.getDeltaContribution() != null 
          ? formatDecimalPlaces(line.getDeltaContribution()) : ""); 
       } 

Не следует менять предыдущие стили, применяемые к листу, я должен просто изменить одно свойство стиля. После изменения кода весь столбец заполняется зеленым цветом. Last column

Учебное пособие:

enter image description here

+1

Все ваши номера, кажется, являются текстовыми строками вместо действительно числовых значений. Это действительно необходимо? Этого следует избегать, поскольку Excel не может использовать такие текстовые строки в вычислении формулы. –

+0

Как и в моем примере кода, вашей книге «Workbook» требуется «Font» для каждого цвета, который не зависит от «CellStyle». Этот шрифт вы можете установить, например, используя 'CellUtil.setFont (cell, redFont)'. То, что вы делаете, это изменение шрифта, установленного для уже примененного «CellStyle». Но, как вы видите, это приводит к изменению шрифта во всех ячейках, которые используют этот «CellStyle». –

+0

Но не создавайте шрифты несколько раз внутри цикла. Создавайте шрифты один раз за каждый шрифт за пределами цикла на уровне рабочей книги. –

ответ

1

Есть два подхода.

Первый подход использует условное форматирование. Это мой предпочтительный подход.

Пример:

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

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

import java.io.FileOutputStream; 

class ConditionalFormattingCellValues { 

public static void main(String[] args) throws Exception { 

    Workbook wb = new XSSFWorkbook(); 

    Sheet sheet = wb.createSheet("Sheet1"); 
    SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting(); 

    ConditionalFormattingRule cfRule2 = sheetCF.createConditionalFormattingRule(ComparisonOperator.GE, "0.20"); 
    FontFormatting fontFormatting = cfRule2.createFontFormatting(); 
    fontFormatting.setFontStyle(false, false); 
    fontFormatting.setFontColorIndex(IndexedColors.RED.index); 

    ConditionalFormattingRule cfRule1 = sheetCF.createConditionalFormattingRule(ComparisonOperator.LT, "0.20"); 
    fontFormatting = cfRule1.createFontFormatting(); 
    fontFormatting.setFontStyle(false, false); 
    fontFormatting.setFontColorIndex(IndexedColors.BLUE.index); 

    ConditionalFormattingRule [] cfRules = {cfRule1, cfRule2}; 

    CellRangeAddress[] regions = {CellRangeAddress.valueOf("I2:I10")}; 

    sheetCF.addConditionalFormatting(regions, cfRules); 

    for (int r = 1; r < 10; r++) { 
    Row row = sheet.createRow(r); 
    Cell cell = row.createCell(8); 
    cell.setCellValue(1d/Math.sqrt(r)-0.2); 
    } 

    FileOutputStream fileOut = new FileOutputStream("ConditionalFormattingCellValues.xlsx"); 
    wb.write(fileOut); 
    wb.close(); 

} 
} 

Второй подход использует CellUtil. Это обеспечивает «Различные функции утилиты, которые упрощают работу с ячейками и строками. Различные методы, которые касаются стиля, позволяют создавать ваши CellStyles по мере необходимости. Когда вы применяете изменение стиля к ячейке, код попытается увидеть если стиль уже существует, который соответствует вашим потребностям.Если нет, то он создаст новый стиль. Это делается для предотвращения создания слишком большого количества стилей. В Excel существует верхний предел количества поддерживаемых стилей ».

Пример:

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

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

import java.io.FileOutputStream; 

class DirectlyFormattingCellValues { 

public static void main(String[] args) throws Exception { 

    Workbook wb = new XSSFWorkbook(); 

    Font redFont = wb.createFont(); 
    redFont.setColor(IndexedColors.RED.getIndex()); 

    Font blueFont = wb.createFont(); 
    blueFont.setColor(IndexedColors.BLUE.getIndex()); 

    Sheet sheet = wb.createSheet("Sheet1"); 

    for (int r = 1; r < 10; r++) { 
    Row row = sheet.createRow(r); 
    Cell cell = row.createCell(8); 
    String deltaContribution = String.valueOf(1d/Math.sqrt(r)-0.2); 

    if(Double.parseDouble(deltaContribution)>=0.20) { 
    CellUtil.setFont(cell, redFont); 
    } else { 
    CellUtil.setFont(cell, blueFont); 
    } 

    cell.setCellValue(Double.valueOf(deltaContribution)); 
    } 

    FileOutputStream fileOut = new FileOutputStream("DirectlyFormattingCellValues.xlsx"); 
    wb.write(fileOut); 
    wb.close(); 

} 
} 

Как уже было сказано, с помощью условного форматирования следует предпочесть.

Но в соответствии с вашим снимком экрана все ваши номера, кажется, являются текстовыми строками, а не действительно числовыми значениями. Этого следует избегать, поскольку Excel не может использовать такие текстовые строки в вычислении формулы. И, не меняя этого, можно использовать только второй подход, поскольку условное форматирование также требует действительно числовых значений для сравнения.

+0

Спасибо большое за то, что нашли время. Может быть, мой вопрос был недостаточно ясен раньше, я обновил это требование. Прошу вас, пожалуйста, взглянуть. –

+0

@bhavana manchana: Как и в моем примере кода, вашей книге «Workbook» нужен «Font» для каждого цвета, который не зависит от «CellStyle». Этот шрифт вы можете установить, например, используя 'CellUtil.setFont (cell, redFont)'. То, что вы делаете, это изменение шрифта, установленного для уже примененного «CellStyle». Но, как вы видите, это приводит к изменению шрифта во всех ячейках, которые используют этот «CellStyle». –

+0

Но не создавайте шрифты несколько раз внутри цикла. Создавайте шрифты один раз за каждый шрифт за пределами цикла на уровне рабочей книги. –