使用 poi导大量数据到excel 2007导致内存溢出

发布于 2021-11-25 14:18:01 字数 31244 浏览 794 评论 11

我使用的是poi 3.9。导数据到excel 2007。编程环境是eclipse,使用maven进行管理,项目是ssh项目。

主要依赖jar包:


<dependency>
		<groupId>org.apache.poi</groupId>
		<artifactId>poi</artifactId>
		<version>3.9</version>
	</dependency>
	<dependency>
		<groupId>org.apache.poi</groupId>
		<artifactId>poi-ooxml</artifactId>
		<version>3.9</version>
	</dependency>
     <dependency>
	<groupId>org.apache.xmlbeans</groupId>
		<artifactId>xmlbeans</artifactId>
		<version>2.5.0</version>
	</dependency>       
	<dependency>
		<groupId>org.apache.poi</groupId>
		<artifactId>ooxml-schemas</artifactId>
		<version>1.1</version>
	</dependency>


我使用循环每次从数据库中取出2000条数据,把这些数据写入到excel中,在写到8万多条的时候,内存溢出了。

我调整了jvm大小。-Xms64m -Xmx500m。

我想请教os上的大神们,有没有什么解决方案?Any help is appreciate

错误信息如下


2013-06-07 16:14:26 DEBUG [com.hzqy.web.limits.user.ac.UserAction] >> 
2013-06-07 16:14:26 DEBUG [com.hzqy.web.limits.user.ac.UserAction] >> 
2013-06-07 16:14:31 DEBUG [com.hzqy.web.limits.user.ac.UserAction] >> 14
2013-06-07 16:14:31 DEBUG [com.hzqy.web.limits.user.ac.UserAction] >> 18c6d818ae35a3e8279b5330eda01498
2013-06-07 16:14:52 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 报表保存地址:D:sysKandeadmin_musicmaven.1364461128622pom_musicmusic_websrcmainfiledownload订购历史20130607161452.xlsx
2013-06-07 16:14:52 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 工作环境创建成功
2013-06-07 16:14:53 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 基本excel建立成功
2013-06-07 16:15:01 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 2002行
2013-06-07 16:15:01 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:15:08 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 4002行
2013-06-07 16:15:08 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:15:16 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 6002行
2013-06-07 16:15:16 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:15:25 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 8002行
2013-06-07 16:15:25 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:15:35 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 10002行
2013-06-07 16:15:35 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:15:47 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 12002行
2013-06-07 16:15:47 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:15:58 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 14002行
2013-06-07 16:15:58 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:16:11 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 16002行
2013-06-07 16:16:11 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:16:25 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 18002行
2013-06-07 16:16:25 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:16:41 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 20002行
2013-06-07 16:16:41 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:16:56 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 22002行
2013-06-07 16:16:56 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:17:12 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 24002行
2013-06-07 16:17:12 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:17:29 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 26002行
2013-06-07 16:17:29 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:17:47 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 28002行
2013-06-07 16:17:47 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:18:05 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 30002行
2013-06-07 16:18:05 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:18:25 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 32002行
2013-06-07 16:18:25 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:18:44 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 34002行
2013-06-07 16:18:44 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:19:05 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 36002行
2013-06-07 16:19:05 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:19:25 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 38002行
2013-06-07 16:19:25 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:19:47 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 40002行
2013-06-07 16:19:47 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:20:10 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 42002行
2013-06-07 16:20:10 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:20:33 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 44002行
2013-06-07 16:20:33 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:20:57 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 46002行
2013-06-07 16:20:57 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:21:22 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 48002行
2013-06-07 16:21:22 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:21:47 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 50002行
2013-06-07 16:21:47 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:22:25 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 52002行
2013-06-07 16:22:25 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:23:06 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 54002行
2013-06-07 16:23:06 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:23:47 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 56002行
2013-06-07 16:23:47 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:24:33 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 58002行
2013-06-07 16:24:33 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:25:18 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 60002行
2013-06-07 16:25:18 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:26:07 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 62002行
2013-06-07 16:26:07 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:26:57 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 64002行
2013-06-07 16:26:57 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:27:49 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 66002行
2013-06-07 16:27:49 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:28:43 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 68002行
2013-06-07 16:28:43 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:29:45 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 70002行
2013-06-07 16:29:45 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:30:49 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 72002行
2013-06-07 16:30:49 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:31:55 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 74002行
2013-06-07 16:31:55 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:33:07 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 76002行
2013-06-07 16:33:07 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:34:23 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 78002行
2013-06-07 16:34:23 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:35:48 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 80002行
2013-06-07 16:35:48 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:37:23 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 82002行
2013-06-07 16:37:23 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:39:10 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 84002行
2013-06-07 16:39:10 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:41:05 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 86002行
2013-06-07 16:41:05 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:43:16 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 88002行
2013-06-07 16:43:16 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 
2013-06-07 16:43:49.482:WARN::/music_web/downExcelOrderHistoryVo.action
java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:404)
	at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:267)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:229)
	at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:221)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:150)
	at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:48)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:123)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:167)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:105)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:83)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:207)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:74)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:127)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:107)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:206)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:115)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:143)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:121)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:170)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:123)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:50)
	at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:507)
	at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:421)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)
	at org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:99)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)
	at com.hzqy.web.limits.user.LoginFilter.doFilter(LoginFilter.java:38)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)
	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:399)
	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
	at org.mortbay.jetty.Server.handle(Server.java:326)
	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
	at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:928)
	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549)
	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
	at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
