# XLS Datei aus Datenbank erstellen



## Chriss_07 (22. Jun 2010)

Ich habe ein Beispiel für einen Datenexport ins Excelformat bei RoseIndia gefunden und das auf meine Datenbank übertragen. Aber mehr als den SQL Query bekomme ich nicht ausgegeben. Obwohl die Instanz 
	
	
	
	





```
new Workbook()
```
 existiert, wird sie aber nicht erstellt.

```
import java.io.*;
import java.sql.*;

import javax.swing.JOptionPane;

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

public class ExcelFile {
	
	public static Connection con;
	
	
    public static void openUserConnection() throws Exception {
    	
    	
    	try {
    		Class.forName("org.sqlite.JDBC");
    		DriverManager.registerDriver(new org.sqlite.JDBC());
	    	con = DriverManager.getConnection ("jdbc:sqlite:Dberfassendb.db");
	        int level = Connection.TRANSACTION_SERIALIZABLE;
	        con.setTransactionIsolation(level);
	        System.out.println("2. geschafft");
    	}catch (SQLException e) {
			String msg = "Es konnte keine Verbindung zur Datenbank hergestellt werden.\n"
				   + "Die Applikation wird nun geschlossen.";
			JOptionPane.showMessageDialog(null, msg, "Datenbank nicht gefunden!", JOptionPane.WARNING_MESSAGE);
			System.exit(0);
    	}
    }
    
	private static void disconnet() {
		if(con!=null);
		
	}

		public static void main(String[] args) {
        	   String sql;
        		ResultSet rs;
        		Statement stmnt;
        		System.out.println("1. geschafft");
                try {
                	openUserConnection();
        			stmnt = con.createStatement();
                sql = "Select zeit, ort, strasse, info  from tour ";
                System.out.println(sql);
                rs = stmnt.executeQuery(sql);
                        HSSFWorkbook wb = new HSSFWorkbook();
                        HSSFSheet sheet = wb.createSheet("Excel Sheet");
                        HSSFRow rowhead = sheet.createRow((short) 0);
                        rowhead.createCell((short) 0).setCellValue("Zeit");
                        rowhead.createCell((short) 1).setCellValue("Ort");
                        rowhead.createCell((short) 2).setCellValue("Strasse");
                        rowhead.createCell((short) 8).setCellValue("Info");

                        int index = 1;
                        while (rs.next()) {
                        	System.out.println("3. geschafft");
                                HSSFRow row = sheet.createRow((short) index);
                                row.createCell((short) 0).setCellValue(rs.getInt(1));
                                row.createCell((short) 1).setCellValue(rs.getString(2));
                                row.createCell((short) 2).setCellValue(rs.getString(3));
                                row.createCell((short) 3).setCellValue(rs.getInt(4));
                                index++;
                        }
                        FileOutputStream fileOut = new FileOutputStream("c:\\excelFile.xls");
                        wb.write(fileOut);
                        fileOut.close();
                        System.out.println("Data is saved in excel file.");
                        rs.close();
                		stmnt.close();
                		disconnet();
                } catch (Exception e) {
                }
        }
}
```

Habt ihr einen Rat?


----------



## Geeeee (22. Jun 2010)

Evtl. bist du etwas vertieft in den Code, aber was passiert denn nach der Ausgabe des Querys?
Hab mir den Code nun noch nicht angeschaut, weil ich ja nicht weiß, was der Fehler ist. Es muss ja irgendeine Exception kommen oder so.


----------



## Chriss_07 (22. Jun 2010)

Ja hi,
ich bekomme keine Exception. Die System.out werden mir bis zum SQL ausgegeben und das war es dann.

```
1. geschafft
2. geschafft.
Select zeit, ort, strasse, info  from tour
```
Keine Exceptions und kein generierte XLS File


----------



## Geeeee (22. Jun 2010)

Argh..natürlich bekommst du keine, weil du die Exception wegfängst.
Schreib mal mind. e.printStackTrace() in deine Catch-Klausel. (Wäre auch gut, wenn du die unterschiedlichen Exception fängst und nicht global mit dem Typ Exception weggreifst, aber das ist erstmal egal)


