JXL2.6:解决JXL的IndexOutOfBoundsException getSheet问题

JXL2.6修复版本最新下载: http://dl.iteye.com/topics/download/4662fd6c-4dee-3dba-ac12-509ff9323258
特别说明:出现此问题是在和SpringMVC结合出现的,
请见:SpringMVC:生成Excel和PDFhttp://liuzidong.iteye.com/blog/1071823

参考资料
1 jxl java.lang.IndexOutOfBoundsException: Index: 21, Size: 21
http://blog.sina.com.cn/s/blog_5349193d0100mf2h.html
但是没有用呀!可能由于jxl的版本不同中,我用的是: 2.6的
说明:JXL的功能使用正常,但是后台报错,下载它的最新版本也一样,将它的源代码检查,发现少了NULl值的判断
报错如下:
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.get(ArrayList.java:322)
at jxl.write.biff.WritableWorkbookImpl.getSheet(WritableWorkbookImpl.java:382)
at jxl.write.biff.WritableWorkbookImpl.write(WritableWorkbookImpl.java:825)
at org.springframework.web.servlet.view.document.AbstractJExcelView.renderMergedOutputModel(AbstractJExcelView.java:143)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1047)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:595)

修复源码二处
1 在源代码的方法: getSheet()如下
public WritableSheet getSheet(int index){
	
    return (WritableSheet) sheets.get(index);
  }

  修改如下:
 
 public WritableSheet getSheet(int index)
  {
	int size = sheets.size();	
	if(null == sheets || size == 0){
		return null;
	}
    return (WritableSheet) sheets.get(index);
  }

  增加了集合为空的判断
  2 在源代码的方法:write()方法体中:
 
if (!sheetSelected)
    {
      wsheet = (WritableSheetImpl) getSheet(0);
      wsheet.getSettings().setSelected(true);
      selectedSheetIndex = 0;
    }

    修复如下:
   
if (!sheetSelected)
    {
      wsheet = (WritableSheetImpl) getSheet(0);
      if(wsheet != null)
    	  wsheet.getSettings().setSelected(true);
      selectedSheetIndex = 0;
    }

    由于上面报错有二个地方,所以只修改这二个有BUG的方法体.完成后将源代码重新打包为:jexcelapi_2_6_12_1.jar,将它置于WEB-INF/lib下运行OK
请大家下载附件的jexcelapi_2_6_12_1.jar包

你可能感兴趣的:(java,apache,Web,servlet,ITeye)