jxl warning: Maximum number of format records exceeded 格式记录数超出最大数限制

来源:互联网 发布:知乎 文案前景 编辑:程序博客网 时间:2024/06/07 10:26

问题描述

采用jxl处理 excel文件生成时,产生如下报错:

Warning:  Maximum number of format records exceeded.  Using default format.Warning:  Maximum number of format records exceeded.  Using default format.Warning:  Maximum number of format records exceeded.  Using default format.

相关代码:

for (int j = 0; j < colNames.length; j++){    // 根据 column format 格式来写入    String format = colFormats[j];    if ( format != null && format.length()>0) {        WritableCellFormat wcf = new WritableCellFormat(new NumberFormat(format)); // 设置数字格式,例如:"#0.00"        BigDecimal val =(BigDecimal) maptemp.get(colNames[j]);        jxl.write.Number labelNF = new jxl.write.Number(j, rowNum, val.doubleValue(), wcf); // 格式化数值        sheet.addCell(labelNF);    } else {        // 否则按照字符串文本格式来处理        sheet.addCell(new Label(j,  rowNum,  StringDateUtil.obj2Str(maptemp.get(colNames[j]))));    }}

在添加单元格时,需要提供相关格式信息。因此,在for循环内部,new了很多WritableCellFormat对象出来,以至于超过jxl内部约束的format records最大数限制。

原因分析

一方面,jxl允许的每个workbook(一个excel文件)中的WritableCellFormat对象个数不超过441个,超过部分的单元格格式会自动丢弃,转而采用默认格式代替,并提示如上所述的warning信息。
相关源码:

//jxl.biff.FormattingRecordsprivate static final int maxFormatRecordsIndex = 0x1b9;

另一方面,其实这些 单元格格式对象(WritableCellFormat对象)是可以复用的,没有必要为每个单元格重复创建如此多的格式对象。

解决方法

通过对需求的分析,我们期望生成的excel表格,不太可能存在超过400多个以上的格式。因此,我们可以将这些格式对象只创建一次,并保存到Map容器里,在使用时,按照format格式,找到相应的对象并使用。

如下是修改后的代码:

HashMap<String, WritableCellFormat> wcfMap = new HashMap<String, WritableCellFormat>();for (int j = 0; j < colNames.length; j++){    // 根据 column format 格式来写入    String format = colFormats[j];    if ( format != null && format.length()>0) {        // WritableCellFormat wcf = new WritableCellFormat(new NumberFormat(format)); // 设置数字格式,例如:"#0.00"        // 这里不需要 new 这么多的 单元格格式对象!        // 只有在format不同时,才创建对象,否则复用已有对象即可!        WritableCellFormat wcf = null;        if (wcfMap.containsKey(format)) {            wcf = wcfMap.get(format);        } else {            wcf = new WritableCellFormat(new NumberFormat(format)); // 设置数字格式,例如:"#0.00"            wcfMap.put(format, wcf);        }        BigDecimal val =(BigDecimal) maptemp.get(colNames[j]);        jxl.write.Number labelNF = new jxl.write.Number(j, rowNum, val.doubleValue(), wcf); // 格式化数值        sheet.addCell(labelNF);    } else {        // 否则按照字符串文本格式来处理        sheet.addCell(new Label(j,  rowNum,  StringDateUtil.obj2Str(maptemp.get(colNames[j]))));    }}

另外,通过网上找到的解决方法,是修改jxl源码包的 最大格式记录数限制:

private static final int maxFormatRecordsIndex = Integer.MAX_VALUE;

这实际上是非常脑残的做法,非常不推荐!

在实际生成excel文件时,需要根据需求,把单元格格式梳理清楚,一共有几种、然后,为每一种格式做一个format标识,这样,只要创建少数的格式对象即可,完全没有必要为每个单元格去单独创建一套格式。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 自热包的水喝了怎么办 火锅发热包不小心吃了怎么办 塑料螺旋饭盒盖子被吸住了怎么办 昨晚喝太多酒今天排尿拍不出怎么办 开光过的貔貅摔坏一点嘴巴怎么办 诺基亚6第二代忘记解屏密码怎么办 工厂搬迁已经般空了工人怎么办 被上司强行换了一个岗位该怎么办 上司要调整我岗位我该怎么办 我被别人打伤了警察不管怎么办 郑州共享汽车小黄车路上坏了怎么办 爱跟别人聊朋友的事怎么办 任职履历上学历写错了怎么办 六个月的宝宝老长婴儿湿疹怎么办 入伍前驾照没考完退伍后过期怎么办 在电脑上玩英雄联盟没有声音怎么办 梦幻西游新区抢不到副本积分怎么办 倒车时遇上机动车碰瓷的怎么办 电瓶车相撞对方全责但不赔偿怎么办 轻微刮蹭逃逸对方想多要钱怎么办 正常开车撞伤了闯红灯的人怎么办 发现小事故要保持现场堵车怎么办 私处刮毛外面皮肤不小心弄伤怎么办 老婆骂孩子不准老公带饿小孩怎么办 结婚3年妻子不让丈夫碰怎么办 老婆出轨现在没证据他要离婚怎么办 结婚后老婆不让碰分房睡离婚怎么办 电动车调速把手变速挡坏了怎么办 路边车辆贴条了超过15天了怎么办 违停交警拍照了没贴条 照片怎么办 支付宝违章缴费罚单输错了怎么办 交警查酒驾跑了把警车撞了怎么办 禁止进入待行区的时候进入了怎么办 今天开车把72岁老太婆撞了怎么办 在这种路口遇到行人突然横穿怎么办 在左拐车道却直行了怎么办 路边简易房让拆除不想拆怎么办 英国护照的名和姓印颠倒了怎么办 加热圈功率小加不到设定温度怎么办 本田飞度05年车尾气不好怎么办 文件在lr中打开后找不到了怎么办