2013-06-07 16:43:49.482:WARN::Nested in java.lang.reflect.InvocationTargetException:
java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Arrays.java:2271)
	at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:113)
	at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
	at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:140)
	at org.apache.poi.openxml4j.opc.internal.MemoryPackagePartOutputStream.write(MemoryPackagePartOutputStream.java:88)
	at org.apache.xmlbeans.impl.store.Cursor._save(Cursor.java:590)
	at org.apache.xmlbeans.impl.store.Cursor.save(Cursor.java:2544)
	at org.apache.xmlbeans.impl.values.XmlObjectBase.save(XmlObjectBase.java:212)
	at org.apache.poi.xssf.usermodel.XSSFSheet.write(XSSFSheet.java:2695)
	at org.apache.poi.xssf.usermodel.XSSFSheet.commit(XSSFSheet.java:2655)
	at org.apache.poi.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:313)
	at org.apache.poi.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:317)
	at org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:173)
	at org.apache.poi.xssf.streaming.SXSSFWorkbook.write(SXSSFWorkbook.java:768)
	at com.hzqy.web.music.stat.poiutil.POIUtil.writeObjListToExcel(POIUtil.java:187)
	at com.hzqy.web.music.stat.biz.OrderHisBiz.excute(OrderHisBiz.java:64)
	at com.hzqy.web.music.stat.ac.FileAction.downExcelOrderHistoryVo(FileAction.java:63)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:404)
	at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:267)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:229)
	at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:221)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:150)
	at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:48)


我写excel的工具类:POIUtil

刚开始的时候,我执行到6万条记录就内存溢出了,我电脑内存完全被占用了。后来通过查资料,使用SXSSFWorkbook 这个类来写excel,并且在内存中记录满100条的时候就往硬盘上输出。这样我电脑内存一直有空余。代码出错在187行,workbook.write(os);这一段。我的数据量并没有达到Integer的最大值。我感觉是在写excel的过程中,有大量的对象被创建,而没有被gc及时清理,而导致内存不足。


package com.hzqy.web.music.stat.poiutil;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.hzqy.web.music.stat.refutil.GetValueByRef;

/**
 * poi实现excel的生成
 * 
 * @author sd
 * 
 */
public class POIUtil {
	private static final Log LOG = LogFactory.getLog(POIUtil.class);

	public static int start_index = 0;// 写入序号
	public static int start_row = 0;// 从第几列开始写

	
	public static final int RAM_MAX_SIZE = 100;//内存中记录缓存数量

	public static final int BUFF_SIZE = 1024;//字节缓冲数量
	//TODO 建立样式
	public void getStyle(){
		
	}
	
