# Apache POI Filter erstellen



## gigaplanet (18. Okt 2010)

Hallo ich habe eine Frage,

ich will eine Excel Tabelle erstellen und nun in eine bestimmte Zelle einen Filter einsetzen, das ich via Drag and Drop filtern kann. Doch irgendwie sagt er mir das folgendes nicht möglich sei:

sheet.setAutoFilter(CellRangeAddress.valueOf("C5:F200"));

und wo gebe ich an wo er den Filter hinmachen soll??

Danke im vorraus


----------



## nrg (18. Okt 2010)

welche Fehlermeldung bringt er denn?

via Drag&Drop ???:L. Wenn ich jetzt nicht vollkommend auf dem Holzpfad bin hat das mit Drag&Drop eher weniger zu tun


----------



## gigaplanet (18. Okt 2010)

Mir wird gesagt die Methode sei nicht für HSSFSheet zulässig obwohl es in der Apache Dokumentation steht.

Busy Developers' Guide to HSSF and XSSF Features

Mit AutoFilter meinte ich sowas hier:
http://www.edv-workshops.de/images/stories/office/2007/excel/teilergebnis/excel-teilergebnis-05.gif

Das sind doch diese Filter oder steh ich nun auf dem Schlauch?


----------



## nrg (18. Okt 2010)

das meinte ich schon auch, nur hat das trotzdem imho nicht soviel mit Drag&Drop zu tun. Naja ist ja egal. geht ja jetzt nicht darum..

Hab zugegeben noch nicht allzuviel mit POI gemacht und habe jetzt keine Zeit mir ein KSKB zu schreibenn aber wenn das auf der Apache Seite so steht, denke ich doch mal, dass das auch so funktionieren sollte . Wie instanziierst du denn dein sheet?


----------



## gigaplanet (18. Okt 2010)

```
HSSFWorkbook filterWorkbook = new HSSSFWorkbook();
HSSFSheet blatt = filterWorkbook.createSheet();
```

eigentlich ja genauso wie es in der Dokumentation steht und nun direkt datrunter halt die setAutoFilter Methode

aber iwie will er nich


----------



## nrg (18. Okt 2010)

new HSS*S*FWorkbook(); ?

post am besten mal deinen kompletten Code. Wenn es zuviel drumrum ist, mach einfach ein KSKB. Sheet Laden und Autofilter setzen. Allgemein lösen sich viele Probleme mit einem KSKB von selbst, weil man iwo in den Tiefen von dem Programm sogar selbst nicht mehr durchblickt


----------



## gigaplanet (18. Okt 2010)

Ups ein S zuviel


```
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.CellRangeAddress;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Font;


@SuppressWarnings("deprecation")
public class temp {

	public static void main(String[] args) throws IOException {
		
		String fileName="excel.xls";
		HSSFWorkbook Workbook= new HSSFWorkbook();
		CreationHelper createHelper = Workbook.getCreationHelper();
		HSSFSheet blatt=Workbook.createSheet();
		blatt.setAutoFilter(CellRangeAddress.valueOf("A1:A20"));
		FileOutputStream fos= new FileOutputStream(fileName);
		Workbook.write(fos);
		fos.close();
	}
}
```


----------



## nrg (18. Okt 2010)

funktioniert bei mir.

org.apache.poi.hssf.util.CellRangeAddress; ist Deprecated. Wie du ja eigentlich auch schon mit @SuppressWarnings("deprecation") selbst herausgefunden hast.

Probier stattdessen mal:
import org.apache.poi.ss.util.CellRangeAddress;

edit:
hier mein KSKB:

```
import java.io.*;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
 
public class Test {
 
    public static void main(String[] args) throws IOException {
        HSSFWorkbook Workbook = new HSSFWorkbook();
        HSSFSheet blatt = Workbook.createSheet();
        for (int i = 0; i < 10; i++) {
        	Row row = blatt.createRow((short)i);
        	Cell cell = row.createCell(0);
        	if (i == 0)
        		cell.setCellValue("Header");
        	else
        		cell.setCellValue(i);
        }
        blatt.setAutoFilter(CellRangeAddress.valueOf("A1:A1"));
        FileOutputStream fos= new FileOutputStream("c:\\excel.xls");
        Workbook.write(fos);
        fos.close();
    }
}
```


----------



## nrg (18. Okt 2010)

falls das bei dir nicht funktionieren sollte, würde ich mal die aktuellste Library laden. Mehr fällt mir dann aber dann auch nicht mehr ein


----------



## gigaplanet (18. Okt 2010)

Auf jeden Fall erstmal danke für deine Hilfe und deine Zeit.

Aber irgendwie macht er immer noch die selbe Fehlermeldung und ich habe die aktuellste Library...

Ich verstehe es nicht 


Würde es eigentlich gehen das ich mir in Excel eine Art Template erstelle wo ich diese Bereiche in Excel erstelle und mit JAVA einfach nur Daten darein schreiben lasse oder kann ich in JAVA nur generell neue Excel Dateien erstellen?


----------



## nrg (18. Okt 2010)

Java kann da garnix.. Die Frage ist, ob es Apache POI kann . Also was ich der API ennehmen kann, hat HSSFWorkbook wohl mehrere Konstruktoren. U.a. einen, der einen InputStream als Parameter zulässt und somit afaik auch das Laden von Exceldateien zulässt (hätte mich jetzt auch sehr gewundert, wenn das Apache POI nicht kann ).

Zu deinem Problem fällt mir dann, wie oben schon angedeutet, nichts mehr ein. Wie gesagt, bei mir funktioniert das ohne Probleme. Bleiben imho nurnoch Bedienfehler in Bezug auf die IDE o.ä.


----------



## gigaplanet (18. Okt 2010)

Gut dann werde ich das so machen das ich mir ein Template erstelle, hab das gerade mal anhand eines sehr vereinfachten KSKB mal ausgetestet und scheint zu klappen

Ich danke dir aufjeden fall


----------



## nrg (18. Okt 2010)

wenn so ein Work-Around für dich eine Lösung ist, wäre das Problem ja "gelöst" . Für mich ist es allerdings keine aber vllt macht es ja auch in Bezug auf spätere Wartung/Erweiterbarkeit Sinn ein "Excelpattern/-template" zu erstellen. Dann wäre es wiederrum eine Lösung bzw. ein anderer Weg, der zudem noch Vorteile liefert


----------



## gigaplanet (18. Okt 2010)

Naja so ne tolle Lösung ist das auch nicht, aber ich habs nun hinbekommen. Ich hatte die akutuellste stable Version von Apache und noch nicht die 3.7 beta. Damit funktionierts..

Nun steh ich vor dem nächsten Problem, wie kann ich mehrere AutoFilter in ein Sheet setzen?

EDIT: Hat sich erledigt :applaus:


----------



## Stefan G. (14. Feb 2011)

Hallo, 

ich hatte dasselbe Problem beim XSSFSheet. (Methode setAutofilter(boolean) gibts dort nämlich nicht (mehr)!)
Lösung: XSSFSheet.lockAutoFilter();

Gruß,
Stefan


----------

