java - 如何使用 POI 测试单元格是否符合 ConditionalFormattingRule 中定义的规则?

标签 java excel apache-poi

我尝试使用 POI 将 Excel 转换为 HTML,但是我的 Excel 中有一些条件格式。这些条件格式会影响单元格的背景颜色。我使用以下代码来获取所有条件格式。

            Sheet sheet = wb.getSheetAt(i);

            // get conditional formatting in the sheet
            SheetConditionalFormatting formatting = sheet.getSheetConditionalFormatting();

            // number of Conditional Formattings
            int formattingsNum = formatting.getNumConditionalFormattings();

            if (formattingsNum != 0){

                // get all conditional formatting
                for (int j = 0; j < formattingsNum; j++) {

                    ConditionalFormatting conditionalFormatting = formatting.getConditionalFormattingAt(j);

                }
            }

现在我想确定一个单元格是否符合条件格式的规则。我尝试了多种变体,但似乎都不起作用。有什么想法吗?

提前致谢。

最佳答案

这是一项具有挑战性的任务。一个单元格可能应用了多个条件格式规则。并且至少有两种影响单元格背景颜色的条件格式规则。即图案格式化和色标格式化。

Apache poi提供ConditionalFormattingEvaluator其中有一个方法 getConditionalFormattingForCell如果单元格满足规则的标准,则获取单元格的所有条件格式。使用它我们可以获得单元格的所有匹配条件格式。有了这些,我们就必须检查是否存在图案格式和/或色标格式。对于图案格式化,我们可以获得背景颜色集。但对于色阶格式化,下一个挑战是评估阈值。

工作草案示例:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.*;
import org.apache.poi.ss.formula.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import java.io.FileInputStream;

import java.util.List;
import java.util.ArrayList;

public class ExcelGetConditionalFormattingFromConditionalFormattingEvaluator {

 static List<EvaluationConditionalFormatRule> getMatchingConditionalFormattingForCell(Cell cell) {
  Sheet sheet = cell.getSheet(); 
  Workbook workbook = sheet.getWorkbook();
  WorkbookEvaluatorProvider workbookEvaluatorProvider =
   (WorkbookEvaluatorProvider)workbook.getCreationHelper().createFormulaEvaluator();
  ConditionalFormattingEvaluator conditionalFormattingEvaluator = 
   new ConditionalFormattingEvaluator(workbook, workbookEvaluatorProvider);
  List<EvaluationConditionalFormatRule> matchingCFRulesForCell = 
   conditionalFormattingEvaluator.getConditionalFormattingForCell(cell);
  return matchingCFRulesForCell;
 }

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

  //String filePath = "ExcelHavingConditionalFormatting.xls";
  String filePath = "ExcelHavingConditionalFormatting.xlsx";

  Workbook workbook = WorkbookFactory.create(new FileInputStream(filePath));
  Sheet sheet = workbook.getSheetAt(0);

  for (Row row : sheet) {
   for (Cell cell : row) {
    System.out.println(cell.getAddress());
    List<EvaluationConditionalFormatRule> matchingCFRules = getMatchingConditionalFormattingForCell(cell);
    System.out.println(matchingCFRules);
    for (EvaluationConditionalFormatRule evalCFRule : matchingCFRules) {
     ConditionalFormattingRule cFRule = evalCFRule.getRule();
     if (cFRule.getPatternFormatting() != null) {
      PatternFormatting patternFormatting = cFRule.getPatternFormatting();
      System.out.println("has pattern formatting: " + patternFormatting);
      System.out.println(patternFormatting.getFillBackgroundColorColor()); 
     } else if (cFRule.getColorScaleFormatting() != null) {
      System.out.println("has color scale formatting: " + cFRule.getColorScaleFormatting());
     }
    }  

    System.out.println();   
   }
  }

  workbook.close();
 }
}

额外的挑战是当有多个规则将模式格式和/或色阶格式应用于单元格时。然后我们还必须检查规则的 priorityConditionalFormattingEvaluator.getConditionalFormattingForCell 也考虑了优先级。 。所以返回的订单 List<EvaluationConditionalFormatRule>代表优先级。

关于java - 如何使用 POI 测试单元格是否符合 ConditionalFormattingRule 中定义的规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59484503/

相关文章:

java - Lucene 按国家排序

vba - workbook().worksheets() 的简写?

java - 使用 API 将 Excel 列转换为 Java

Java:多线程映射:实现比较如何?

java - "this"关键字不适用于设置上下文

java - ArrayList 对象创建时的默认内存分配

java - 通过Java将HTML内容复制到Excel中

macos - Mac Excel 2011 - 正态分布的直方图

java - 提取数组中的 Excel 单元格值

java - 在jTextPane中显示doc文件的内容