# Große Excel Datei erstellen



## 00d4vid (9. September 2009)

Hi,

ich muss sehr große Excel-Dateien generieren. Hierfür habe ich mir diverse Java-APIs angeschaut (POI, OpenXls, JExcel), jedoch ist hier immer das Problem, dass ich um ein Worksheet bearbeiten zu können, die komplette Excel-Datei Streamen muss und hierbei dann einen irre hohen Speicherbedarf habe.

Gibt es die Möglichkeit, jeweils nur ein Worksheet der Excel-Datei zu bearbeiten, sodass man nur diese Daten einlesen und wieder wegspeichern muss?
Oder eventuell noch eine andere API, die das beherrscht?


----------



## HonniCilest (9. September 2009)

Hmm ich weiß nciht, welche Anforderungen deine Excel-Seiten haben müssen.

Die einfachste Anfoderung wäre ein Worksheet ohne Fomattierungen. Um das zu erreichen könnte man das Speicherformat *.csv nehmen.

Siehe http://de.wikipedia.org/wiki/CSV_(Dateiformat)

CSV steht für Comma-Separated Values. Die Spalten werden durch ein ; getrennt und jede Zeile ist eine Zeile.
D.h. wenn du beispielsweise folgenden Text (->normale Textverarbeitung) hast:

1;2;3
4;5;6
7;8;9

dann hast du die Felder A1,A2,A3,B1,B2,B3,C1,C2 und C3 belegt.


----------



## 00d4vid (9. September 2009)

Das reicht mir nicht, ich muss Formatierungen rein bringen.
CSV-Dateien kenne ich. Was eventuell eine Möglichkeit wäre, ist, erst alle "Rohdaten" in einer CSV-Datei zu speichern, die dann nach Excel schieben und dann die xls-Datei zu parsen und formatieren. Dies behebt aber immer noch nicht das Problem, dass ich die Excel-Datei ins Programm komplett laden muss.


----------



## Johannes7146 (9. September 2009)

Das gleich problem hatte ich auch mal.
Ich bin damals auch auf csv umgestiegen. Aber das scheint wohl niht die Lösung zu sein.


----------



## Thomas Darimont (9. September 2009)

Hallo,

was ist denn genau das Problem? Bekommst du OutOfMemoryErrors?

http://jexcelapi.sourceforge.net/resources/faq/
-> How do I get rid of OutOfMemory exceptions? 		

Weitere Variante... Open Office Calc Spreadsheets mit UNO  automatisieren...
http://www.tutorials.de/forum/java/...fice-scalc-spreadsheets-mit-java-via-uno.html

Gruß Tom


----------



## HonniCilest (10. September 2009)

Ich hab mal ein wenig gegoogelt und da haben einige auch

http://www.andykhan.com/jexcelapi/

genannt. Ansonsten schau mal hier:

http://www.rgagnon.com/javadetails/java-0516.html
http://www.moyosoft.com/jec/


----------



## 00d4vid (10. September 2009)

Hi, erstmal danke für die Antworten.

@Thomas: Ja ich bekomme Out of Memory Exceptions, allerdings auch wenn ich die heap size erhöhe.
Zur Erklärung: Die generierten Excel-Files haben ca. 35 Sheets mit jeweils bis zu 8000 Daten. Auf jeder Seite sind zudem Bilder (Logos) drauf. Bei den Bildern darf ich Abstriche machen, bei den Logos nicht. Und das wird glaube ich mit den APIs immer etwas eng.
Ich habe auch gelesen, dass die APIs grundsätzlich Probleme haben ab ca. 6000 Datensätzen, was bei mir aber bei weitem nicht ausreicht (jeder Datensatz besteht auch 12 Spalten).
Ich suche gerade nach Tutorials zu der JDBC-ODBC Brigde um zu testen, ob ich da die Daten vielleicht rein bekomme, da es dort ja möglich ist, nur einzelne Sheets über SQL anzusprechen, wenn ich es richtig verstanden habe.

Der zweite Link generiert mir aber doch OpenOffice Dokumente oder? Ich bin aber leider gezwungen Excel (2003) Files zu erzeugen.

@Honni:
Die Jexcel Api habe ich schon probiert.
Hast du Erfahrung mit der myosoft API?


----------



## HonniCilest (10. September 2009)

00d4vid hat gesagt.:


> @Honni:
> Die Jexcel Api habe ich schon probiert.
> Hast du Erfahrung mit der myosoft API?



