[alibaba/easyexcel]SheetUtil.getDefaultCharWidth在web容器启动后第一次执行非常慢

2024-05-11 437 views
2

触发场景描述 springmvc每次第一次启动,调用如下伪代码的demo接口,会非常耗时。第二次调用恢复正常。

触发Bug的伪代码

@RequestMapping("demo")
public void demo(){
            EasyExcel.write(response.getOutputStream())
                    .sheet("Sheet1")
                    .head(headTitles)
                    .doWrite(ListUtil.empty());
}

提示的异常或者没有达到的效果 image

回答

9

建议先去看文档 [快速开始] 触发场景描述 springmvc每次第一次启动,调用如下伪代码的demo接口,会非常耗时。第二次调用恢复正常。

触发Bug的伪代码

@RequestMapping("demo")
public void demo(){
            EasyExcel.write(response.getOutputStream())
                    .sheet("Sheet1")
                    .head(headTitles)
                    .doWrite(ListUtil.empty());
}

提示的异常或者没有达到的效果 image

这个耗时检测的工具是什么老哥?

4

建议先去看文档 [快速开始] 触发场景描述 springmvc每次第一次启动,调用如下伪代码的demo接口,会非常耗时。第二次调用恢复正常。 触发Bug的伪代码

@RequestMapping("demo")
public void demo(){
            EasyExcel.write(response.getOutputStream())
                    .sheet("Sheet1")
                    .head(headTitles)
                    .doWrite(ListUtil.empty());
}

提示的异常或者没有达到的效果 image

这个耗时检测的工具是什么老哥?

jrebel带的xrebel插件

0

这个是poi的功能 真的无解

4

能不能从代码的角度分析一下poi为什么第一次执行非常慢

5

遇到了同样的问题,排查代码后定位到的原因是:

容器启动后第一次执行导出excel文件时,会触发程序装载字体,系统中的字体越多,这个装载的过程就越耗时,装载完成后才会继续执行导出的代码。

环境:

poi-5.2.2.jar jdk 1.8.0_202

具体排查的代码路径为:

image image image image image image image image

因此为了解决第一次导出时加载字体较为耗时的问题,可以在容器启动后,主动调用一次创建字体的过程,将触发字体装载的过程前置。

image

@xuanwoa @WangWei0905 @zhuangjiaju