Java 如何使用ApachePOI获取Excel文件中单元格的条件格式?

Java 如何使用ApachePOI获取Excel文件中单元格的条件格式?,java,apache-poi,Java,Apache Poi,我有一个xlsx文件,它已经有几个条件格式规则。 如何从单元格中获取格式规则? 我想“读取”现有单元格中的所有规则,并将它们应用于我将创建的新规则 谢谢大家! SheetConditionalFormatting rules = sheet.getSheetConditionalFormatting(); Cell cell = sheet.createRow(18).createCell(1); CellReference cr = new CellReference(cell.getRo

我有一个xlsx文件,它已经有几个条件格式规则。 如何从单元格中获取格式规则? 我想“读取”现有单元格中的所有规则,并将它们应用于我将创建的新规则

谢谢大家!

SheetConditionalFormatting rules = sheet.getSheetConditionalFormatting(); 
Cell cell = sheet.createRow(18).createCell(1); 
CellReference cr = new CellReference(cell.getRowIndex(), cell.getColumnIndex()); 
CellRangeAddress[] range = {CellRangeAddress.valueOf("B19")};
ConditionalFormatting rule = rules.getConditionalFormattingAt(0);
rules.addConditionalFormatting(range, rule.getRule(0)); 
但我希望能够像这样做:

cell.getFormattingRules();

我找到了答案。当我得到表中的所有规则时,我可以得到这些规则的范围。现在我需要检查一下,我的手机是否在这个范围内。
谢谢大家

我有同样的需求,我用几个函数解决了它。如果你发现里面有什么虫子,请告诉我

它会将条件格式样式从“样式单元格”复制到“单元格”

private void expandConditionalFormatting(XSSFCell单元格,XSSFCell样式单元格){
XSSFheetConditionalFormatting xscf=cell.getSheet().getSheetConditionalFormatting();

对于(int idx=0;idx谢谢您的示例, 您可以使用不同的方法来展开公式,如下面所示: 您必须准确了解orgin公式的范围

private void expandConditionalFormatting(XSSFSheet sheet, CellRangeAddress cellRangeSourceAddress,
        CellRangeAddress cellRangeDestinationAddress) {
    XSSFSheetConditionalFormatting conditions = sheet.getSheetConditionalFormatting();
    for (int idx = 0; idx < conditions.getNumConditionalFormattings(); idx++) {
        XSSFConditionalFormatting cf = conditions.getConditionalFormattingAt(idx);
        List<CellRangeAddress> cra = Arrays.asList(cf.getFormattingRanges());
        List<CellRangeAddress> newCra = new ArrayList<CellRangeAddress>();
        for (CellRangeAddress c : cra) {
            if (cellRangeSourceAddress.getFirstColumn() == c.getFirstColumn()
                    && cellRangeSourceAddress.getLastColumn() == c.getLastColumn()
                    && cellRangeSourceAddress.getFirstRow() == c.getFirstRow()
                    && cellRangeSourceAddress.getLastRow() == c.getLastRow()) {
                newCra.add(cellRangeDestinationAddress);
            } 
        }
        ArrayList<XSSFConditionalFormattingRule> cfs = new ArrayList<XSSFConditionalFormattingRule>();
        for (int ci = 0; ci < cf.getNumberOfRules(); ci++) {
            cfs.add(cf.getRule(ci));
        }
        if (newCra.size() > 0) {
            conditions.addConditionalFormatting(newCra.toArray(new CellRangeAddress[newCra.size()]),
                    cfs.toArray(new XSSFConditionalFormattingRule[cfs.size()]));
            conditions.removeConditionalFormatting(idx);
        }
    }
}
private void expandConditionalFormat(XSSFSheet sheet、CellRangeAddress、cellRangeSourceAddress、,
CellRangeAddress cellRangeDestinationAddress){
XSSFheetConditionalFormatting条件=sheet.getSheetConditionalFormatting();
对于(int idx=0;idx0){
conditions.addConditionalFormatting(newCra.toArray(新的CellRangeAddress[newCra.size()]),
toArray(新的XSSFConditionFormattingRule[cfs.size()]);
条件。去除条件格式(idx);
}
}
}

与我们分享…您迄今为止的尝试…
SheetConditionalFormat rules=sheet.GetSheetConditionalFormat();Cell Cell=sheet.createRow(18.createCell(1);CellReference cr=new CellReference(Cell.getRowIndex(),Cell.getColumnIndex());CellRangeAddress[]range={CellRangeAddress.valueOf(“B19”)};ConditionalFormatting rule=rules.getConditionalFormattingAt(0);rules.addConditionalFormatting(range,rule.getRule(0));
但这并不是我想做的事。但是我没有其他想法谢谢你,@Zilom!事实上,在搜索了几天“方便”的方法之后,我实现了类似的解决方案,但忘了在这里分享它
private void expandConditionalFormatting(XSSFSheet sheet, CellRangeAddress cellRangeSourceAddress,
        CellRangeAddress cellRangeDestinationAddress) {
    XSSFSheetConditionalFormatting conditions = sheet.getSheetConditionalFormatting();
    for (int idx = 0; idx < conditions.getNumConditionalFormattings(); idx++) {
        XSSFConditionalFormatting cf = conditions.getConditionalFormattingAt(idx);
        List<CellRangeAddress> cra = Arrays.asList(cf.getFormattingRanges());
        List<CellRangeAddress> newCra = new ArrayList<CellRangeAddress>();
        for (CellRangeAddress c : cra) {
            if (cellRangeSourceAddress.getFirstColumn() == c.getFirstColumn()
                    && cellRangeSourceAddress.getLastColumn() == c.getLastColumn()
                    && cellRangeSourceAddress.getFirstRow() == c.getFirstRow()
                    && cellRangeSourceAddress.getLastRow() == c.getLastRow()) {
                newCra.add(cellRangeDestinationAddress);
            } 
        }
        ArrayList<XSSFConditionalFormattingRule> cfs = new ArrayList<XSSFConditionalFormattingRule>();
        for (int ci = 0; ci < cf.getNumberOfRules(); ci++) {
            cfs.add(cf.getRule(ci));
        }
        if (newCra.size() > 0) {
            conditions.addConditionalFormatting(newCra.toArray(new CellRangeAddress[newCra.size()]),
                    cfs.toArray(new XSSFConditionalFormattingRule[cfs.size()]));
            conditions.removeConditionalFormatting(idx);
        }
    }
}