问题描述

        当前场景是,从模版读取excel的信息和格式,新建一个excel,并设置格式和数据,但是在设置条件样式(条件格式)没有设置成功,这里记录一下解决办法。

从百度也看了好多文章,都试了也不行。接下来,说一下解决思路

解决思路

        POI中excel的条件格式是 “XSSFSheetConditionalFormatting” 这样的一个类,条件样式中有“条件”和“格式” 是两个不同的处理地方,也就是意味着,我获取了模版中的“条件”设置到新的excel之后,还需要获取模版中的“格式”设置到新的excel里。

条件样式”对象(因为条件样式是针对sheet页来的)

XSSFSheetConditionalFormatting oldFormatting = oldSheet.getSheetConditionalFormatting(); //获取模版的sheet中的条件样式对象
XSSFSheetConditionalFormatting newFormatting = newSheet.getSheetConditionalFormatting(); //获取新的excel的sheet中的条件样式对象

有多少“条件样式”

int numConditionalFormattings = oldFormatting.getNumConditionalFormattings(); //获取模版的sheet中有多少条件样式

每一条“条件样式”

XSSFConditionalFormatting conditionalFormattingAt = oldFormatting.getConditionalFormattingAt(i); //获取模版的sheet中的每一个条件样式

对应的单元格数组

CellRangeAddress[] formattingRanges = conditionalFormattingAt.getFormattingRanges(); //获取模版的sheet中的"条件样式"对应的单元格

“条件”的下标(我这里只取了一个,如果是多个就循环取)

int numberOfRules = conditionalFormattingAt.getNumberOfRules(); //获取模版的sheet中"条件"的下标

        7、获取模版中的“条件”对象,并设置到新的sheet里

XSSFConditionalFormattingRule rule = conditionalFormattingAt.getRule(numberOfRules-1); //通过下标获取模版的sheet中的"条件"
newFormatting.addConditionalFormatting(formattingRanges,rule); //设置新的sheet中的"条件样式"中的"条件"

        8、在新的sheet里创建“样式”对象

XSSFConditionalFormattingRule conditionalFormattingColorScaleRule = newFormatting.createConditionalFormattingColorScaleRule(); //创建新的sheet中的"条件样式"中的"样式"
XSSFPatternFormatting patternFormatting = conditionalFormattingColorScaleRule.createPatternFormatting(); //获取"样式"对象

        9、将模版的“样式”设置到新的sheet里

patternFormatting.setFillBackgroundColor(rule.getPatternFormatting().getFillBackgroundColorColor()); //设置新sheet中"条件样式"的背景

测试解析

        如果只设置到了第7步,就是下面的结果

java解放excel逻辑校验 java校验excel格式_java

       如果设置到了第9步,就是下面的结果

java解放excel逻辑校验 java校验excel格式_java_02

 

不扯没用的,直接上代码 

/**
     * 将模版sheet中的条件样式设置到新的sheet中
     * @param newSheet
     * @param oldSheet
     */
    public static void setConditionStyle(XSSFSheet newSheet,XSSFSheet oldSheet){
        XSSFSheetConditionalFormatting oldFormatting = oldSheet.getSheetConditionalFormatting(); //获取模版的sheet中的条件样式对象
        XSSFSheetConditionalFormatting newFormatting = newSheet.getSheetConditionalFormatting(); //获取新的excel的sheet中的条件样式对象
        int numConditionalFormattings = oldFormatting.getNumConditionalFormattings(); //获取模版的sheet中有多少条件样式
        for (int i = 0; i < numConditionalFormattings; i++) {
            XSSFConditionalFormatting conditionalFormattingAt = oldFormatting.getConditionalFormattingAt(i); //获取模版的sheet中的每一个条件样式
            CellRangeAddress[] formattingRanges = conditionalFormattingAt.getFormattingRanges(); //获取模版的sheet中的"条件样式"对应的单元格
            int numberOfRules = conditionalFormattingAt.getNumberOfRules(); //获取模版的sheet中"条件"的下标
            XSSFConditionalFormattingRule rule = conditionalFormattingAt.getRule(numberOfRules-1); //通过下标获取模版的sheet中的"条件"
            newFormatting.addConditionalFormatting(formattingRanges,rule); //设置新的sheet中的"条件样式"中的"条件"

            XSSFConditionalFormattingRule conditionalFormattingColorScaleRule = newFormatting.createConditionalFormattingColorScaleRule(); //创建新的sheet中的"条件样式"中的"样式"
            XSSFPatternFormatting patternFormatting = conditionalFormattingColorScaleRule.createPatternFormatting(); //获取"样式"对象
            patternFormatting.setFillBackgroundColor(rule.getPatternFormatting().getFillBackgroundColorColor()); //设置新sheet中"条件样式"的背景

        }
    }