2016-05-21 7 views
2

Dieses Schreiben ist mein Code meine Datei zu schreiben:optimiert ods Dateien mit einfacher-odf

SpreadsheetDocument ods = SpreadsheetDocument.newSpreadsheetDocument(); 
    Table table = Table.newTable(ods, 4000, 20, 0, 0); 
    table.setTableName("foo"); 
    Border border = new Border(Color.BLACK, 1, StyleTypeDefinitions.SupportedLinearMeasure.PT); 
    Font font = new Font("Arial", FontStyle.BOLD, 7, Color.BLACK); 
    List<Row> rows = table.getRowList(); 

    for (Row r : rows) { 
     for (int a = 0; a < 20; a++) { 
      Cell cell = r.getCellByIndex(a); 
      cell.setStringValue("Foo " + a); 
      cell.setBorders(CellBordersType.ALL_FOUR, border); 
      cell.setCellBackgroundColor(Color.valueOf("#A5A5A5")); 
      cell.setFont(font); 
      cell.setHorizontalAlignment(HorizontalAlignmentType.CENTER); 
     } 
    } 

    ods.save("K://foo.ods"); 

In diesem Code ich den Stil auf der Zellebene eingestellt. Um das Schreiben zu optimieren, möchte ich wissen, ob es eine Möglichkeit gibt, auf Zeilen- oder Tabellenebene zu arbeiten. Oder erstellen Sie einen Stil für Rahmen, Schrift, Größe usw. im Dokument und legen Sie den Stil mit der Funktion setCellStyleName fest. Ich kann so etwas tun?

Der Grund ist, weil ich diesen Fehler:

java.lang.OutOfMemoryError: Java heap space at java.util.ArrayList.iterator(ArrayList.java:814) at sun.nio.ch.WindowsSelectorImpl.updateSelectedKeys(WindowsSelectorImpl.java:496) at sun.nio.ch.WindowsSelectorImpl.doSelect(WindowsSelectorImpl.java:172) at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:87) at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:98) at org.apache.tomcat.util.net.NioEndpoint$Poller.run(NioEndpoint.java:1050) at java.lang.Thread.run(Thread.java:745)

Wenn ich das Format (Grenze, Schriftart ...) löschen, kann ich mehr Zeilen schreiben. Wenn ich die content.xml öffne, kann ich sehen, dass ich viele definierte Stile habe, die gleich sind. Ich verwende diese Version:

<dependency> 
     <groupId>org.apache.odftoolkit</groupId> 
     <artifactId>simple-odf</artifactId> 
     <version>0.7-incubating</version> 
    </dependency> 
+0

Nicht mit einfachen ODF, aber Dokument, getOrCreateDocumentStyle. Auch das wiederholte Erstellen neuer Instanzen wie Color.valueOf wirkt sich auf den Speicher aus. –

+0

Haben Sie versucht, dem Programm ein bisschen mehr Speicher zu geben? –

+0

@Joop Eggen Danke für Ihre Infos. Ich definiere eine Farbe einmal außerhalb der Schleife, auf diese Weise Color color = Color.valueOf ("# A5A5A5"); aber ich bekomme den gleichen Fehler. – oscar

Antwort

2

Hier ist der Beispielcode von ODF-Stil Zelle anwenden. Ich kann keine einfache Lösung finden, um Stil zu schaffen. Was ich mache, ist eine ods-Datei zu erstellen, überprüfen Sie das untergeordnete Element von office:automatic-styles in content.xml dann konvertieren Sie es in Java-Code.

SpreadsheetDocument ods = SpreadsheetDocument.newSpreadsheetDocument(); 
    Table table = Table.newTable(ods, 4000, 20, 0, 0); 
    table.setTableName("foo"); 
    //create style 
    OdfOfficeAutomaticStyles astyles = ods.getContentDom().getOrCreateAutomaticStyles(); 
    StyleStyleElement ele = astyles.newStyleStyleElement(OdfStyleFamily.TableCell.getName(), "myss"); 
    StyleTableCellPropertiesElement styleTableCellPropertiesElement = ele.newStyleTableCellPropertiesElement(); 
    styleTableCellPropertiesElement.setFoBackgroundColorAttribute("#A5A5A5"); 
    styleTableCellPropertiesElement.setFoBorderAttribute("1.0pt solid #000000"); 
    ele.newStyleParagraphPropertiesElement().setFoTextAlignAttribute(HorizontalAlignmentType.CENTER.toString()); 
    StyleTextPropertiesElement styleTextPropertiesElement = ele.newStyleTextPropertiesElement(null); 
    styleTextPropertiesElement.setStyleFontNameAttribute("Arial"); 
    styleTextPropertiesElement.setFoFontSizeAttribute("7.0pt"); 
    styleTextPropertiesElement.setFoColorAttribute(Color.BLACK.toString()); 
    styleTextPropertiesElement.setFoFontWeightAttribute("bold"); 

    List<Row> rows = table.getRowList(); 
    for (Row r : rows) { 
     for (int a = 0; a < 10; a++) { 
      Cell cell = r.getCellByIndex(a); 
      cell.setStringValue("Foo " + a); 
      cell.setCellStyleName("myss"); 
     } 
    }