	/**
	 * 初始化excel
	 * 
	 * @param fileName
	 *            excel名称(XXX.xls或者XXX.xlsx)
	 * @param sheetIndex
	 *            第几个sheet
	 * @param title
	 *            报表标题
	 * @param colName
	 *            报表列明
	 * @param widthArr
	 *            报表宽度
	 */
	public static void initExcel(String fileName, int sheetIndex, String title,
			String[] colName, int[] widthArr) {
		if (null == fileName || fileName.equals("")) {
			LOG.error("请传入文件名 ");
			return;
		}
		start_index = 0;// 设置为初始值。不然static的index会一直递增
		start_row = 0;
		int init = 0;
		SXSSFWorkbook  workbook = null;
		OutputStream os = null;
		try {
			workbook = new SXSSFWorkbook(RAM_MAX_SIZE);//内存中保留 10000 条数据,以免内存溢出,其余写入 硬盘  
			CellStyle style = workbook.createCellStyle();
			style.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 垂直居中
			style.setAlignment(XSSFCellStyle.ALIGN_CENTER);// 水平居中
			Font font = workbook.createFont();
			font.setFontHeightInPoints((short) 16);//字体大小
			// 把字体应用到当前的样式
			style.setFont(font);
			LOG.debug("工作环境创建成功");
			Sheet sheet = workbook.createSheet("sheet" + sheetIndex);// 获得要操作的单个sheet
			Row hssrow = sheet.createRow(0);// 创建一行,作为标题
			if (null != title && !title.equals("")) {
				sheet.addMergedRegion(new CellRangeAddress(0, 0, 0,
						colName.length - 1));// 合并单元格
				Cell cell = hssrow.createCell(0);// 创建一个单元格
				cell.setCellStyle(style);// 设置样式
				cell.setCellValue(title);// 写入标题
				init++;
			}
			int col = 0;//  从第几列开始写 //设置单元格宽度
			Row tr_row = sheet.createRow(init);
			if(colName != null){
				for (col = 0; col < colName.length; col++) {
					sheet.setColumnWidth(col, widthArr[col] * 256);// 以256像素为一单位
					Cell cell = tr_row.createCell(col);// 创建一个单元格
					cell.setCellValue(colName[col]);// 写入标题
				}
				init++;
			}
			start_row = init;
			os = new FileOutputStream(fileName,true);
			workbook.write(os);
			LOG.debug("基本excel建立成功");
		} catch (FileNotFoundException e) {
			LOG.error("找不到指定文件:" + fileName);
			e.printStackTrace();
		} catch (IOException e) {
			LOG.debug("io 异常");
			e.printStackTrace();
		} finally {
			if (null != os) {
				try {
					os.close();
				} catch (IOException e) {
					LOG.error("输出流关闭失败");
					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * 将voList 写入 excel
	 * 
	 * @param sheetIndex
	 *            第几个表单
	 * @param objList
	 *            要插入的数据
	 * @param fileName
	 *            操作的excel表
	 * @param fieldArr
	 *            bean 字段
	 */
	public static <T> void writeObjListToExcel(int sheetIndex,final List<T> objList,
			String fileName, String[] fieldArr) {
		if (objList != null && objList.size() > 0) {
			SXSSFWorkbook workbook = null;
			FileInputStream in = null;
			OutputStream os = null;
			XSSFWorkbook xssbook = null;
			try {
				/**
				 * 读取原来写入的文件
				 */
				in = new FileInputStream(fileName);
				xssbook = new XSSFWorkbook(in);
				workbook = new SXSSFWorkbook(xssbook,RAM_MAX_SIZE);// 通过已存在的excel获取workbook
				SXSSFSheet  sheet = (SXSSFSheet) workbook.getSheetAt(sheetIndex);// 获取指定的sheet
				/**
				 * 写入数据
				 */
				for (Object tmp : objList) {
					int col = 0;
					start_index++;
					Row hssrow = sheet.createRow(start_row);
					Cell cellindex = hssrow.createCell(0);// cellindex用来写序号
					cellindex.setCellValue(start_index);// 第一列用来写序号
					col++;
					/**
					 * 通过反射取值,并且写入到excel中
					 */
					for (int i = 0; i < fieldArr.length; i++) {
						String fieldName = fieldArr[i];
						Object value = GetValueByRef.getValueByRef(tmp,
								fieldName);
						String str = null;
						if (value == null) {
							str = "";
						} else {
							str = String.valueOf(value);
						}
						Cell cellvalue = hssrow.createCell(col);// cellvalue用来写字段对应的值
						cellvalue.setCellValue(str);
						col++;
					}
					start_row++;
					if(start_row % RAM_MAX_SIZE ==0){//数据到达内存最缓存最大值,写入到zip中
						sheet.flushRows();//全部写入到硬盘
					}
				}
//				sheet.flushRows();
				os = new FileOutputStream(fileName);
//				System.out.println(os.);
				workbook.write(os);
				LOG.debug("报表写入成功,写入数据 "+start_row+"行");
			} catch (IOException e) {
				LOG.debug("io 异常");
			} finally {
				if (in != null) {
					try {
						in.close();
					} catch (IOException e) {
						LOG.debug(" 读取文件流异常");
						e.printStackTrace();
					}
				}
				if (os != null) {
					try {
						os.close();
					} catch (IOException e) {
						LOG.error("关闭文件流异常");
						e.printStackTrace();
					}
				}
			}

		}
	}

}
poiutil用到的工具类:GetValueByRef



package com.hzqy.web.music.stat.refutil;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import com.hzqy.web.commons.vo.AreaVo;

public class GetValueByRef {
	
	/**
	 * 用反射获取 字段的值
	 * @param srcObj 作用对象
	 * @param fieldName 字段名称
	 * @return
	 */
	
	public static Object getValueByRef(Object srcObj, String fieldName){
		Object value = null;
		Class objClass = srcObj.getClass();
		fieldName =fieldName.replaceFirst(fieldName.substring(0, 1), fieldName.substring(0, 1).toUpperCase()); 
		String getMethodName = "get"+fieldName;
		try {
			Method method = objClass.getMethod(getMethodName);//第一个参数为调用的方法名。第二个为方法的返回值:类型   
			value = method.invoke(srcObj);///第一个参数表示要调用的对象,后者为传给这个方法的参数   
		}  catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		}
		return value;
	}
}


这个问题困扰了我很久,希望os上的朋友们给我一些实现上的思路

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(11

心舞飞扬 2021-11-29 23:09:16

方案1:改代码,直接写xml文件。

方案2:用商业软件。

筱武穆 2021-11-29 23:08:48

内存中最大记录数量我设置了100。 硬盘压缩数据的话,我也尝试了。对Java内存没有多大影响。记录跑到 8万多条的时候还是溢出了。

尐偏执 2021-11-29 23:05:08

回复
分sheet页导入,每页放个3W条试试。我试过导出十几万条没问题的

墨洒年华 2021-11-29 22:21:54

可能是我数据字段有点多,所以生成的XML文档比较大。 我最多只能导8万多条,jvm就溢出了。 我现在改写了代码,分多个sheet,每个sheet写2万条。内存没有溢出,导出速度也快多了。

奈何桥上唱咆哮 2021-11-29 20:50:57

回复
:)

月亮是我掰弯的 2021-11-29 20:33:23

1、

SXSSFWorkbook workbook = new SXSSFWorkbook(1000);//keep 1000 rows in memory, exceeding rows will be flushed to disk
workbook.setCompressTempFiles(true);// temp files will be gzipped        

2、分sheet页导入,每个sheet页面导入指定数量

做个少女永远怀春 2021-11-29 20:25:08

这样的写法我也尝试过,但是代码没有调式成功。可能是因为我用的是jar包和他不同。

疑心病 2021-11-29 18:03:52

http://www.cnblogs.com/jambol/archive/2008/09/11/1288889.html 这个看看有没有用

像你 2021-11-29 09:26:54

他们需求是这么提的,如果确实无法解决这个问题,我再考虑导其他格式的。txt是最快的,csv效率也不错,html格式和excel最接近也可以考虑一下。

柳若烟 2021-11-27 04:43:51

@moyiguke 要不你分次导出,8W条数据分3次添加到Excel文件里面。。

巡山小妖精 2021-11-25 19:14:03

不要输出Excel格式,直接输出生CSV吧~~

一般都能接受的~~

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文