asyncexcel按类型分sheet导出相同数据

news2024/9/21 5:45:25

需求背景

看标题又是一个变态的需求,但是实际业务场景中确实存在。

既然有需求那我们就得支持。
那么这种场景下如何使用asyncexcel进行异步导出呢?

在之前的文章中我们已经实现了分sheet导出不同业务的数据了
那么此时的场景似乎也差不多,对业务代码稍微改动下即可

案例描述

我们将操作日志按不同操作人分sheet导出

示例代码

注入excelService

    @Autowired
    ExcelService excelService;

controller代码

@RequestMapping("/dynamicSheetExports")
    public Long dynamicSheetExports() {
        DataExportParam<Oplog> param = new DataExportParam<>();
        param.setExportFileName("导出测试");
        //分页查询每次2条
        param.setLimit(2);
        Deque<String> conditionList=new ArrayDeque<>();
        //此处可以对数据进行group by 之后获取到按sheet对相同数据分类的sheet页条件
        //示例中以op_user为条件
        conditionList.add("test");
        conditionList.add("xxx");
        conditionList.add("bbb");

        Map<String,Object> map =new HashMap<>();

        map.put("queue",conditionList);
        //将参数设置给param;
        param.setParameters(map);
        //根据group 条件 放入多少个handler
        Class[] handlerClass = new Class[conditionList.size()];
        for (int i = 0; i < conditionList.size(); i++) {
            handlerClass[i]=OplogExportHandle.class;
        }

        //多个sheet导出时,行数计算为所有sheet的总行数,顺序为传入数据组的顺序
        Long taskId = excelService.doExport(param,handlerClass);

        return taskId;
    }

handler代码

@ExcelHandle
public class OplogExportHandle implements ExportHandler<OplogExportModel> {
    
    @Autowired
    IOplogService oplogService;
    
    @Override
    public void init(ExcelContext context, DataParam param) {

        Map<String, Object> parameters = param.getParameters();
        Deque queue = (Deque)parameters.get("queue");
        String condition = (String)queue.pollFirst();
        parameters.put("condition",condition);
        ExportContext ctx = (ExportContext) context;
        //此处的sheetNo会被覆盖,为了兼容多sheet
        WriteSheet sheet = EasyExcel.writerSheet(0, condition).head(OplogExportModel.class).build();
        ctx.setWriteSheet(sheet);
    }
    
    @Override
    public void beforePerPage(ExportContext ctx, DataExportParam param) {
        //啥也没有
    }
    
    @Override
    public ExportPage<OplogExportModel> exportData(int startPage, int limit, DataExportParam param) {
        IPage<Oplog> iPage = new Page<>(startPage, limit);
    
        LambdaQueryWrapper<Oplog> queryWrapper = new LambdaQueryWrapper<>();
        Map<String, Object> parameters = param.getParameters();
        String condition = (String)parameters.get("condition");
        queryWrapper.eq(Oplog::getOpUser, condition);
        IPage page = oplogService.page(iPage, queryWrapper);
        List<OplogExportModel> list = ExportListUtil.transform(page.getRecords(), OplogExportModel.class);
        ExportPage<OplogExportModel> result = new ExportPage<>();
        result.setTotal(page.getTotal());
        result.setCurrent(page.getCurrent());
        result.setSize(page.getSize());
        result.setRecords(list);
        return result;
    }
}

过程描述

1、在controller中先查询要分多少个sheet,这里可以使用group by从数据库统计出来有多少种类型,然后将不同维度作为条件分割sheet数据,放到一个队列中,并将队列丢给入参map。

2、然后再handler中一个个弹出队列,作为一个维度,对应一个handler。当一个sheet执行完成后,执行下一个sheet ,需要重新声明一个sheet替换掉上下文中的sheet。

效果展示

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/343570.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python open()函数详解:打开指定文件

在 Python 中&#xff0c;如果想要操作文件&#xff0c;首先需要创建或者打开指定的文件&#xff0c;并创建一个文件对象&#xff0c;而这些工作可以通过内置的 open() 函数实现。open() 函数用于创建或打开指定文件&#xff0c;该函数的常用语法格式如下&#xff1a;file ope…

git日常使用命令

实习这段时间使用了很多git指令来提交代码&#xff0c;简单记录一下日常使用的指令&#xff1a; 提交代码通常顺序&#xff1a; 1.git status 查看本地修改项 2.git add . 提交全部文件 &#xff08;这个 .是全部文件&#xff09;到暂存区 3.git commit -m ‘本次提交的说明’…

HTTPS基础原理和配置 - 1

近期又碰到了SSL相关的事情, 就心血来潮开个新专题 - 《HTTPS基础原理和配置》 本文是第一篇文章&#xff0c; 主要介绍SSL TLS加密协议的相关内容。 加密协议历史概要 SSL TLS加密协议其实并没有很长的历史&#xff0c;1995年网景发布了SSL v2.0&#xff0c;这也是web加密的开…

2023年,游戏行业将迎来两大重磅级盛会,释放哪些信号?

随着全球大流行的转变&#xff0c;各行业对于未来的预测也在不断调整&#xff0c;以便快速跟进&#xff0c;抢占先机&#xff0c;游戏行业也是如此。 2023年2月&#xff0c;将有两个重磅级的游戏产业盛会召开。 据中国音数协游戏工委官微消息&#xff0c;由中国音像与数字出版…

使用Autowired为什么会被IDEA警告,应该怎么修改最佳

问题原因 关于这个问题&#xff0c;其实答案相对统一&#xff0c;实际上用大白话说起来也容易理解。 初始化问题 先看一下Java初始化类的顺序&#xff1a;父类的静态字段 > 父类静态代码块 > 子类静态字段 > 子类静态代码块 > 父类成员变量 > 父类构造代码块 &…

python基于django+vue偏远地区教师支教系统

角色&#xff1a;老师、学校、管理员 前台应包括&#xff1a;首页、支教岗位、志愿老师、老师分享、公告信息、平台简介、个人中心 1、首页&#xff1a;把导航条上的支教岗位、志愿老师、老师分享、公告信息显示并能点击查看。 2、支教岗位&#xff0c;根据不同类别岗位需求选择…

网络安全-PHPstudy环境搭建

网络安全-PHPstudy环境搭建 网络搭建我是专家&#xff0c;安全我懂的不多&#xff0c;所以可能很基础。。因为我自己都不懂&#xff0c;都是跟着课程学的 PHPstudy 这个东东是一个在windwos下可以快速部署的web开发环境&#xff0c;安装了就能用&#xff0c;也支持iis和ngin…

MySQL入门篇-MySQL表连接小结

备注:测试数据库版本为MySQL 8.0 这个blog我们来聊聊常见的表连接的方法 测试数据: create table t1(id int); create table t2(id int);insert into t1 values(1); insert into t1 values(2);insert into t2 values(2); insert into t2 values(3); commit;内连接 --求交集 …

【C++】—— I/O流

目录 一、C语言的输入输出 二、流是什么 三、CIO流 1. C标准IO流 2. C文件IO流 1. 文件操作步骤 2. 以二进制的形式操作文件 3. 使用>>和<<对文件进行操作 四、stringstream的介绍 一、C语言的输入输出 C语言中我们用到的最频繁的输入输出方式就是scanf …

使用burpsuite抓包 + sql工具注入 dvwa靶场

使用burpsuite抓包 sql工具注入 dvwa靶场 记录一下自己重新开始学习web安全之路②。 一、准备工作 1.工具准备 sqlmap burpsuite 2.浏览器准备 火狐浏览器 设置代理。 首先&#xff0c;先设置一下火狐浏览器的代理 http代理地址为127.0.0.0.1 &#xff0c;端口为8080 …

《Learning to Reconstruct Botanical Trees from Single Images》学习从单幅图像重建植物树

读书报告下载https://download.csdn.net/download/weixin_43042683/87448211论文原文https://dl.acm.org/doi/10.1145/3478513.3480525论文视频https://www.bilibili.com/video/BV1cb4y127Vp/?fromseopage&vd_source5212838c127b01db69dcc8b2d27ca5171引言植物存在在室外与…

深度理解机器学习16-门控循环单元

评估简单循环神经网络的缺点。 描述门控循环单元&#xff08;Gated Recurrent Unit&#xff0c;GRU&#xff09;的架构。 使用GRU进行情绪分析。 将GRU应用于文本生成。 基本RNN通常由输入层、输出层和几个互连的隐藏层组成。最简单的RNN有一个缺点&#xff0c;那就是它们不…

【开发环境配置】--Python3的安装

1-开发环境配置 工欲善其事&#xff0c;必先利其器&#xff01; 编写和运行程序之前&#xff0c;我们必须先把开发环境配置好。只有配置好了环境并且有了更方便的开发工具&#xff0c;我们才能更加高效地用程序实现相应的功能。然而很多情况下&#xff0c;我们可能在最开始就…

谢希仁版《计算机网络》期末总复习【完结】

文章目录说明第一章 计算机网络概述计算机网络和互联网网络边缘网络核心分组交换网的性能网络体系结构控制平面和数据平面第二章 IP地址分类编址子网划分无分类编址特殊用途的IP地址IP地址规划和分配第三章 应用层应用层协议原理万维网【URL / HTML / HTTP】域名系统DNS动态主机…

.Net Core对于RabbitMQ封装分布式事件总线

首先我们需要了解到分布式事件总线是什么&#xff1b; 分布式事件总线是一种在分布式系统中提供事件通知、订阅和发布机制的技术。它允许多个组件或微服务之间的协作和通信&#xff0c;而无需直接耦合或了解彼此的实现细节。通过事件总线&#xff0c;组件或微服务可以通过发布…

深入浅出C语言——数据在内存中的存储

文章目录一、数据类型详细介绍1. C语言中的内置类型2. 类型的基本归类&#xff1a;二. 整形在内存中的存储1. 原码、反码、补码2. 大小端三.浮点数存储规则一、数据类型详细介绍 1. C语言中的内置类型 C语言的内置类型有char、short、int、long、long long、float、double&…

第四章.误差反向传播法—误差反向传播法实现手写数字识别神经网络

第四章.误差反向传播法 4.3 误差反向传播法实现手写数字识别神经网络 通过像组装乐高积木一样组装第四章中实现的层&#xff0c;来构建神经网络。 1.神经网络学习全貌图 1).前提&#xff1a; 神经网络存在合适的权重和偏置&#xff0c;调整权重和偏置以便拟合训练数据的过程称…

2023年1月洗衣机品牌销量排行:总销售额近30亿,海尔品牌领跑

鲸参谋电商大数据2023年1月京东平台“洗衣机”品类完整销售数据出炉&#xff01; 根据鲸参谋电商数据显示&#xff0c;2023年1月在京东平台上&#xff0c;洗衣机的销量为174.5万&#xff0c;相较于2022年12月&#xff0c;环比上涨了5.1%&#xff0c;但相较于去年同期&#xff0…

C语言学习笔记(七): 指针的使用

指针变量 指针是一种特殊的变量&#xff0c;它存储的是某个变量的内存地址。指针变量可以存储内存地址&#xff0c;并且通过指针变量可以间接操作内存中的数据 include <stdio.h> int main() {int a1, * p; //定义指针变量,*是指针运算符p &a; //把a的地…

线段树--RMQ问题

线段树由来算法讲解分析树的数据结构结点四个基本操作例题天才的记忆最大数由来 线段树是RMQ区间最值问题的一种解题方法&#xff0c;在给出的区间是静态不变的时候&#xff0c;可以使用ST算法进行离线查询某个区间的最值&#xff0c;先预处理后进行m次查询&#xff0c;时间复…