# Apache POI Source einbinden



## mike075 (5. Jul 2011)

Hallo,

weis jemand wie die POI 3.7 source Datei heisst die ich bei Eclipse Galileo unter Build Path -> 
poi-3.7-20101029.jar -> Source attachment einbinden muss, damit ich mein Programm debuggen kann ohne das der Debugger abbricht?

Ich habe sowohl die src als auch die bin Dateien der POI 3.7 Version heruntergeladen, aber weis nicht 
welche Datei ich einbinden muss damit der Debugg-Prozess nicht abbricht.

Mein Test-Prgramm sieht so aus:


```
package android.test;

import java.io.IOException;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.widget.TextView;

public class POI_TestActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        String s = "test.xlsx";
        String sFile = Environment.getExternalStorageDirectory()+"/"+s;	
        try {			
        	HSSFWorkbook wb = Excel.readFile(sFile);  // Sobald ich diesen Schritt ausfuehre bricht er 
			int counts_of_sheets = wb.getNumberOfSheets();   // mit der Fehlermeldung Source not found ab
			HSSFSheet sheets = wb.getSheetAt(counts_of_sheets);
			HSSFRow row = sheets.getRow(0);
			HSSFCell cell = row.getCell(0);
			String sCell = cell.getStringCellValue();
			
			TextView v = (TextView)findViewById(R.id.text);
			v.setText(sCell);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        
        setContentView(R.layout.main);
    }
}
```

Will einfach nur zum Test die erste Reihe und erste Spalte einer xlsx-Datei auslesen 
welche ein String ist und ins Textfeld schreiben.


Vielen Dank fuer Hilfen.

LG

Micha


----------



## mike075 (6. Jul 2011)

Hallo, 

kennt wirklich niemand dieses Problem? Das kann nicht sein.


----------



## SlaterB (6. Jul 2011)

dein Programm ist doch ziemlich irrelevant für die Frage,
viel interessanter ist, was du heruntergeladen hast, denn irgendwas davon wird doch der Source sein, nicht wahr?

von der Seite
Apache POI - Download Release Artifacts
habe ich jetzt testweise 38 MB poi-src-3.8-beta3-20110606.zip geladen statt 3.7, aber dürfte ähnlich sein,
sowas muss man entpacken, darauf schon gekommen? (klingt grad fies, aber soll einfach nur ne Frage sein)
darin finde ich bei mir dann poi-3.8-beta3\src\java und darin lauter packages usw.,
dieses java-Verzeichnis muss bei 'Source Attachement Configuration' eingegeben werden, wie weit sind dir die Eclipse-Schritte bekannt?

-----

> Debugg-Prozess nicht abbricht.

ob es für Debugger ausreicht weiß ich nicht, ich selber benutzte Source nur zum Anschauen einzelner Klassen


----------



## mike075 (7. Jul 2011)

Hallo,

naja ich habe lieber eine stable version runtergeladen und keine beta. Diese habe ich natuerlich entpackt (was fuer eine Frage) und das src Verzeichnis davon dann in eclipse eingetragen (So wie ich es auch vorher erklaert habe). Leider hat das fuer den Debugg prozess nicht ausgereicht. Er meckert trotzdem das die source fehlt. 

Ich denke man kann nicht die POI library debuggen sondern nur ausfuehren, was ich im Endeffekt zu
wenig finde und den Machern dieses ankreiden will.

LG


----------



## SlaterB (7. Jul 2011)

> und das src Verzeichnis davon dann in eclipse eingetragen (So wie ich es auch vorher erklaert habe)

<->

> Ich habe sowohl die src als auch die bin Dateien der POI 3.7 Version heruntergeladen, aber weis nicht welche Datei ich einbinden muss 

hmm

--------

also was du auf jeden Fall machen kannst ist, die Library als jar nicht zu verwenden sondern nur den Quellcode in dein Projekt oder in ein referenziertes zweites Projekt zu kopieren,
dann gibts keinen Unterschied zu deinen Quellcode, dann muss ja alles funktionieren,

ansonsten das Jar einbinden und das src/java-Verzeichnis als Quellcode attachen


----------



## ARadauer (7. Jul 2011)

Seit wann bricht der Debugger ab nur weil der Sourcen nicht zur Verfügung hat?


----------



## mike075 (7. Jul 2011)

> also was du auf jeden Fall machen kannst ist, die Library als jar nicht zu verwenden sondern nur den Quellcode in dein Projekt oder in ein referenziertes zweites Projekt zu kopieren,
> dann gibts keinen Unterschied zu deinen Quellcode, dann muss ja alles funktionieren,


Gute Idee werde ich nachher mal ausprobieren.

@ARadauer


> Seit wann bricht der Debugger ab nur weil der Sourcen nicht zur Verfügung hat?