----------



## Chriss_07 (22. Jun 2010)

Ähhh, ja. 
Das hat mir schon mal meinen Fehler gezeigt. ICh habe eine Column aufgerufen, die gar nicht existiert.
Sorry, bin doch echt ne Schnarchnase. 
Aber wieder was gelernt - Fehlermeldungen nicht wegfangen.
Nun wird die XLS erstellt, allerdings sind dazu zwei Formatierungsfragen meinerseits.
1. Die Zeit wird nur die Stunden übernommen  z.B.: ( 11 - statt 11:44)
2. Zielort ist jeweils ein Ort hinterlegt, der als 0 übergeben wird z.B. ( DB: Müchen - XLS: 0)


----------



## Michael... (22. Jun 2010)

Wie ist den die Tabelle tour aufgebaut? Wie schaut die Ausgabe aus, wenn man das Statement direkt auf der Datenbank ausführt.


----------



## Chriss_07 (22. Jun 2010)

Aufbau ist eine ID (PK) , die anderen Columns haben TXT als Datentyp.
Führe ich das Statement direkt auf der DB aus, ist die Ausgabe gleich dem Datenbankinhalten.
Zum styling der Zellen habe ich auch schon was gefunden aber die Implementierung stimmt noch nicht

```
HSSFWorkbook wb = new HSSFWorkbook();
                        HSSFSheet sheet = wb.createSheet("Excel Sheet");
                        CellStyle style;
                        DataFormat format = wb.createDataFormat();
                        
                        HSSFRow rowhead = sheet.createRow((short) 0);
                        rowhead.createCell((short) 0).setCellValue("Zeit");

while (rs.next()) {
                        HSSFRow row = sheet.createRow((short) index);
                        row.createCell((short) 0).setCellValue(rs.getInt(1));
                        style = wb.createCellStyle();
                        style.setDataFormat(format.getFormat("00:00"));;
```

EDIT:\\
Wenn ich es schon als 
	
	
	
	





```
String sql;
```
 deklariere, sollte ich denn auch als

```
row.createCell(0).setCellValue(rs.getString(1));
```
aufrufen und nicht als Integer.
Hat sich also erledigt


----------



## henpara (11. Feb 2011)

Falls noch jemand weiß, wo genau man die Classes zum worksheet erstellen herbekommt, wäre ich sehr dankbar!


----------



## SlaterB (11. Feb 2011)

"die Classes zum worksheet erstellen" == die POI-Library??


----------



## henpara (11. Feb 2011)

richtig, hab mir eben die "binary" files von der apache seite runtergeladen, also das file mit dem namen:
poi-bin-3.7-20101029.tar.gz. Scheint mir ne ganz normales archiv zu sein, drinnen sind dann ein paar .jar files, aber keines, das wie in diesem thread genannt wird.

Daher bekomme ich in Eclipse dementsprechend nicht die richtigen klassen eingebunden (wie auch,wenn nur jars gegeben sind).

Ich hab mich bisher noch nicht mit dem Einbinden von Externen Libraries beschäftigt und stehe gerade n bischen auf dem Schlauch, was genau ich runterladen muss, wo ich es hinkopieren muss, und was ich dann im Classpath ändern muss (oder in Eclipse nur "externe library einbinden"?!)

lg


----------



## SlaterB (11. Feb 2011)

welcher Name wird denn in diesem Thread genannt?
das wesentliche Jar ist offensichtlich
poi-3.7-20101029.jar
der Rest wird halt noch dazu benötigt, teilweise nur bei bestimmten Aufgaben,

in Eclipse externe Libraries einbinden, richtig, mindestens dieses jar + alles was im lib-Ordner liegt,
dürfte für einfache Beispiele reichen, ansonsten noch alle anderen jars die du im Zip finden kannst, wobei 
poi-examples-3.7-20101029.jar
wahrscheinlich nicht nötig sein dürfte


