Apache poi XSSFSheet.write() 未完成

Apache poi XSSFSheet.write() not finishing

我是 运行 apache poi 4.0.0 Java 8 并尝试用数据填充模板并将其保存到输出流。这会在将工作簿写入目标路径时导致问题,但仅当 运行 在调试 mode/on 其他机器时才会出现问题。在填充数据之前,模板文件的大小为 7.5 MB

我调试了一下,发现XSSFSheet中的方法调用worksheet.save(out, xmlOptions);在某个时候停止了。

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。我现在增加了可用内存,如果这是真正的原因,我需要进一步测试一下


如果您需要更多信息,请随时询问。

正如我在第二次编辑中得出的结论,这确实是内存问题。使用 -Xms1G -Xmx4G 作为 VM 参数执行应用程序,应用程序没有引起任何问题,运行时间非常接近我在测试时得到的结果