poi CellStyle 创建不能超过阈值64000,样式不一样的情况解决方案。

poi 报 XSSFCellStyle 对象创建过多,超出阈值,导致异常。
ps:这个问题最开始在网上查了很多资料,都是说把样式的创建提取到循环外面,但是都没有说,提到外面后导致的样式问题,可能他们都是样式固定的,我这边需要设置很多样式(所以不能直接将XSSFCellStyle 对象拿到循环外面创建),也在群里问了很多,也没能解决。
最后看到一篇博文说把 XSSFCellStyle对象存起来,相同的样式就用同一个XSSFCellStyle 对象即可,最后选择了使用map集合来做这样的一个操作,每一个样式都存到map集合,直接通过拼接的key去map集合里去比较,若存在(表示样式完全一样,则用相同的XSSFCellStyle 对象即可)拿到XSSFCellStyle 对象即可,若不存在走样式的创建,然后将这个样式存到map集合
代码如下,这样就解决了 XSSFCellStyle 对象创建最大次数超过阈值异常,代码可以借鉴,可能不能拿来直接用,但是最重要的是这个思路
代码如下:

		// 定义样式map存储 XSSFCellStyle 单元格样式   放在循环外面
		Map<String, XSSFCellStyle> cellStyleMap = new HashMap<>();
		
		for(int index = 0; index < size; index++){
		CellStyle cellStyle = null;
		// 每个单元格样式进行样式进行组装成一个字符串 然后拿到样式map离去比较,若存在则直接在map中拿样式对象,解决样式对象创建最大值报错
        StringBuilder stringBdCompare = new StringBuilder();
        // jsonObjectValue 是样式json对象
        // 样式1  将样式进行拼接
       if (Objects.equals(null, jsonObjectValue.get("样式1"))) {
            stringBdCompare.append("样式1"=null,");
        } else {
            stringBdCompare.append("样式1"=" + jsonObjectValue.get("样式1").toString() + ",");
        }
        // 样式2  将样式进行拼接
         if (Objects.equals(null, jsonObjectValue.get("样式2"))) {
            stringBdCompare.append("样式2"=null,");
        } else {
            stringBdCompare.append("样式2=" + jsonObjectValue.get("样式2").toString() + ",");
        }
       // ......等等一些样式
	   // 判断该单元格样式是否存在map集合中 存在则直接将值付给了 cellStyle  对象
	    if (cellStyleMap.containsKey(stringBdCompare.toString())) {
	        cellStyle = cellStyleMap.get(stringBdCompare.toString());
	    } else {
	    // 这里继续走原来的创建 XSSFCellStyle 的相关逻辑
	    ..........
	    .........
	    ..........
	     // 相同格式的单元格的样式对象
	        cellStyleMap.put(stringBdCompare.toString(),cellStyle);
	    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值