Я нахожусь в ситуации, когда я поместил условное форматирование по формуле, например:
=COUNTIF($A14,"*~*")>0
Для ячеек E14 - E38.
Теперь это работает довольно хорошо в Excel 2007, но неработает вообще в Excel 2016. Я проверил XML-файл, который выглядит так:
<conditionalFormatting sqref="E14:E38">
<cfRule priority="1" dxfId="0" type="expression">
<formula>COUNTIF($A14,"*~*")>0</formula>
</cfRule>
</conditionalFormatting>
Даже если я удаляю правила и добавляю его снова, он не работает.Я пробовал другое правило, но для этих ячеек условное форматирование вообще не работает.
К вашему сведению, я установил область печати, и условное форматирование внутри области печати не работает ни для одной ячейки, но работает довольно хорошо вне печатиarea.
Все эти проблемы есть только в Excel 2016.
NB. Я создаю файл excel с использованием Apache POI
По сути, я копирую условноформатирование с одного листа Excel на другой.Код как ниже;
private void copyConditionalFormattingRules(Sheet source,Sheet destination){
try{
SheetConditionalFormatting sscf= source.getSheetConditionalFormatting();
SheetConditionalFormatting dscf= destination.getSheetConditionalFormatting();
//SheetConditionalFormatting dscf0= ((XSSFSheet)destination).getSheetConditionalFormatting();
// delete existng formattings,if any
for(int i=0;i<dscf.getNumConditionalFormattings();i++){
dscf.removeConditionalFormatting(i);
}
//looping over all conditional formattings
for(int i=0;i<sscf.getNumConditionalFormattings();i++){
ConditionalFormatting cf = sscf.getConditionalFormattingAt(i);
ConditionalFormatting cf1 = sscf.getConditionalFormattingAt(i);
CellRangeAddress[] range = cf.getFormattingRanges();
for(int j=0;j<cf.getNumberOfRules();j++){
//getting various properties from source
ConditionalFormattingRule rule = cf.getRule(j);
String formula1 = rule.getFormula1();
//creating new rule for destination sheet
ConditionalFormattingRule newRule = dscf.createConditionalFormattingRule(formula1);
try{
//Get pattern formatting
PatternFormatting pattern = rule.getPatternFormatting();
PatternFormatting newPattern = newRule.createPatternFormatting();
//retrieve pattern information
Color bgcolor = pattern.getFillBackgroundColorColor();
Color fgcolor = pattern.getFillForegroundColorColor();
short bgcolor1 = pattern.getFillBackgroundColor();
short fgcolor1 = pattern.getFillForegroundColor();
short fillPattern = pattern.getFillPattern();
if(bgcolor != null)
newPattern.setFillBackgroundColor(bgcolor);
if(bgcolor1 != 0)
newPattern.setFillBackgroundColor(bgcolor1);
if(fgcolor != null)
newPattern.setFillForegroundColor(fgcolor);
if(fgcolor1 != 0)
newPattern.setFillBackgroundColor(fgcolor1);
if(fillPattern != 0)
newPattern.setFillPattern(fillPattern);
}catch(Exception e){
e.printStackTrace();
}
try{
//Get font formatting
FontFormatting font = rule.getFontFormatting();
FontFormatting newFont = newRule.createFontFormatting();
if(font != null) {
//retrieve font information
int colorIndex = font.getFontColorIndex();
Color fontColor = font.getFontColor();
int fontHeight = font.getFontHeight();
short ulType = font.getUnderlineType();
if(colorIndex != 0)
newFont.setFontColorIndex((short) colorIndex);
if(fontColor != null){
//currently font color not working
//https://stackoverflow.com/questions/45611870/can-not-set-font-color-in-conditional-formatting-cell-via-apache-poi
try{
newFont.setFontColor(fontColor);
}catch(Exception e){
}
}
if(fontHeight != 0)
newFont.setFontHeight(fontHeight);
if(ulType != 0)
newFont.setUnderlineType(ulType);
}
}catch(Exception e){
e.printStackTrace();
}
try{
//Get border formatting
BorderFormatting borderFormatting = rule.getBorderFormatting();
BorderFormatting newBorderFormatting = newRule.createBorderFormatting();
if(borderFormatting != null) {
//retrieve border information
int bBottom = borderFormatting.getBorderBottom();
int bLeft = borderFormatting.getBorderLeft();
int bDiagonal = borderFormatting.getBorderDiagonal();
int bTop = borderFormatting.getBorderTop();
int bRight = borderFormatting.getBorderRight();
int bBottomColor = borderFormatting.getBottomBorderColor();
int bTopColor = borderFormatting.getTopBorderColor();
int bRightColor = borderFormatting.getRightBorderColor();
int bLeftColor = borderFormatting.getLeftBorderColor();
int bDiagonalColor = borderFormatting.getDiagonalBorderColor();
if(bBottom != 0)
newBorderFormatting.setBorderBottom((short) bBottom);
if(bTop != 0)
newBorderFormatting.setBorderBottom((short) bTop);
if(bLeft != 0)
newBorderFormatting.setBorderBottom((short) bLeft);
if(bRight != 0)
newBorderFormatting.setBorderBottom((short) bRight);
if(bDiagonal != 0)
newBorderFormatting.setBorderBottom((short) bDiagonal);
if(bBottomColor != 0)
newBorderFormatting.setBottomBorderColor((short) bBottomColor);
if(bTopColor != 0)
newBorderFormatting.setTopBorderColor((short) bTopColor);
if(bLeftColor != 0)
newBorderFormatting.setLeftBorderColor((short) bLeftColor);
if(bRightColor != 0)
newBorderFormatting.setRightBorderColor((short) bRightColor);
if(bDiagonalColor != 0)
newBorderFormatting.setDiagonalBorderColor((short) bDiagonalColor);
}
}catch(Exception e){
e.printStackTrace();
}
//--------------------------------End of getting------------------------------
//setting properties from source
dscf.addConditionalFormatting(range,newRule);
}
}
}catch(Exception e){
e.printStackTrace();
}
}
Любая помощь будет очень полезна для меня.Если вам нужно больше деталей, пожалуйста, дайте мне знать.Заранее спасибо.