Apache poi XSSFSheet.write () не завершается - PullRequest
0 голосов
/ 12 февраля 2019

Я использую apache poi 4.0.0 с Java 8 и пытаюсь заполнить шаблон данными и сохранить его в выходном потоке.Это вызывает проблему при записи книги в путь назначения, но только при работе в режиме отладки / на других компьютерах.Файл шаблона имеет размер 7,5 МБ, прежде чем заполнять его данными

Я отладил его и обнаружил, что вызов метода worksheet.save(out, xmlOptions); в XSSFSheet останавливается в какой-то момент.

Значения отладки для out:

class:              org.apache.poi.openxml4j.opc.internal.MemoryPackagePartOutputStream
part:               Name: /xl/worksheets/sheet10.xml - Content Type: application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml
part-relationships: 3 relationship(s) = [/xl/worksheets/_rels/sheet10.xml.rels,/xl/worksheets/sheet10.xml,/xl/worksheets/_rels/sheet10.xml.rels]

Значения отладки для xmlOptions:

SAVE_USE_DEFAULT_NAMESPACE=null
CHARACTER_ENCODING=UTF-8
SAVE_OUTER=null
SAVE_SUGGESTED_PREFIXES={http://schemas.openxmlformats.org/drawingml/2006/chart=c, http://schemas.openxmlformats.org/wordprocessingml/2006/main=w, http://schemas.microsoft.com/office/word/2006/wordml=wne, http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes=vt, http://schemas.openxmlformats.org/presentationml/2006/main=p, urn:schemas-microsoft-com:office:word=w10, urn:schemas-microsoft-com:vml=v, http://schemas.openxmlformats.org/drawingml/2006/main=a, http://schemas.openxmlformats.org/officeDocument/2006/math=m, http://schemas.openxmlformats.org/officeDocument/2006/relationships=r, urn:schemas-microsoft-com:office:excel=x, urn:schemas-microsoft-com:office:office=o, http://schemas.openxmlformats.org/markup-compatibility/2006=ve, http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing=wp}
ENTITY_EXPANSION_LIMIT=1
SAVE_AGGRESSIVE_NAMESPACES=null
SAVE_SYNTHETIC_DOCUMENT_ELEMENT={http://schemas.openxmlformats.org/spreadsheetml/2006/main}worksheet

Еще глубже становится ясно, что при этом происходит сбойМетод:

public void save(OutputStream os, XmlOptions options) throws IOException
    { XmlCursor cur = newCursorForce(); try { cur.save(os, makeInnerOptions(options)); } finally { cur.dispose(); } }

в XmlObjectBase, в частности на newCursorForce().

В чем может быть причина того, что этот метод дает сбой на любом другом компьютере, а также на моем компьютере в режиме отладки?При нормальном выполнении все приложение работает гладко.

РЕДАКТИРОВАТЬ:

Я попытался копать глубже, и теперь я нахожусь на org.apache.xmlbeans.impl.store.Saver, где оно может потерпеть неудачу на createSaveCur ( Cur c, XmlOptions options ), но не совсем уверен.

РЕДАКТИРОВАТЬ 2:

До сих пор мне казалось, что моему приложению требовалось слишком много памяти для продолжения, и поэтому он просто остановился на этом этапе без выброса OutOfMemoryException.Теперь я увеличил объем доступной памяти и мне нужно еще немного проверить, если это истинная причина


Если вам нужна дополнительная информация, не стесняйтесь спрашивать.

1 Ответ

0 голосов
/ 19 февраля 2019

Как я уже сделал вывод во втором редактировании, это была проблема с памятью.При выполнении приложения с -Xms1G -Xmx4G в качестве аргументов виртуальной машины приложение не вызывало проблем, и время выполнения было довольно близко к тому, что я получил при тестировании

...