Java如何将逗号分隔的Excel范围字符串赋值给CellRangeAddress[]数组
实现方案
你可以直接将逗号分隔的不连续范围字符串转换为CellRangeAddress[]数组,再应用到条件格式配置中,Apache POI会自动生成你在Sheet.xml中看到的空格分隔的sqref属性,完全匹配需求:
- 将逗号分隔的范围字符串拆分为单个区间片段,
CellRangeAddress.valueOf原生支持带$的Excel范围格式,无需额外处理符号也可正常解析 - 逐个将区间片段转为
CellRangeAddress对象,收集为数组 - 将数组传入条件格式的应用方法即可
import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFSheetConditionalFormatting; import org.apache.poi.ss.usermodel.IconMultiStateFormatting; import org.apache.poi.ss.usermodel.ConditionalFormattingRule; // 你持有的不连续范围字符串 String rangeStr = "$P$32:$P$38,$P$43:$P$45,$P$50:$P$76,$P$81:$P$116,$P$121:$P$121,$P$126:$P$130"; // 拆分转换为CellRangeAddress数组 String[] rangeSegments = rangeStr.split(","); CellRangeAddress[] targetRanges = new CellRangeAddress[rangeSegments.length]; for (int i = 0; i < rangeSegments.length; i++) { targetRanges[i] = CellRangeAddress.valueOf(rangeSegments[i]); } // 配置3Flags图标集条件格式 XSSFSheet sheet = ...; // 你自己的工作表实例 XSSFSheetConditionalFormatting formatting = sheet.getSheetConditionalFormatting(); ConditionalFormattingRule rule = formatting.createConditionalFormattingRule(IconMultiStateFormatting.IconSet.III_FLAGS); IconMultiStateFormatting iconConfig = rule.getMultiStateFormatting(); // 按你示例的xml配置阈值,Excel行号为1-based,POI行索引为0-based,L列索引为11 iconConfig.getThresholds()[0].setValue(sheet.getRow(273).getCell(11).getNumericCellValue()); iconConfig.getThresholds()[1].setValue(sheet.getRow(273).getCell(11).getNumericCellValue()); iconConfig.getThresholds()[2].setValue(sheet.getRow(272).getCell(11).getNumericCellValue()); // 将规则应用到所有不连续范围 formatting.addConditionalFormatting(targetRanges, rule);
以上代码生成的xlsx文件解压后,conditionalFormatting节点的sqref属性会自动生成空格分隔的多个范围值,和你提供的xml结构完全一致。
内容的提问来源于stack exchange,提问作者Adeeb Mark
相关产品推荐
相关产品推荐