----------



## henpara (11. Feb 2011)

Ok, dann versuche ich mich nochmal etwas präziser auszudrücken:

im ersten Post greift der TE folgendermaßen auf die Klassen zu:

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

Ich habe jetzt die runtergeladene Datei umbenannt in "poi.tar.gz" und zu meinen Sourcen kopiert.
Dann in Eclipse Add external Jar die Datei angegeben.
Soweit so gut, keine Fehlermeldungen etzpp.

Wenn ich jetzt aber auf die Klassen zugreifen will, muss ich sie ja auch importieren in meiner Klasse.
Offensichtlich funktioniert der Import wie oben bei mir nicht.
Allerdings wenn ich in die Jar reinschaue hat er zB den Ordner poi3.7, welcher ja als Import Befehl unzullässig ist wegen dem Punkt.

Verstehst du nun wo mein Problem liegt?
Ich weiß prinzipiell, wie ich externe Jars einbinde, aber nicht
1. wie ich die genauen import-pfade herausbekomme (ich dachte immer, das wäre einfach nur die Ordnerabfolge mit . also quasi als Baum)
2. Ob die externen jars eine bestimmte File-Endung haben müssen, um als solche erkannt zu werden, oder ob die Endung .taz oder .gz willkürlich und egal sind.

Ich habe bei einem anderen Projekt zB den DB2- Java-Treiber als externe Klasse in folgendem File:
db2java.zip
wenn ich die öffne gibts mir den genauen Pfad an und alles ist gut, also zB für den Treiber:
COM.ibm.db2.jdbc.app.DB2Driver, und die .class Datei ist auch genau in diesem Unterordner.


----------



## Michael... (11. Feb 2011)

henpara hat gesagt.:


> Verstehst du nun wo mein Problem liegt?


Das Archiv muss entpackt und die jars ins Projekt eingebunden werden, einfach das gepackte Archiv in den Class oder Build Path aufzunehmen hilft nicht viel.


----------



## SlaterB (11. Feb 2011)

> Verstehst du nun wo mein Problem liegt?

klar doch, das Wort 'nun' impliziert vorher nicht, was aber auch schwer war mangels Beschreibung 
bzw. ich verstehe dass du ein Problem hast, aber noch nicht unbedingt genau welches oder wie es dazu kommt,

> Allerdings wenn ich in die Jar reinschaue hat er zB den Ordner poi3.7
das gilt für das Gesamt-Zip/sonstige Downloaddatei poi-bin-3.7-20101029.tar.gz oder ähnlich,
dass dieses erst entpackt werden muss und du dann diverse Jars und anderes erhälst sollte eigentlich klar sein?
du sprichst ja auch selber davon ("drinnen sind dann ein paar .jar files"), die paar jar-Files, das sind erst die interessanten jars,
wie ich doch schon genauestens gesagt habe vor allem poi-3.7-20101029.jar sowie die im lib-Unterzeichnis,
die muss du alle adden, nicht die eine Gesamtdatei

in poi-3.7-20101029.jar kann man auch reinschauen, z.B. per Zip-Programm, dort findet man dann ein Verzeichnis org,
darunter apache/poi usw., von org abgesehen exakt wie die package-Struktur der benötigten Klassen lautet,
apache/poi/hssf/usermodel mit allen benötigten Klassen und noch viel mehr ist alles da


----------



## henpara (11. Feb 2011)

> in poi-3.7-20101029.jar kann man auch reinschauen, z.B. per Zip-Programm, dort findet man dann ein Verzeichnis org,
> darunter apache/poi usw., von org abgesehen exakt wie die package-Struktur der benötigten Klassen lautet,
> apache/poi/hssf/usermodel mit allen benötigten Klassen und noch viel mehr ist alles da



genau das hat mir gefehlt. Hab nicht dran gedacht, daß man die Jar Datei öffnen kann, bzw. daß da nochmal alles drin ist. Jetzt ist mir das ganze wieder klar.

Vielen Dank!


----------

