# Apache POI(HSSF) Conditional Formatting



## carsten123 (28. Aug 2008)

Hi,

ich erzeuge mittels HSSF Excel-Sheets. Die darin enthaltenen Zellen besitzen eine Bedingte Formatierung. So lange sich die Bedingte Formatierung auf den Werte der Zelle selbst beschränkt ist alles super. 
Wenn  ich jedoch als Bedingung nur eine Formel verwende klappt es nicht, das heißt die Datei wird geschrieben und man kann sie auch mit Excel öffnen, will man sich aber die Bedingte-Formatierung über "Format"->"Bedingte Formatierung" anschauen, erscheint nicht das kleine Fester, das sonst immer erscheint und auch die Formatierung an sich Funktioniert nicht.

Hier mein Quelltext:


```
HSSFConditionalFormattingRule rule4 = formating.createConditionalFormattingRule("$A$5<$A$6");
HSSFPatternFormatting patternFmt4 = rule4.createPatternFormatting();
patternFmt4.setFillBackgroundColor(HSSFColor.VIOLET.index);

Region [] regions2 =
		 {
		     new Region(3,(short)3,3,(short)3)
		 };
		 
 formating.addConditionalFormatting(regions2, rule4);
```

in der API steht zur Funktion "createConditionalFormattingRule()" folgendes:

"A factory method allowing to create a conditional formatting rule with a formula.
The formatting rules are applied by Excel when the value of the formula not equal to 0.

TODO - formulas containing cell references are currently not parsed properly "

Aber die API ist meiner Meinung noch veraltet und nicht aktuell (ist mir an anderen Stellen aufgefallen). Ich benutze Apache POI 3.1. 

Wieß vielleicht jemand wie es richtig funktioniern könnte, oder ist die Implementierung wirklich fehlerhaft?

Gruß carsten


----------



## carsten123 (28. Aug 2008)

so und jetzt noch eine Quellcode-Snippet wie das ganze mit der Bedingten Formatierung aus HSSF heraus funktioniert, damit nicht alle einen ganzen Tag lang rum Probieren müssen :



```
package Foo;

import java.io.File;
import java.io.FileOutputStream;
import org.apache.poi.hssf.record.CFRuleRecord.ComparisonOperator;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFConditionalFormatting;
import org.apache.poi.hssf.usermodel.HSSFConditionalFormattingRule;
import org.apache.poi.hssf.usermodel.HSSFPatternFormatting;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFSheetConditionalFormatting;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.hssf.util.Region;


public class foo{
    public static void main(String[] args){

	// Workbook anlegen
	HSSFWorkbook workbook = new HSSFWorkbook();
	//Sheet erstellen
	HSSFSheet sheet = workbook.createSheet("TestSheet");
	HSSFRow row = sheet.createRow(0);
	HSSFCell cell = row.createCell((short)0);
	

	
	HSSFSheetConditionalFormatting formating = sheet.getSheetConditionalFormatting();
	
	//Formatregel bestimmen
	//Regel lautet: wenn der Zelleninhalt kleiner 8 ist
	HSSFConditionalFormattingRule rule1 = formating.createConditionalFormattingRule(
		    ComparisonOperator.LT, 
		    8+"", // muss hier ein String sein
		    null   
	);
	
	//Art der Formatierung bestimmen	 
	HSSFPatternFormatting patternFmt1 = rule1.createPatternFormatting();
	patternFmt1.setFillBackgroundColor(HSSFColor.LIGHT_GREEN.index);
	
	//Bereich bestimmen in dem diese Regel gueltig ist
	Region [] regions ={
		     new Region(1,(short)1,1,(short)1)
		 };	 
		 
	//Regel zum Sheet hinzufuegen
	formating.addConditionalFormatting(regions, rule1);		

	//xls-Datei schreiben
	try {
	    FileOutputStream out = new FileOutputStream(new File("testaus.xls"));
	    workbook.write(out);
	    
	} catch (Exception e) {
	    e.printStackTrace();
	}
    }		
}
```

ich hoffe, dass das manchen n bissl weiterhilft


----------



## JohnDoe2000 (21. Okt 2010)

