如何通过保持所有其他属性相同来仅更改xssf中的一个样式属性

时间:2017-02-12 06:03:02

标签: apache-poi xssf

如何仅更改一个单元格的字体颜色而不更改工作簿以前的样式属性。请查看附件“工作簿”以便清楚理解。应更改列增量贡献字体颜色,但不应更改其背景样式属性。

修改 我已经改变了代码。

模板中的列排名和平均贡献具有在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 个答案:

答案 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无法在公式计算中使用此类文本字符串。并且不改变它,只有第二种方法可用,因为条件格式化也需要真正的数值来进行比较。