问题
我们经常可以发现,有些excel导出功能在没有加水印的情况下很快就能导出即如果,一旦加了水印之后就会变得非常的慢甚至是会造成内存异常的严重问题。
原因
那这是啥原因造成的呢,通过观察代码我们建议发现加水印的情况下需要开启inMemory内存处理模式才可以成导出加水印的信息,在大数据量导出的同时加上水印会消耗大量的内存,那么我们只要避免开启内存模式就能解决这个问题。
解决方案
我们可以把加水印导出拆分成两个阶段来解决这个问题
第一阶段:生成一个带水印的空数据模版文件,虽然这个阶段是需要开启内存模式,但是因为没有结合数据导出,这个文件可以很快生成而且没有太多的性能消耗
第二阶段:将数据导出导已经生成好的模版文件中,因为模版中已经有水印了,这个阶段就无需开启内存模式,因此速度和性能消耗跟正常的导出基本没啥差别
下面用一个100万条数据导出的示例来比较不加水印导出、正常加水印导出和临时水印模版导出
构造100万的导出数据
- 不加水印导出:
正常加水印导出:
正常加水印导出,不仅耗时长,并且报了内存溢出的异常
临时水印模版导出:
可以看到,耗费的时间与不加水印的导出耗费时间相差无几
这里主要是提供一个解决问题的思路,具体的代码怎么写最好自己去研究研究,这样才会有助于自己的进步。我建议是使用easyexcel工具导出,不管是使用文件模版还是定义Java类模版都可以实现上述的方案,主要的难度是在于怎么生成那个带水印的空数据模版。