[alibaba/easyexcel]如何根据单元格内容设置不同的样式?

2024-05-17 481 views
0

我是通过实现CellWriteHandler接口,然后重写afterCellDataConverted方法,在方法里根据内容进行样式的设置,但是报错:You can define up to 64000 style in a .xlsx Workbook,请问有更好的实现方法吗

回答

9

已解决,谢谢,感觉你这算是个bug

6

怎么就算是bug了 肯定是你为每一个单元格都 创建了一个样式 那么数据量大的时候自然报错。麻烦你先了解清楚再来提问。 最好的做法就是你自己定义一些固定的样式 单元格需要用到的时候再去给样式 而不是每一个都创建一个

麻烦你搞清楚再bb,它是分段创建对象的,对象不是同一个,重用一个工作区对象,当到第下个阶段的时候,引用就变了,我也是折中的方式解决的。看你主页写得东西也是入门级的,会一点皮毛就在指点江山了?

8

怎么就算是bug了 肯定是你为每一个单元格都 创建了一个样式 那么数据量大的时候自然报错。麻烦你先了解清楚再来提问。 最好的做法就是你自己定义一些固定的样式 单元格需要用到的时候再去给样式 而不是每一个都创建一个

麻烦你搞清楚再bb,它是分段创建对象的,对象不是同一个,重用一个工作区对象,当到第下个阶段的时候,引用就变了,我也是折中的方式解决的。看你主页写得东西也是入门级的,会一点皮毛就在指点江山了?

还有,你牛逼,那你倒是提供解决方案啊,至少我自己能解决问题,单元格要有样式,根据内容动态产生样式,是单元格级别的不是行级别的,还说我没搞清楚,呵呵了

9

怎么处理的,我也遇到这个了

7

怎么处理的,我也遇到这个了

1.创建一个样式策略对象(继承AbstractCellStyleStrategy) 2.定义成员变量Workbook,CellStyle; 3.在initCellStyle方法里判断workbook是否是更新过的,因为这个对象不是单例的; 4.创建单元格样式,判断如果CellStyle变量样式为空,就在initCellStyle方法里赋值; 5.在setContentCellStyle方法中根据内容动态设置成员变量里的样式对象即可。 主要思想是:将样式文件放到成员变量里,但是Workbook并非单例,所以当Workbook对象引用发生改变时,需要给Workbook重新赋值;设置样式的时候,直接用成员变量即可,这样不会大量创建单元格样式对象,也就不会报错了,我这种情况比较特殊,业务上既要有行级样式,又要有单元格样式,我是两个样式叠加的,是折中方案。

5

您好,我也遇到了相关问题,不过我的是动态数据,然后将其中的小计更改样式加粗改背景色,请问您这边有解决思路吗 image

8

您好,我也遇到了相关问题,不过我的是动态数据,然后将其中的小计更改样式加粗改背景色,请问您这边有解决思路吗 image

你这个情况和我这个情况听起来差不多,我那个数据也是动态的,只是你的只需要单元格样式,我那个多了一个行样式,思路可以参考我上面的回复:

“1.创建一个样式策略对象(继承AbstractCellStyleStrategy) 2.定义成员变量Workbook,CellStyle; 3.在initCellStyle方法里判断workbook是否是更新过的,因为这个对象不是单例的; 4.创建单元格样式,判断如果CellStyle变量样式为空,就在initCellStyle方法里赋值; 5.在setContentCellStyle方法中根据内容动态设置成员变量里的样式对象即可。 主要思想是:将样式文件放到成员变量里,但是Workbook并非单例,所以当Workbook对象引用发生改变时,需要给Workbook重新赋值;设置样式的时候,直接用成员变量即可,这样不会大量创建单元格样式对象,也就不会报错了,我这种情况比较特殊,业务上既要有行级样式,又要有单元格样式,我是两个样式叠加的,是折中方案。”

0

您好,我也遇到了相关问题,不过我的是动态数据,然后将其中的小计更改样式加粗改背景色,请问您这边有解决思路吗 图片

你这个情况和我这个情况听起来差不多,我那个数据也是动态的,只是你的只需要单元格样式,我那个多了一个行样式,思路可以参考我上面的回复:

“1.创建一个样式策略对象(继承AbstractCellStyleStrategy) 2.定义成员变量Workbook,CellStyle; 3.在initCellStyle方法里判断workbook是否是更新过的,因为这个对象不是单例的; 4.创建单元格样式,判断如果CellStyle变量样式为空,就在initCellStyle方法里赋值; 5.在setContentCellStyle方法中根据内容动态设置成员变量里的样式对象即可。 主要思想是:将样式文件放到成员变量里,但是Workbook并非单例,所以当Workbook对象引用发生改变时,需要给Workbook重新赋值;设置样式的时候,直接用成员变量即可,这样不会大量创建单元格样式对象,也就不会报错了,我这种情况比较特殊,业务上既要有行级样式,又要有单元格样式,我是两个样式叠加的,是折中方案。”