Jain, ich hab mal ein wenig rumgespielt, Erfahrung würde ich es nicht unbedingt nennen zudem ich nur die kostenfreie Version genutzt habe.
Was genau möchtest du an deinen Dateien bearbeiten?
Hier mal ein Testcode von mir, der auf einem Codebeispiel von myosoft basiert, von mir ist der Teil mit dem Kopieren einer Zelle. Es funktioniert auch, mich nervt nur immer die Meldung am Anfang, die weißen immer wieder darauf hin, dass es die kostenfreie Version ist.


```
import java.awt.*;
import java.io.*;

import com.moyosoft.connector.com.*;
import com.moyosoft.connector.exception.*;
import com.moyosoft.connector.ms.excel.*;

public class OpenWorkbook
{
    public static void main(String[] args)
    {
        try
        {
            FileDialog fileDialog = new FileDialog(new Frame());
            fileDialog.setVisible(true);
            
            String selectedFile = fileDialog.getFile();
            
            if(selectedFile != null)
            {
                // Create the Excel application object
                Excel excel = new Excel();

                try
                {
                    // Open the selected Excel document
                    Workbook workbook = excel.openWorkbook(new File(fileDialog.getDirectory(), selectedFile));
                    
                    // Print the workbook name
                    System.out.println("The workbook name is: " + workbook.getName());
                    
                    Range mySource = excel.getActiveWorkbook().getActiveWorksheet().getCell(0, 0);
                    Range myTarget = excel.getActiveWorkbook().getActiveWorksheet().getCell(0, 1);
                    // Copy  A1 to A2, simular to cut()
                    mySource.copy(myTarget); 
                    // or only copy value
                    myTarget.setValue(mySource.getValue());
                    
                    //Show the Excel workbook 
                    excel.setVisible(true);
                }
                finally
                {
                    // Dispose the library
                    excel.dispose();
                }
            }
        }
        catch (ComponentObjectModelException ex)
        {
            System.out.println("COM error has occured: ");
            ex.printStackTrace();
        }
        catch (LibraryNotFoundException ex)
        {
            // If this error occurs, verify the file 'moyocore.dll' is present
            // in java.library.path
            System.out.println("The Java Excel Library hasn't been found.");
            ex.printStackTrace();
        }
    }
}
```

Edit:
Ich finde die API sieht schon sehr vielversprechend für dich aus, zumindest wirkt es auf mich so, dass er die Datei nicht komplett läd, sondern wirklich ein connect aufbaut und über diesen connect auf die Datei zugreift. Das Problem ist wie gesagt nur es ist nicht kostenfrei.
Ich hab auch mal geschaut, weil du meintest du brauchst Formattierungen. Das habe ich zwar nie probiert, aber laut Docs gibt es ua. eine Class CellFormat (oder für deine Grafiken auch die Class Graphics), welche recht vielversprechend aussieht.


----------



## tomkruse (10. September 2009)

Ich beschäftige mich gerade mit dem Zerlegen von von Excel-Dateien in einzelne Sheets und anschließendes Wiederzusammenführen. Dazu benutze ich Aspose.Cells. Das klappt recht gut. Ich kann eine Excel-Datei automatisch in einzelne Sheets splitten und diese als Dateien unter sheetname.xls ablegen. Später kann ich sie dann wieder zusammenbauen und in eine Datei speichern. Das klappt soweit. 

Allerdings kann die Copy-Worksheet-Methode von Aspose keine Grafiken übernehmen. Nur Zelleninhalte und Styles. Bezüge von Zellen zu anderen Sheets gehen beim Zerlegen natürlich verloren. Um diese zu behalten muß man anders vorgehen. Klappt aber auch, nur darf man das Workbook nicht einmal komplett zuerlegen sondern immer nur ein Sheet zur Bearbeitung herauslösen und nachher unter demselben Namen wieder drüberkopieren. 

Hoffe, das hilft Dir irgendwie weiter


----------



## Thomas Darimont (10. September 2009)

Hallo,

hier mal ein Beispiel für die Manipulation von Excel Dokumenten via JDBC Odbc Bridge
http://www.tutorials.de/forum/java/201081-die-beispiele-des-videoworkshops-zum-thema-jdbc.html

Gruß Tom


----------



## 00d4vid (10. September 2009)

Also ich habe auch das Gefühl, dass myosoft bei vielen Daten nicht so schnell ist.
Wie kann ich den beim Insert von Daten über die JdbcOdbc-Bridge die Spalten/Tabellennamen angeben?

Einfach mit Column1 Row1 oder muss man die vorher benennen?


----------

