OutOfMemoryError: Java heap space on write poi.工作簿到ByteArray



我有一些麻烦写poi HSSFWorkBook数据ByteArrayOutputStream。当工作簿超过10MB时发生异常。

private Workbook currentWB;
public DataSource getDataSource() throws Exception {
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
**currentWB.write(out);  <-Exception occurs in this line, when workbook writing in  outputstream**
} finally {
out.close();
}
return new XLSDataSource (TEMPLATE_FILE_NAME, out.toByteArray());
}
private static class XLSDataSource implements DataSource {
private final String name;
private final byte[] content;
private XLSDataSource(String name, byte[] content) {
super();
this.name = name;
this.content = content;
}
@Override
public String getContentType() {
return "application/vnd.ms-excel";
}
@Override
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(content);
}
@Override
public String getName() {
return name;
}
@Override
public OutputStream getOutputStream() throws IOException {
throw new UnsupportedOperationException();
}
}

异常堆栈:

. lang。OutOfMemoryError: Java堆空间java.util.Arrays.copyOf (Arrays.java: 2786)java.io.ByteArrayOutputStream.write (ByteArrayOutputStream.java: 94)java.io.OutputStream.write (OutputStream.java: 58)org.apache.poi.poifs.storage.BigBlock.doWriteData (BigBlock.java: 55)org.apache.poi.poifs.storage.BATBlock.writeData (BATBlock.java: 227)org.apache.poi.poifs.storage.BigBlock.writeBlocks (BigBlock.java: 86)org.apache.poi.poifs.storage.BATBlock.writeBlocks (BATBlock.java: 35)org.apache.poi.poifs.storage.BlockAllocationTableWriter.writeBlocks (BlockAllocationTableWriter.java: 151)org.apache.poi.poifs.filesystem.POIFSFileSystem.writeFilesystem (POIFSFileSystem.java: 398)org.apache.poi.hssf.usermodel.HSSFWorkbook.write (HSSFWorkbook.java: 1181)uk.co.itrainconsulting.appbook.core.impl.service.exportBusinessData.XLSRenderer.getDataSource (XLSRenderer.java: 79)uk.co.itrainconsulting.appbook.core.impl.service.BusinessExportDataServiceImpl.getDataSource (BusinessExportDataServiceImpl.java: 119)uk.co.itrainconsulting.appbook.core.impl.service.BusinessExportDataServiceImpl.sendByEmail (BusinessExportDataServiceImpl.java: 75)uk.co.itrainconsulting.appbook.web.bean.BusinessExportDataBean.sendBusinessData (BusinessExportDataBean.java: 71)在uk.co.itrainconsulting.appbook.web.bean.BusinessExportDataBean f293f.invoke FastClassByCGLIB美元307美元()net.sf.cglib.proxy.MethodProxy.invoke (MethodProxy.java: 191)org.springframework.aop.framework.Cglib2AopProxy CglibMethodInvocation.invokeJoinpoint美元(Cglib2AopProxy.java: 689)org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java: 150)org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed (DelegatingIntroductionInterceptor.java: 131)org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke (DelegatingIntroductionInterceptor.java: 119)org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java: 172)org.springframework.aop.framework.Cglib2AopProxy DynamicAdvisedInterceptor.intercept美元(Cglib2AopProxy.java: 622)在uk.co.itrainconsulting.appbook.web.bean.BusinessExportDataBean EnhancerByCGLIB美元1美元bb626b3.sendbusinessdata ()在sun.reflect.NativeMethodAccessorImpl。invoke0(本地方法)sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java: 39)sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java: 25)java.lang.reflect.Method.invoke (Method.java: 597)com.sun.el.parser.AstValue.invoke (AstValue.java: 234)com.sun.el.MethodExpressionImpl.invoke (MethodExpressionImpl.java: 297)com.sun.faces.facelets.el.TagMethodExpression.invoke (TagMethodExpression.java: 102)javax.faces.component.MethodBindingMethodExpressionAdapter.invoke (MethodBindingMethodExpressionAdapter.java: 84)org.springframework.faces.webflow.FlowActionListener.processAction (FlowActionListener.java: 81)2014年8月12日下午5:49:50 org.apache.catalina.core.StandardHostValve throwable警告:异常处理ErrorPage[exceptionType=java.lang. lang.]Throwable,位置=/错误/internalServerError.jsf]ClientAbortException: java.net.SocketException: Software cause connection abort: socket write errororg.apache.catalina.connector.OutputBuffer.doFlush (OutputBuffer.java: 330)org.apache.catalina.connector.OutputBuffer.flush (OutputBuffer.java: 296)org.apache.catalina.connector.Response.flushBuffer (Response.java: 549)org.apache.catalina.core.StandardHostValve.throwable (StandardHostValve.java: 272)org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java: 141)org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java: 103)org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java: 109)org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java: 293)org.apache.coyote.http11.Http11Processor.process (Http11Processor.java: 861)org.apache.coyote.http11.Http11Protocol Http11ConnectionHandler.process美元(Http11Protocol.java: 606)org.apache.tomcat.util.net.JIoEndpoint Worker.run美元(JIoEndpoint.java: 489)java.lang.Thread.run (Thread.java: 662)产生原因:java.net.SocketException: Software cause connection abort: socket write error在java.net. socketoutputstream . sockettwrite0(本机方法)java.net.SocketOutputStream.socketWrite (SocketOutputStream.java: 92)java.net.SocketOutputStream.write (SocketOutputStream.java: 136)org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes (InternalOutputBuffer.java: 761)org.apache.tomcat.util.buf.ByteChunk.flushBuffer (ByteChunk.java: 448)org.apache.coyote.http11.InternalOutputBuffer.flush (InternalOutputBuffer.java: 318)org.apache.coyote.http11.Http11Processor.action (Http11Processor.java: 987)org.apache.coyote.Response.action (Response.java: 186)org.apache.catalina.connector.OutputBuffer.doFlush (OutputBuffer.java: 325)…11个

我目前使用相同的库,从来没有处理过这么大的文件(10MB)。据我所知,这里唯一的限制是XLSX的行数> 65K,列数> 100万。在使用Writer时也要小心,因为此操作相对较慢。OutOfMemoryError不仅可以由使用POI库引起。

更新:

我目前正在使用较新的XLSX格式(我不知道是否重要),并像这样使用它:

FileOutputStream fileOutputStream = new FileOutputStream(file)) { 
workbook.write(fileOutputStream); 
fileOutputStream.flush();
fileOutputStream.close(); }

我也用:

File file = new File(relativePath);

请注意。close()之前有。flush()

最新更新