JAVA使用POI对Excel中的条件格式处理

问题描述

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

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

解决思路

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

        1、获取模版和新的excel中sheet页的“条件样式”对象(因为条件样式是针对sheet页来的)

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

        2、获取模版中有多少“条件样式”

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

        3、对模版中的条件样式进行循环,并获取模版中的每一条“条件样式”

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

        4、获取模版中“条件样式”对应的单元格数组

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

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

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步,就是下面的结果

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

 

不扯没用的,直接上代码 

    /**
     * 将模版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中"条件样式"的背景

        }
    }

        

如果有什么疑问,或者指教 欢迎加QQ:1318623133

-----------------------------------------   I`am Joshua,may god bless you

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值