我正在使用Java 8运行apache poi 4.0.0,并尝试用数据填充模板并将其保存到输出流。这会在将工作簿写入目标路径时引起问题,但仅在以调试模式运行/在其他计算机上运行时会出现问题。模板文件在填充数据之前的大小为7.5 MB
我对其进行调试,发现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
。我现在增加了可用内存,如果这是真正的原因,则需要进一步测试
如果您需要更多信息,请随时询问。
答案 0 :(得分:0)
正如我在第二次编辑中已经总结的那样,这确实是一个内存问题。以-Xms1G -Xmx4G
作为VM参数执行该应用程序,该应用程序没有引起任何问题,并且运行时非常接近我在测试时得到的结果