Hallo zusammen,

sorry, dass ich auf so einen alten Beitrag antworte aber genau dieser Beitrag hat mir sehr gut weitergeholfen. Nun habe ich allerdings ein weiteres Problem, was die bedingte Formatierung angeht:

Ich würde gern den aus Excel "Zellwert ist" Vergleich in einer Cond.Formatting mit HSSF umsetzen. Hier ein Beispiel. Ich werde gern alle Zellen mit einer Bedingten Formatierung formatieren und sollte in einer Zelle ein "a" (ohne Anführungszeichen) stehen, dann soll die Farbe der Zelle geändert werden.

Ich habe folgenden Ansatz (der für Integer auch super funktioniert) ausprobiert:


```
HSSFSheetConditionalFormatting formating = m_sheet.getSheetConditionalFormatting();
HSSFConditionalFormattingRule rule3 = formating.createConditionalFormattingRule(ComparisonOperator.EQUAL, ".", null);
HSSFPatternFormatting patternFmt3 = rule3.createPatternFormatting();
patternFmt3.setFillBackgroundColor(COLOR_MARK);
CellRangeAddress regions[] = { new CellRangeAddress (INDEX_ROW_TABLE,m_rowCount-1,0,m_dates.size()+2) };
formating.addConditionalFormatting(regions, rule3);
```

Allerdings bekomme ich für chars oder einen String eine Exception:


```
org.apache.poi.ss.formula.FormulaParseException: Specified named range 'a' does not exist in the current workbook.
	at org.apache.poi.ss.formula.FormulaParser.parseNonRange(FormulaParser.java:567)
	at org.apache.poi.ss.formula.FormulaParser.parseRangeable(FormulaParser.java:515)
	at org.apache.poi.ss.formula.FormulaParser.parseRangeExpression(FormulaParser.java:266)
	at org.apache.poi.ss.formula.FormulaParser.parseSimpleFactor(FormulaParser.java:1117)
	at org.apache.poi.ss.formula.FormulaParser.percentFactor(FormulaParser.java:1077)
	at org.apache.poi.ss.formula.FormulaParser.powerFactor(FormulaParser.java:1064)
	at org.apache.poi.ss.formula.FormulaParser.Term(FormulaParser.java:1424)
	at org.apache.poi.ss.formula.FormulaParser.additiveExpression(FormulaParser.java:1524)
	at org.apache.poi.ss.formula.FormulaParser.concatExpression(FormulaParser.java:1508)
	at org.apache.poi.ss.formula.FormulaParser.comparisonExpression(FormulaParser.java:1465)
	at org.apache.poi.ss.formula.FormulaParser.unionExpression(FormulaParser.java:1445)
	at org.apache.poi.ss.formula.FormulaParser.parse(FormulaParser.java:1566)
	at org.apache.poi.ss.formula.FormulaParser.parse(FormulaParser.java:174)Programm beendet.

	at org.apache.poi.hssf.model.HSSFFormulaParser.parse(HSSFFormulaParser.java:72)
	at org.apache.poi.hssf.record.CFRuleRecord.parseFormula(CFRuleRecord.java:525)
	at org.apache.poi.hssf.record.CFRuleRecord.create(CFRuleRecord.java:146)
	at org.apache.poi.hssf.usermodel.HSSFSheetConditionalFormatting.createConditionalFormattingRule(HSSFSheetConditionalFormatting.java:71)
	at XlsWriter.conditionalFormatting(XlsWriter.java:673)
	at XlsWriter.close(XlsWriter.java:761)
	at XlsWriter.<init>(XlsWriter.java:71)
	at Main.generateXls(Main.java:32)
	at Main.main(Main.java:75)
```

Wäre super, wenn mir jemand helfen könnte. Sitze schon etwas an dem Problem. Google wusste auch keine Antwort.

Danke für Eure Hilfe.


Gruß
John


----------



## JohnDoe2000 (22. Okt 2010)

Hat denn wirklich keine eine Idee? Bin echt echt der Einzige, der eine Bedingung auf Zeichen und nicht Zahlen anwenden will?


----------

