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. 避免在循环中打印无用的日志。
展望未来,随着业务的发展和数据量的增长,我们还需要持续优化导入性能,以满足用户的需求。我们也计划进一步完善错误处理和用户体验方面的功能,使得导入过程更加稳定和便捷。