Also er bricht ja in dem Sinne nicht ab nur da man nicht im Debug Modus weiter durchsteppen kann, ist das so als ob er abgebrochen hat, da er den Quellcode nicht weiter sichtbar durchlaeuft.

Edit:
So habe jetzt mal folgendes probiert bevor ich das mit dem separatem Projekt ausprobieren will.

Ich habe den ordner org in c:\java\poi-src-3.7-20101029\poi-3.7\src\java\org
als zip gepackt (poi-src-3.7-src.zip) und die zip als Source Attachment eingetragen. 

Das AVD Device habe ich folgendermassen vorkonfiguriert:
- die vorherige installierte testaplikation deinstalliert
- die beiden Ordner cache.img.lock und userdata-qemu.img.lock geloescht
- das project rebuildet

Nun passiert was sehr merkwuerdiges. Sobald ich den emulator (im Debug-Modus) zum ersten mal
starte erhallte ich wieder das obige Problem das er die source nicht finden kann. 
Wenn ich das ganze stoppe und einen neuen (zweiten) Debug-Prozess starte, 
so oeffnet er mir einen euen emulator (was ich nicht ganz nachvollziehen kann) und wenn ich nun
durchsteppen will funktioniert es. Also im Prinzip nach den ersten Debug-Prozess funktioniert das 
Durchsteppen ohne die Meldung. Warum? Ich kann das nicht ganz nachvollziehen.


----------



## mike075 (7. Jul 2011)

So habe nun mal ein neues Projekt angelegt welches ich RefPOI genannt habe. Darin habe ich in den
src-Ordner alle Dateien aus aus der Source des POI kopiert also alle Dateien aus org/apache/poi. Die 
Struktur habe ich dennoch eingehalten also src/org/apache/poi.
Dann habe ich dieses Projekt als referenziertes Projekt eingetragen, aber leider funktioniert jetzt 
gar nix mehr. 

Ich bin es langsam Leid das es Developer gibt die 3rd Party Libs schreiben die nicht mal richtig 
funktionieren und man saemtliches machen muss bis die funktionieren. Ich moechte einfach nur eine
Excel Datei bearbeiten und beschaeftige mich nun seit Tagen mit dieser der Konfigurierung in Eclipse. 
Das darf einfach nicht sein.


----------



## SlaterB (7. Jul 2011)

geht das nicht-funktionieren genauer? erstmal muss das POI-Projekt für sich kompilieren, dazu braucht es evtl. weitere Libraries,
die sowieso zusätzlich benötigt werden,
wenn es dort keine Kompilerfehler gibt, evtl. gar eine Mini-Testklasse erfolgreich ausgeführt wird, 
dann das Referenzieren, was ist dort das Problem (erst wenn das andere funktioniert)?


----------



## mike075 (10. Jul 2011)

So habe jetzt folgendes ausprobiert aber immer noch kein Erfolg.

Habe ein Projekt erstellt namens POI. In diesem habe ich den Ordner src (des POI Projekts) 
reinkopiert und refreshed damit ich das Ganze auch in Eclipse erhallte. Wenn ich das POI Projekt 
alleine kompiliere erhallte ich KEINE Fehlermeldung. 
Habe dann in meinem Projekt POI_Test ueber Java Build Path -> Projects -> add auf das POI 
Projekt referenziert. Wenn ich dann Folgenden Code ausfuehren will (mit allen erforderlichen libs 
eingebunden) erhallte ich wieder die Fehlermeldung das er das HSSFWorkbook nicht kennt 
(HSSFWorkbook cannot be resolved to a type)


```
...
public class Excel {
	
	public static HSSFWorkbook readFile(String sFile) throws IOException {
		return new HSSFWorkbook(new FileInputStream(sFile));
	}
}
```

Was muss ich denn noch machen damit diese besch... 3rd party lib endlich mal funkrioniert?


----------



## SlaterB (11. Jul 2011)

du brauchst einen import-Befehl und bei dem Tonfall überlege ich mir jede Antwort dreimal,
überdenke ob du das für geeignet hältst

fange gegebenenfalls nochmal komplett neu an,
ein Projekt mit Klasse 
class A {
}

ein anderes Projekt mit

class B {
  private A a;
}

bevor das nicht mit zwei Klasse von insgesamt 10 Zeilen Code funktioniert,
brauchst du nicht 100.000 Codezeilen managen und ebenso viele Fluche aussprechen


----------



## mike075 (11. Jul 2011)

So habe jetzt mal ein Testprojekt mit zwei Klassen A und B erstellt so wie Du es beschrieben hast.
Das scheint auch ganz gut zu funktionieren.

Meine beiden Projekte sehen so aus:

Mein_POI
- beinhaltet den Order src in dem ich alle Dateien der source (vom Apache POI Projekt) hineinimportiert
habe (komisch ist das ich nach dem importieren nur leere packages habe)

