使用POI库复制条件格式

使用POI java库将某些条件格式应用于Excel文档时,我遇到了一些问题。 我试图突出显示重复的文本values.The下面的代码正常工作,除了规则格式没有设置的事实。 当我打开Excel文档时,我看到规则已被添加( 新规则的屏幕快照 ),但没有分配格式/颜色。

public void conditionalFormatting() throws Exception { /* Read Workbook and Identify Color Scale Range */ sheet = wb.getSheetAt(0); List<String> my_range = new ArrayList<>(); my_range.add("F2:F" + (rowIndex + 1)); /* Add Conditional Formatting Rule */ CTConditionalFormatting colorScale = sheet.getCTWorksheet().addNewConditionalFormatting(); colorScale.setSqref(my_range); // Attach Range to conditional formatting set CTCfRule myCFRule = colorScale.addNewCfRule(); //create a rule myCFRule.setType(STCfType.DUPLICATE_VALUES); // set type of rule to Colour Scale myCFRule.setPriority(1); // rule priority = 1 } 

有谁知道如何添加一个格式/颜色的规则?

问候,T. Lecoffre

首先 – 除非你知道你在做什么,否则不要与低级别的CT课程一起工作。 理想情况下,即使这样做也不要这么做 – 太多的错误/错过!

相反,您应该使用Apache POI usermodel类来进行条件格式化。 在POI网站上有关于它们的文档 ,你可以从这里开始在JavaDocs中阅读它 ,或者在POI的例子中查看这个程序来获得可用的全部选项

从Conditional Formats例子中的formatDuplicates方法 ,你可以看到你需要的代码是这样的:

  SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting(); ConditionalFormattingRule rule1 = sheetCF.createConditionalFormattingRule("COUNTIF($F$2:$F$11,F2)>1"); FontFormatting font = rule1.createFontFormatting(); font.setFontStyle(false, true); font.setFontColorIndex(IndexedColors.BLUE.index); CellRangeAddress[] regions = { CellRangeAddress.valueOf("F2:F11") }; sheetCF.addConditionalFormatting(regions, rule1); 

这将突出显示在蓝色的重复

如果你想使用颜色比例或类似的(不确定相当于如何工作的重复?),那么也有一个例子在同一个文件

在学习“xlsx”文件结构之后,我能够find我想要使用CT类的东西。 为了理解POI库,我强烈build议任何人查看“xlsx”压缩文件并研究xml文件(更具体地说 – xl / worksheets / {sheet_name} .xml)。 这里是我想出的代码:

 public void conditionalFormatting() throws Exception { /* Read Workbook and Identify Color Scale Range */ sheet = wb.getSheetAt(0); List<String> my_range = new ArrayList<>(); my_range.add("F2:F" + (rowIndex + 1)); /* Add Conditional Formatting Rule */ CTConditionalFormatting colorScale = sheet.getCTWorksheet().addNewConditionalFormatting(); colorScale.setSqref(my_range); // Attach Range to conditional formatting set CTCfRule myCFRule = colorScale.addNewCfRule(); //create a rule myCFRule.setType(STCfType.DUPLICATE_VALUES); // set type of rule to Colour Scale myCFRule.setPriority(1); // rule priority = 1 /* Add a differential formatting record */ myCFRule.setDxfId(createDXFs(wb, 12)) } /* Create a new differential formatting record */ private static int createDXFs(XSSFWorkbook wb, int size) { CTDxfs dxfs = wb.getStylesSource().getCTStylesheet().getDxfs(); if(dxfs == null) { dxfs=wb.getStylesSource().getCTStylesheet().addNewDxfs(); } dxfs.setCount(dxfs.getCount() + 1); // update the dxfs count variable CTDxf dxf=dxfs.addNewDxf(); /* Set rule font size */ CTFontSize fontSize=dxf.addNewFont().addNewSz(); fontSize.setVal(size); /* Set rule pattern/background color */ CTFill fill = dxf.addNewFill(); CTPatternFill pattern = fill.addNewPatternFill(); CTColor color = pattern.addNewBgColor(); color.setRgb(javax.xml.bind.DatatypeConverter.parseHexBinary("FFF8696B")); return (int) dxfs.getCount() - 1; // return the dxf index } 

问候,T. Lecoffre