这篇博客主要是说明如何通过POI设置excle文档中单元格的条件格式。
POI版本 : poi-3.5-FINAL
涉及到的主要类:
org.apache.poi.hssf.usermodel.HSSFSheet;
org.apache.poi.hssf.usermodel.HSSFConditionalFormattingRule;
org.apache.poi.hssf.usermodel.HSSFPatternFormatting;
org.apache.poi.hssf.usermodel.HSSFSheetConditionalFormatting;
辅助类:
org.apache.poi.hssf.record.CFRuleRecord.ComparisonOperator;
相关代码1:
HSSFSheetConditionalFormatting scf = sheet.getSheetConditionalFormatting();
//设置"条件格式"的规则,本例选择的条件类型是:"单元格数据"
//如果当前单元格的数据等于R,则显示红色
HSSFConditionalFormattingRule cf_R_rule = scf.createConditionalFormattingRule(ComparisonOperator.EQUAL, "\"R\"", null);
HSSFPatternFormatting cf_R = cf_R_rule.createPatternFormatting();
cf_R.setFillBackgroundColor(HSSFColor.RED.index);
//如果当前单元格的数据等于G,则显示绿色
HSSFConditionalFormattingRule cf_G_rule = scf.createConditionalFormattingRule(ComparisonOperator.EQUAL, "\"G\"", null);
HSSFPatternFormatting cf_G = cf_G_rule.createPatternFormatting();
cf_G.setFillBackgroundColor(HSSFColor.GREEN.index);
HSSFConditionalFormattingRule[] cfRules = {cf_R_rule, cf_G_rule};
//条件格式应用的单元格范围
CellRangeAddress[] regions = {new CellRangeAddress(5, 5, 7, 9)};
scf.addConditionalFormatting(regions, cfRules);
相关代码2:
HSSFSheetConditionalFormatting scf = sheet.getSheetConditionalFormatting();
//设置"条件格式"的规则,本例选择的条件类型是:"公式"
//如果A1到A5单元格中有一个为空,那么对应单元格就显示红色
HSSFConditionalFormattingRule cf_rule= scf.createConditionalFormattingRule("COUNTBLANK(A1:A5)>0");
HSSFPatternFormatting cf = cf_rule.createPatternFormatting();
cf.setFillBackgroundColor(HSSFColor.RED.index);
HSSFConditionalFormattingRule[] cfRules = {cf_rule};
//条件格式应用的单元格范围
CellRangeAddress[] regions = {CellRangeAddress.valueOf("B1:B1")};
scf.addConditionalFormatting(regions, cfRules);
说明:
1. HSSFSheetConditionalFormatting.createConditionalFormattingRule()
提供了两种方式来生成条件格式:“单元格数据”,可以使用 ComparisonOperator.BETWEEN,NOT_BETWEEN,EQUAL,NOT_EQUAL,GT,LT,GE,LE 多种比较运算符;
"公式",只需要将公式的以字符串的形式传给该方法,就可以生效(如果公式中有 " , 记得使用转义字符 \" )
2. CellRangeAddress[] regions = {CellRangeAddress.valueOf("B1:B1")};
CellRangeAddress[] regions = {new CellRangeAddress(5, 5, 7, 9)};
用来指定"条件格式"作用的范围,如上面的代码,可以用两种不同的方式来指定作用域。
导出的excle中,可以看到条件格式的效果,但是,如果你修改其他的单元格,而没有修改被设置的单元格中的内容,那么被设置的单元格的效果并不能立即作出反应;只有当你修改了被设置的单元格中的内容时,才会按照设置的条件来生效。(关于这个缺点,如果大家有更好的解决办法,希望可以提出来,大家学习交流下。)