问题描述
当前场景是,从模版读取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