请问有类似的实现类吗,还是有些没弄清楚(捂脸)

9

您好,我也遇到了相关问题,不过我的是动态数据,然后将其中的小计更改样式加粗改背景色,请问您这边有解决思路吗 图片

你这个情况和我这个情况听起来差不多,我那个数据也是动态的,只是你的只需要单元格样式,我那个多了一个行样式,思路可以参考我上面的回复: “1.创建一个样式策略对象(继承AbstractCellStyleStrategy) 2.定义成员变量Workbook,CellStyle; 3.在initCellStyle方法里判断workbook是否是更新过的,因为这个对象不是单例的; 4.创建单元格样式,判断如果CellStyle变量样式为空,就在initCellStyle方法里赋值; 5.在setContentCellStyle方法中根据内容动态设置成员变量里的样式对象即可。 主要思想是:将样式文件放到成员变量里,但是Workbook并非单例,所以当Workbook对象引用发生改变时,需要给Workbook重新赋值;设置样式的时候,直接用成员变量即可,这样不会大量创建单元格样式对象,也就不会报错了,我这种情况比较特殊,业务上既要有行级样式,又要有单元格样式,我是两个样式叠加的,是折中方案。”

请问有类似的实现类吗,还是有些没弄清楚(捂脸)

public class CustomCellStyleStrategy extends AbstractCellStyleStrategy { / 普通单元格样式/ private CellStyle normalCellStyle; / 已完成单元格样式/ private CellStyle finishedCellStyle; / 未完成单元格样式/ private CellStyle notFinishCellStyle; / 工作簿/ private Workbook workbook; / 表头样式/ private WriteCellStyle headWriteCellStyle; / 表头单元格样式/ private CellStyle headCellStyle;

public CustomCellStyleStrategy(I18NComponent i18NComponent, WriteCellStyle headWriteCellStyle) {
    this.i18NComponent = i18NComponent;
    this.headWriteCellStyle = headWriteCellStyle;
}

/** 初始化单元格样式*/
@Override
protected void initCellStyle(Workbook workbook) {
    if (this.headWriteCellStyle != null) {//--> 设置表头样式
        this.headCellStyle = StyleUtil.buildHeadCellStyle(workbook, this.headWriteCellStyle);
    }
    if (this.workbook != workbook) {//--> 因为此中间件的workbook并非单例,所以当workbook对象更新时,需重新初始化样式
        this.workbook = workbook;
        normalCellStyle = ProgressExcelUtil.createNormalCellStyle(workbook);
        finishedCellStyle = ProgressExcelUtil.createFinishedCellStyleCellStyle(workbook);
        notFinishCellStyle = ProgressExcelUtil.createNotFinishedCellStyleCellStyle(workbook);
    }
    if (null == normalCellStyle) {//--> 初始化普通样式
        normalCellStyle = ProgressExcelUtil.createNormalCellStyle(workbook);
    }
    if (null == finishedCellStyle) {//--> 初始化已完成样式
        finishedCellStyle = ProgressExcelUtil.createFinishedCellStyleCellStyle(workbook);
    }
    if (null == notFinishCellStyle) {//--> 初始化未完成样式
        notFinishCellStyle = ProgressExcelUtil.createNotFinishedCellStyleCellStyle(workbook);
    }
}

/** 设置表头样式*/
@Override
protected void setHeadCellStyle(Cell cell, Head head, Integer relativeRowIndex) {
    if (this.headCellStyle != null) {
        cell.setCellStyle(this.headCellStyle);
    }
}

/** 设置内容单元格样式*/
@Override
protected void setContentCellStyle(Cell cell, Head head, Integer integer) {
    // 设置内容为字符串,否则报:Cannot get a STRING value from a NUMERIC cell
    cell.setCellType(CellType.STRING);
    // 根据单元格内容动态设置样式,注:此方式会大量减少调用createCellStyle,但是并不是釜底抽薪的办法。
    if ("100%".equals(cell.getStringCellValue()) || "已完成".equals(cell.getStringCellValue())) {//--> 绿色背景
        // 设置单元格样式:已完成样式
        cell.setCellStyle(finishedCellStyle);
    } else if ("未开始".equals(cell.getStringCellValue())) {//--> 黄色背景
        // 设置单元格样式:未完成样式
        cell.setCellStyle(notFinishCellStyle);
    } else {
        // 设置单元格样式:普通样式
        cell.setCellStyle(normalCellStyle);
    }
}

}