xlsx表格怎么打印到一张a4的大小


xlsx表格怎么打印到一张a4的大小  

优质文章,关于Excel导入优化的详解

作者:优化编码者

文章链接:[具体的链接地址](将在后文中给出)

一、需求概述

在项目中有一个需求是Excel导入的功能,涉及到收费记录导入。用户需要填写系统中的Excel模板数据,然后应用将读取数据、进行校验和转换后生成欠费数据、票据和票据详情,并存储到数据库中。由于数据量可能会很大,因此优化导入代码变得非常重要。

二、问题分析

在我接手之前,由于数据量相对较小,所以对效率的追求并未达到极致。但是随着版本的迭代,预计的Excel行数将达到10万级别,而插入数据库的数据量更是超过3倍。优化原来的导入代码是当务之急。我逐步分析了现有的导入代码并找到了以下问题:

1. 数据导入时使用的模板由系统提供,格式为xlsx,支持超过65535行的数据。用户按照表头在对应列写入数据。但是原始版本的代码执行效率非常低,对于个位数的数据尚且可以应对,但对于更大的数据量则存在明显的问题。

2. 数据校验分为两部分:字段长度、字段正则表达式校验等内存内校验,这部分对性能影响较小;数据重复性校验,如票据号是否和系统已存在的票据号重复,这部分需要查询数据库,对性能影响非常大。

3. 数据插入操作原始版本是逐行插入的,而且使用原生POI(Java API for Excel)进行读取,代码冗余且可维护性差。

三、解决方案

针对上述问题,我进行了如下优化措施:

1. 切换Excel读取库:使用更高效的Excel读取库如EasyPOI和阿里EasyExcel替换原生的POI库。这些库通过注解的方式读写Excel,非常方便且代码维护起来容易。特别是阿里EasyExcel在处理大Excel文件时表现出色。

2. 缓存数据库查询操作:对于需要查询数据库的校验操作,将参与校验的数据全部缓存到HashMap中。这样可以直接在HashMap中进行命中查询,大大减少了数据库查询的时间成本。并且针对数据库查询操作,自定义了SessionMapper和MapResultHandler来处理SQL查询结果集。

3. 批量插入数据:使用values ,,的方式一次插入多行数据,结合Java集合和Mybatis的foreach实现批量插入,大大提升了数据插入的速度。同时调整每次插入的行数以及使用并行流进行插入操作,以充分利用硬件资源。

4. 避免在循环中打印日志:在优化过程中发现打印日志对性能影响巨大。因此在非必要的情况下避免在循环中打印过多的日志。

四、迭代记录

在优化过程中,我经历了多个版本的迭代:

第一版:使用原生POI逐行读取、逐行校验、逐行插入,存在明显的性能问题。

第二版:使用EasyPOI结合缓存数据库查询操作和批量插入,对于几千、几万的Excel数据已经可以轻松导入,但耗时较长。

第三版:切换到阿里EasyExcel读取Excel,解决大文件读取OOM和CPU占用问题。

第四版:进一步优化数据插入速度,通过调整每次插入的行数和使用并行流进行插入,大幅提升了导入速度。

五、总结与展望

通过以上的优化措施,我们成功提升了Excel导入的速度。总结起来有以下几点经验:

1. 使用高效的Excel读取库(如阿里EasyExcel)。

2. 对于需要与数据库交互的校验操作,适当使用缓存以空间换时间。

3. 使用values ,, 拼接长SQL一次插入多行数据。

4. 使用多线程插入数据,利用网络IO等待时间。

5. 避免在循环中打印无用的日志。

展望未来,随着业务的发展和数据量的增长,我们还需要持续优化导入性能,以满足用户的需求。我们也计划进一步完善错误处理和用户体验方面的功能,使得导入过程更加稳定和便捷。

  xlsx表格怎么打印到一张a4的大小