2017-02-12 6 views
0

통합 문서 이전 스타일 속성을 변경하지 않고 한 셀의 글꼴 색만 변경하는 방법. 첨부 파일 "통합 문서"를 잘 보아주십시오. 열 델타 기여 글꼴 색상은 변경해야하지만 배경 스타일 속성은 변경하면 안됩니다.다른 모든 속성을 동일하게 유지하여 xssf에서 하나의 스타일 속성 만 변경하는 방법

편집 : 코드를 변경했습니다.

템플릿의 열 순위 및 평균 기여도는 Excel 자체에서 설정 한 일부 대체 색상의 미리 정의 된 디자인을가집니다. 템플릿은 내 팀에서 설계했으며 Java에서 변경할 수 없습니다.

제 작품은 조건에 따라 색상이 변하면 제공된 전체 시트와 배경 스타일이 같아야하는 마지막 열 델타 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'은'CellStyle'에 독립적 인 각 색상을위한'Font'를 필요로합니다. 이 폰트는'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'에는 각 색상에 대해'CellStyle '과 무관 한'Font '가 필요합니다. 이 폰트는'CellUtil.setFont (cell, redFont)'를 사용하여 설정할 수 있습니다. 당신이하고있는 일은 이미 적용된'CellStyle'을 위해 설정된 폰트를 바꾸는 것입니다. 그러나 보시다시피,이 'CellStyle'을 사용하는 모든 셀의 글꼴이 변경됩니다. –

+0

하지만 루프 안에 여러 번 글꼴을 만들지 마십시오. 통합 문서 수준에서 루프 외부의 각 글꼴을 한 번씩 글꼴을 만들어야합니다. –