Оптимизируйте запись файлов ods с помощью simple-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");

В этом коде я устанавливаю стиль на уровне ячейки. Чтобы оптимизировать запись, я хочу знать, есть ли способ сделать это для уровня строки или таблицы. Или создайте стиль для границы, шрифта, размера и т. д. в документе и установите стиль с помощью функции setCellStyleName. Я могу сделать что-то вроде этого?

Причина в том, что я получаю эту ошибку:

java.lang.OutOfMemoryError: пространство кучи Java в java.util.ArrayList.iterator(ArrayList.java:814) в sun.nio.ch.WindowsSelectorImpl.updateSelectedKeys(WindowsSelectorImpl.java:496) в sun.nio.ch.WindowsSelectorImpl. doSelect(WindowsSelectorImpl.java:172) в sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:87) в sun.nio.ch.SelectorImpl.select(SelectorImpl.java:98) в org.apache.tomcat.util .net.NioEndpoint$Poller.run(NioEndpoint.java:1050) на java.lang.Thread.run(Thread.java:745)

Если я удалю формат (граница, шрифт...), я смогу написать больше строк. Если я открою content.xml, я увижу, что у меня есть много определенных одинаковых стилей. Я использую эту версию:

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

person oscar    schedule 21.05.2016    source источник
comment
Не имел опыта работы с простым odf, но Document, getOrCreateDocumentStyle. Также многократное создание новых экземпляров, таких как Color.valueOf, влияет на память.   -  person Joop Eggen    schedule 21.05.2016
comment
Вы пытались дать программе немного больше памяти?   -  person    schedule 21.05.2016
comment
@Joop Eggen Спасибо за информацию. Я определяю цвет один раз вне цикла, таким образом Color color = Color.valueOf(#A5A5A5); но я получаю ту же ошибку.   -  person oscar    schedule 21.05.2016
comment
Я меняю значения в своем STS.ini (я использую набор инструментов Spring), но ничего не меняется. Мои значения: -vmargs -Dosgi.requiredJavaVersion=1.7 -Xms512m -XX:MaxPermSize=512m -Dorg.eclipse.swt.browser.IEVersion=10001 -Xmx1024m @RC.   -  person oscar    schedule 21.05.2016


Ответы (1)


Вот пример кода применения стиля ODF к ячейке. Я не могу найти простое решение для создания стиля. Что я делаю, так это создаю файл ods, проверяю дочерний элемент office:automatic-styles в content.xml, а затем преобразую его в код Java.

    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");
        }
    }
person Beck Yang    schedule 09.07.2016