Test_POI
- beinhaltet der Ordner src in dem ich eine Klasse Test_Poi erstellt habe in der ich einfach nur 
eine Variable HSSFWorkbook anlege (private)

In dem Java Build Path habe ich das Mein_POI Projekt referenziert, aber er findet die Klassen immer
noch nicht.


----------



## SlaterB (12. Jul 2011)

wie früher schon mal geschrieben (aber im letzten Posting leider nicht erwähnt) liegen die POI-Klassen nicht direkt in src sondern in src/java,
erkennbar an den weiteren Unterverzeichnissen im Vergleich zu den package-Angaben in den Klassen,
wenn in deinem Proejtk auch alles in einem java-Unterverzeichnis liegt, dann funktioniert das kaum

außerdem muss das schon als richtiges Verzeichnis für Java-Klassen definiert sein, nicht als beliebiges normales Verzeichnis von Dateien,
siehe Anhang, Unterschied src zu temp

da ist also eine Menge zu beachten und alles muss kompilieren, wenn du jetzt
> komisch ist das ich nach dem importieren nur leere packages habe
sagst, passt das wenig zum vorherigen
> Wenn ich das POI Projekt alleine kompiliere erhallte ich KEINE Fehlermeldung. 
was ich fälschlicherweise als Ok-Meldung verstanden habe


Screenshots von dir würden auch helfen,
ein denkbarer Trick ist, erstmal nur einen Teil der Klassen zu kopieren, ein paar Unterpackages wegzulassen,
wenn es dann tausende Fehlermeldungen hagelt ist das ausnahmsweise mal was gutes, zeigt Leben an,
perfekt ist es wenn sie alle weggehen wenn du die fehlenden packages ergänzt,
da du bisher anscheinend noch nichts von POI kompiliert hast kann es aber auch sein dass im POI-Projekt benötigte dritte Libraries noch fehlen usw.


----------



## mike075 (12. Jul 2011)

> außerdem muss das schon als richtiges Verzeichnis für Java-Klassen definiert sein, nicht als beliebiges normales Verzeichnis von Dateien.


Wenn ich richtig verstehe  meinst Du mit richtigem Verzeichnis fuer Java-Klassen das die
Klassen in den Ordner src kopiert werden muessen und nicht (wie in deinem screenshot der Ordner
temp) in einem beliebigen Ordner, stimmts?

So habe ebenfalls mal ein screenshot von meiner Baumstruktur gepostet (habe einige Ordner im 
src -> java -> org -> apache -> poi) geloescht damit ich ein volles screenshot machen kann mit beiden
Projekten.

Edit:
Ich glaube ich habe es .
Ich habe jetzt mal nur ab den org Ordner alles kopiert also 
src -> org -> apache -> poi und ich habe nur noch drei Fehlermeldungen fuer folgendes Paket.
org.apache.commons.*;
Nachdem ich aber in meiner Struktur mal nachgeschaut habe finde ich diesen Ordner nicht. ISt das vieleicht wie Du schon erwaehnst eine weitere 3rd party lib die eingebunden werden muss?

Ich haette da noch eine Frage:
Ich habe im mom alle Klassen (auch die die nicht benoetigt werden) in den POI Source Ordner 
kopiert. Wird dadurch ebefalls das Programm nach dem Kompilieren aufgeblaeht oder kompiliert er 
nur die Klassen die benoetigt werden?

Vielen Dank fuer weitere Hilfen


----------



## SlaterB (12. Jul 2011)

das POI-Projekt ist so groß wie eben Klassen da sind, ohne Quellcode-Änderungen wird Eclipse das nicht oft neu kompilieren,
fürs andere Projekt hat das quasi keine Auswirkungen, später zur Ausführung kann man dann auch die normale POI-Jar nehmen,

zu den Fehlermeldungen habe ich es jetzt mal selber probiert:
zum einen brauchst du die commons-logging-1.1.jar, die ja im binary-Download auch im lib-Verzeichnis aufgeführt ist,

dann wird noch org.apache.commons.codec.binary.Base64 angemerkt, nach
jars containing the class org.apache.commons.codec.binary.Base64
brauchst du Codec - Home

leider auf der Webseite keine exakte Auflistung gefunden


----------



## mike075 (13. Jul 2011)

Habe es geschafft eine xls Datei auszulesen und auch Deine genannten src's eingebunden (nach kurzer
Suche der Sources ueber Google). Die Logger-Klasse habe ich aus dem Projekt entfernt und somit alle
Fehlermeldungen besitigt.

Leider habe ich danach mal versucht eine xlsx Datei auszulesen und wenn Du da siehst was du alles brauchst dann bleibst Du besser bei der xls Datei grins.

Dennoch danke ich Dir fuer die Ausfuehrliche Hilfe ohne Dich haette ich das nicht geschafft .

Generell tolles Forum ich werde diesem treu bleiben (komme aus dem C/C++ Sektor, aber Java ist
Zukunft).

LG


----------

