正如上篇文章(JXL封装不能使用static关键字问题)所说,在jxl导出Excel时候如果频繁使用到WritableCellFormat去设置单元格的样式,这个时候经常会出现两种情况:
1、报警告:Warning: Maximum number of format records exceeded. Using default format.虽然说程序员一般不看警告,but这个警告讨厌了,他会把你超过限制的格式恢复成默认格式。所以必须解决。
2、报异常:java.lang.ArrayIndexOutOfBoundsException: 164
两者出现的场景就不细说了,说说解决方案,直接上代码:
public class OperateExcelUtils { private static WritableCellFormat normalFormat = null; //样式做单例 private static WritableCellFormat getNormalFormat() throws WriteException{ if(normalFormat==null){ normalFormat = new WritableCellFormat();//一般样式 normalFormat.setAlignment(jxl.format.Alignment.CENTRE);// 内容居中(水平+垂直) normalFormat.setVerticalAlignment(VerticalAlignment.CENTRE); normalFormat.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.THIN);// 边框 normalFormat.setLocked(true); return normalFormat; } else { return normalFormat; } } }
如果只做上述处理,多次导出就会出现问题2了,如下处理:
/** * 清除所有样式(workbook操作完成调用) */ public static void clearStaticFormat(){ normalFormat = null; } //主方法 public static void main(String[] args) { try { OutputStream os = new FileOutputStream("E:\\exp.xls"); WritableWorkbook workbook = Workbook.createWorkbook(os); WritableSheet sheet = workbook.createSheet("sheet",0); sheet.addCell(new Label(0, 0, "111", normalFormat)); sheet.getSettings().setProtected(true); workbook.write(); clearStaticFormat(); //workbook操作完成调用 workbook.close(); os.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }