首页 > 其他分享 >EasyExcel合并行处理并优化

EasyExcel合并行处理并优化

时间:2024-03-08 23:33:23浏览次数:21  
标签:Map map 并行处理 EasyExcel 合并 static key 优化 public

业务场景

由于业务需要导出如下图中订单数据和订单项信息,而一个订单对应多个订单项,所以会涉及到自定义合并行

 


1.简单处理
项目使用的EasyExcel,经查找发现Excel种有个AbstractMergeStrategy抽象类,可以用于合并单元格。
于是先简单的写一个工具类实现根据数据自定义合并单元行,基本思路是获取当前单元格内容和上一行的单元格内容比对,如果相同则添加合并区域,如果不同则不处理,如果上一个单元格在合并区域中,则先移除合并区域再将当前单元格添加到合并区域中。

 

 

2.优化数据显示
第一个版本上线后财务反馈数据有问题。如图,求和数值实际应该是45,但是显示为90,导致财务不好对账

z

经排查发现图中C3、C5单元格虽然已经合并了,但是数据仍然存在,导致下拉选中的时候将他们的值也计算进去了。于是在1.0的基础上调整,将合并单元格仅保留首行数据,其他行内容直接清空

 

 


3.优化合并策略
第二版上线后数据问题已经解决,但是财务反馈导出大量数据时太慢。本来打算调整为异步导出解决此问题,但是经过测试发现10000条数据如果不合并直接生成excel只要几秒,但是使用合并自定义合并策略就非常慢,需要一二十分钟,这个时间差大的太离谱了,于是查看合并策略代码有哪些地方可以优化的。
经过查看代码可以发现在上述2.1步骤中一直查找合并单元格数据,然后一直删除再新增。假设10000条数据,有3列需要自动合并,每三行合并,执行以上代码会执行6666✖️3次新增和3333✖️3次删除,大大的影响了效率。于是调整代码,处理数据时只保存需要合并的单元格信息,导出完成再统一添加合并信息到sheet

 

 

 

经过测试,原本生成文件需要20分钟左右,现优化到只需要20多秒了。

工具类

 


/**
* excel线程上下文.
*
*/
public class ExcelThreadContext {

private static final ThreadLocal<Map<String, Object>> THREAD_LOCAL = ThreadLocal.withInitial(HashMap::new);

public static void clear() {
THREAD_LOCAL.remove();
}

public static void setData(String key, Object value) {
Map<String, Object> map = get();
map.put(key, value);
}

public static Integer getInteger(String key) {
return getInteger(key, 1);
}

public static Integer getInteger(String key, Integer defaultValue) {
Map<String, Object> map = get();
return Convert.toInt(map.get(key), defaultValue);
}

public static <K, V> Map<K, V> getMap(String key) {
return getMap(key, new HashMap<>());
}

public static <K, V> Map<K, V> getMap(String key, Map<K, V> defaultValue) {
Map<String, Object> map = get();
try {
return (Map<K, V>) map.getOrDefault(key, defaultValue);
} catch (Exception e) {
return defaultValue;
}
}

public static <T> T getObject(String key) {
return getObject(key, null);
}

public static <T> T getObject(String key, T defaultValue) {
Map<String, Object> map = get();
try {
return (T) map.getOrDefault(key, defaultValue);
} catch (Exception e) {
return defaultValue;
}
}

private static void set(Map<String, Object> map) {
THREAD_LOCAL.set(map);
}

public static Map<String, Object> get() {
return THREAD_LOCAL.get();
}
}

 

因为数据是存储在线程中的,需要每次使用后清理线程数据

 

 

标签:Map,map,并行处理,EasyExcel,合并,static,key,优化,public
From: https://www.cnblogs.com/yelanggu/p/18062077

相关文章

  • spfa优化
    \(spfa\)的优化都是基于\(deque\)的,我们通常使用\(LLL\)优化,代码简单,优化效果最好,详情可见参考这里,例题可以参考这里1.\(LLL\)优化(入队优化)LargeLabelLast优化:思路就是将\(dist\)更大的点放入队尾,将\(dist\)更小的点放入队头,优先使用\(dist\)更小的点进行松弛操......
  • 使用Web Vitals针对性的优化前端LCP指标
    1、安装WebVitals浏览器插件2、打开设置3、勾选打印日志 4、打开浏览器控制台即可查看需要优化的点5、LCP耗时的构成部分"LCPsub-part":"TimetoFirstByte""Time(ms)":39这个部分时间表示服务器的首个字节到达所花费的时间。这是指从浏览器发出请求到服务......
  • MySQL查询优化方案汇总(索引相关)
    索引相关类型隐式转换大坑**字段filed1是varchar类型,且加了索引,如果wherefiled1=123;type可能是all,因为123是数字类型,mysql内部会用函数做隐式转换,用了函数,索引就失效了。**大数据深度分页,用主键selectfield1,field2fromtablelimit100000,10;selectfield1,fiel......
  • Unity3D 多人战场Animation优化详解
    在多人战场游戏中,动画的优化是非常重要的,因为动画是游戏中的核心元素之一,直接影响玩家的游戏体验。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。在本文中,我们将详细介绍如何在Unity3D中优化多人战......
  • 聊聊懒加载以及优化方案
    我们是袋鼠云数栈UED团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。本文作者:霁明什么是懒加载(lazyloading)懒加载是一种将资源标识为非阻塞(非关键)资源并仅在需要时加载它们的策略。这是一种缩短关键渲染路径长度......
  • 常见性能优化方案与实用工具
    微信工程师:常见性能优化方案与实用工具https://mp.weixin.qq.com/s/glrqsyBSIVCDp7oZw2rO_w......
  • Unity3D 多人战场Animation优化详解
    在多人战场游戏中,动画的优化是非常重要的,因为动画是游戏中的核心元素之一,直接影响玩家的游戏体验。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。在本文中,我们将详细介绍如何在Unity3D中优化多人战......
  • clang在指定-O2时对函数局部变量的优化
    在我们将编译器从g++迁移到clang++的过程中,遇到一个问题,有个工具程序只要一运行就会出现coredump问题,并且用gdb调试core文件也无法获得任何有用的堆栈信息。通过不断尝试,发现只有在clang++使用-O2编译时得到的程序才会发生这个问题,使用clang++-O0或者g++编译时不会发生问题。......
  • bitset 相关优化
    bitset基础用法operator[]:访问其特定的一位。operator==/!=:比较两个bitset内容是否完全一样。operator&/&=/|/|=/^/^=/~:进行按位与/或/异或/取反操作。bitset只能与bitset进行位运算,若要和整型进行位运算,要先将整型转换为bitset。operator<>/<<=/>>=:进行......
  • springboot3+vue3(四.2)ThreadLocal优化
    解决痛点:我们在拦截器内已经获取并解析了一遍token数据,如图:然后在获取当前登录用户详细信息时又做了一遍同样的操作,如图:后续如果说需要用到当前登录用户的信息时都要带上token参数,这样是很冗余的。这时就会用到ThreadLocal来进行优化处理。 ThreadLocal工具类/***......