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);
}
}