JXL封装不能使用static关键字问题
最近要做一个Excel导出的功能,由于文件不大,涉及到了很多Excel表格样式和公式计算,我采用了JXL的方式导出。由于逻辑大多是金额,所以我在封装JXL的时候写了两个静态final变量,代码如下:
//数字格式 0.00(始终保留两位小数) public static final NumberFormat ACCFORMAT00 = new NumberFormat("#.00"); //数字格式 0.00(保留两位小数,小数位后0省略) public static final NumberFormat ACCFORMAT = new NumberFormat("#.##");
这两行代码看起来是很正常的,没有任何问题,但是在我导出Excel的时候第一次可以正常导出,以后再次导出就会报错。报错信息如下:
java.lang.ArrayIndexOutOfBoundsException: 164 at jxl.biff.IndexMapping.getNewIndex(IndexMapping.java:68) at jxl.biff.FormattingRecords.rationalize(FormattingRecords.java:385) at jxl.write.biff.WritableWorkbookImpl.rationalize(WritableWorkbookImpl.java:988) at jxl.write.biff.WritableWorkbookImpl.write(WritableWorkbookImpl.java:692) at com.imefuture.nonstandard.web.service.OperateExcelServiceImpl.exportQuoteExcel(OperateExcelServiceImpl.java:1376) at com.imefuture.nonstandard.web.controller.QuotationController.exportQuotationPrice(QuotationController.java:1793) 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:606) at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:440) at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:428) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838) at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
后来在网上查了一下发现问题出在刚才的两个静态变量上,JXL封装时尽量不要使用静态变量,只要在每次用的时候新new一个对象就可以解决这个问题。
问题解决起来好像并不是太复杂但是如果没有百度想要排查这个问题还真是不容易。我去了解了一下这个问题的根源:JXL WritableCellFormat 类在实例化的时候实例数量有限制(找了下源码,没有找到具体限制的位置,网文说大概100个左右)。所以 使用JXL的小伙伴一定要注意。