Ant-Design-Pro-V5: ProTable前端导出excel表格。

Prtable表格中根据搜索条件实现excel表格导出。
在这里插入图片描述
代码展示:

index.jsx

import React, { useRef, useState, Fragment, useEffect } from 'react';
import { getLecturerList, lecturerExportExcel } from '@/services/train/personnel';
import { getOrgList, getSelectType } from '@/services/globalServices';
import { PlusOutlined, EditTwoTone, ExportOutlined } from '@ant-design/icons';
import { PageContainer, ProTable, ProFormSelect } from '@ant-design/pro-components';
import { Button, message, Form, Space, Tooltip, Spin } from 'antd';
import { FormattedMessage } from 'umi';const InsideLecturer = () => {const [orgList, setOrgList] = useState([]); // 管理机构const [downloadParams, setDownloadParams] = useState({}); //导出参数const [downloadTotal, setDownloadTotal] = useState({}); //导出数量总数以及页码const [exportExcelLoading, setExportExcelLoading] = useState(false); //导出loadingconst actionRef = useRef(); // 表格组件ProTable refconst [form] = Form.useForm(); // 创建表单const [currentRow, setCurrentRow] = useState(); // 当前行数据const [teacherstateArray, setTeacherstateArray] = useState([]); // 在岗状态const [teacherstateObj, setTeacherstateObj] = useState({}); // 在岗状态const [teacherTypeArray, setTeacherTypeArray] = useState([]); // 讲师类型const [teacherTypeObj, setTeacherTypeObj] = useState({}); // 讲师类型const [idtypeArray, setIdtypeArray] = useState([]); // 证件类型const teacherType = 2; // 内勤讲师类型useEffect(() => {getSelectTypeFun();}, []);const getSelectTypeFun = async () => {await getSelectType('teacherstate').then((res) => {if (res && res.data) {setTeacherstateArray(res.data);let Obj = {};res.data.forEach((item) => {Obj[item.code] = item.codeName;});setTeacherstateObj(Obj);}});await getSelectType('teachertype').then((res) => {if (res && res.data && res.data.length > 0) {let removedArr = res.data.filter((item) => {return item.code != '1' && item.code != '3';});setTeacherTypeArray(removedArr);let Obj = {};removedArr.forEach((item) => {Obj[item.code] = item.codeName;});setTeacherTypeObj(Obj);}});await getSelectType('idnotype').then((res) => {if (res && res.data) {setIdtypeArray(res.data);}});};const fieldNames = {label: 'codeName',value: 'code',};const columns = [{title: '姓名',dataIndex: 'name',},{title: '讲师类别',dataIndex: 'teacherType',valueType: 'select',fieldProps: {options: teacherTypeArray,fieldNames,},},{title: '证件号码',dataIndex: 'idNo',},{title: '工号',dataIndex: 'staffCode',search: false,editable: false,},{title: '讲师状态',dataIndex: 'state',valueType: 'select',fieldProps: {options: teacherstateArray,fieldNames,},},{title: '移动电话',dataIndex: 'mobile',search: false,width: 150,},{title: <FormattedMessage id="pages.searchTable.titleOption" />,dataIndex: 'option',valueType: 'option',width: 100,render: (_, record) => [<div key={record.staffCode}><Fragment><aonClick={() => {setCurrentRow(record);}}><EditTwoTone /><FormattedMessage id="pages.searchTable.edit" /></a><span style={{ marginRight: '10px' }}></span></Fragment></div>,],},];return (<Spin spinning={exportExcelLoading} tip="数据导出中..."><PageContainer breadcrumb={false}><ProTableheaderTitle="查询列表"rowKey={'staffCode'}actionRef={actionRef}options={false}search={{labelWidth: 120,}}params={{teacherType: 2,}}pagination={{pageSize: 10,}}tableAlertOptionRender={() => {return false;}}toolBarRender={() => [<Tooltip placement="topLeft" title="点击导出内容"><Buttontype="default"key="export"loading={exportExcelLoading}onClick={() => {lecturerExportExcel({downloadTotal,downloadParams,orgObj2,teacherstateObj,teacherType,teacherTypeObj,setExportExcelLoading,});}}><ExportOutlined /> 导出数据</Button></Tooltip>,]}revalidateOnFocus={false}onSubmit={(params) => {// 导出参数设置setDownloadParams(params);}}onReset={() => setDownloadParams(undefined)}request={(params) => {const res = getLecturerList({ ...params });res.then((value) => {// 设置导出总数以及页码setDownloadTotal({current: 1,pageSize: value?.total || 100000,});});return res;}}columns={columns}/></PageContainer></Spin>);
};export default InsideLecturer;

数据字典格式返回:
在这里插入图片描述
以 teacherTypeObj 为例 向services.js中 lecturerExportExcel 方法中传入的格式为:
在这里插入图片描述

services.js中 lecturerExportExcel 导出方法:

import { request } from 'umi';
import { paramsFilter } from '../../utils/utils';
import ExportJsonExcel from 'js-export-excel';
import { message } from 'antd';export async function lecturerExportExcel(params) {const { downloadTotal, downloadParams, orgObj2, teacherstateObj, teacherType, teacherTypeObj, setExportExcelLoading } = params;setExportExcelLoading(true);// 参数合并let newParams = Object.assign(downloadTotal, downloadParams);newParams.teacherType = teacherType;const result = await request('/api/Info/list2', {params: paramsFilter(newParams),});// 根据实际情况注释不需要导出的字段const allowExportColumns = ['manageCom','name','staffCode','idNo','mobile',"state","teacherType"];const TableItemObject = {manageCom: "管理机构",name: "姓名",staffCode: "工号",idNo: "证件号码",mobile: "移动电话",state: "讲师状态",teacherType: '讲师类别'};const cnColumns = allowExportColumns.map(kk => TableItemObject[kk]);if (Array.isArray(result?.data) && result?.data.length > 0) {const tableData = [];result?.data.forEach((item) => {const kv = {};Object.keys(item).map(vv => {if (allowExportColumns.includes(vv)) {// 数据字典字段汉化if (vv === 'manageCom') {kv[TableItemObject[vv]] = orgObj2[item[vv]] || '';} else if (vv === 'state') {kv[TableItemObject[vv]] = teacherstateObj[item[vv]] || '';} else if (vv === 'teacherType') {kv[TableItemObject[vv]] = teacherTypeObj[item[vv]] || '';} else {// 不用汉化直接输出kv[TableItemObject[vv]] = item[vv];}}})tableData.push(kv);});const option = {fileName: "讲师信息",datas: [{sheetData: tableData,// 数据sheetName: 'sheet1',sheetFilter: cnColumns,// 表头sheetHeader: cnColumns,// 表头}]}const toExcel = new ExportJsonExcel(option);toExcel.saveExcel();setExportExcelLoading(false);return true;}message.error('数据为空!');setExportExcelLoading(false);return false;
}

utils 中 paramsFilter 方法:过滤无用参数

// 接口请求参数中 删除对象中值为空或null或undefined或者为空的所有属性
export function paramsFilter(requestParams) {let newParams = Object.keys(requestParams).filter((key) => requestParams[key] !== null && requestParams[key] !== undefined && requestParams[key] !== '').reduce((acc, key) => ({ ...acc, [key]: requestParams[key] }), {});return newParams;
}

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

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

相关文章

服务器性能指什么如何优化

服务器性能指什么如何优化 性能最通俗的衡量指标就是“时间”&#xff0c;CPU的使用率指的是CPU用于计算的时间占比&#xff0c;磁盘使用率指的是磁盘操作的时间占比。 当CPU使用率100%时&#xff0c;意味着有部分请求来不及计算&#xff0c;响应时间增加或者超时&#xff1b…

Navicat Premium 16.2.7 for Mac

Navicat Premium 16是一款功能强大的跨平台数据库管理工具&#xff0c;支持多种数据库类型&#xff0c;如MySQL、MariaDB、Oracle、SQLite、PostgreSQL等等。它提供了丰富的数据库管理功能和工具&#xff0c;可以帮助开发人员和数据库管理员快速地创建、管理和维护数据库。 Nav…

VS Code 快速消除前置空格和常用快捷键

目录 介绍&#xff1a; 消除前置空格&#xff1a;SHIFTTAB 常用的 VS Code 快捷键 介绍&#xff1a; 在使用 Visual Studio Code (VS Code) 进行代码编辑时&#xff0c;熟练掌握一些快捷键和编辑技巧可以大幅提高开发效率。本文将重点介绍如何使用快捷键 SHIFTTAB 快速消除代…

【Vue3 知识第七讲】reactive、shallowReactive、toRef、toRefs 等系列方法应用与对比

文章目录 一、reactive()二、readonly()三、shallowReactive()四、shallowReadonly()五、isReactive() 和 isReadonly()六、toRef()七、toRefs()八、toRaw()九、ref、toRef、toRefs 异同点 一、reactive() reactive() 函数用于返回一个对象的响应式代理。与 ref() 函数定义响应…

Vue2 与Vue3的区别?面试题

Vue 2和Vue 3是Vue.js框架的不同版本&#xff0c;在面试中经常涉及到它们之间的区别。以下是Vue 2和Vue 3的主要区别&#xff1a; 性能提升&#xff1a;Vue 3在性能方面进行了优化。Vue 3引入了更高效的Diff算法&#xff0c;提高了渲染性能。此外&#xff0c;Vue 3还进行了代码…

stable diffusion实践操作-大模型介绍

本文专门开一节写大模型相关的内容&#xff0c;在看之前&#xff0c;可以同步关注&#xff1a; stable diffusion实践操作 模型下载网站 国内的是&#xff1a;https://www.liblibai.com 国外的是&#xff1a;https://civitai.com&#xff08;科学上网&#xff09; 一、发展历…

自动化驱动程序管理

在部署操作系统时&#xff0c;每次都从下载和分发所需的驱动程序中实现真正的独立性可能是一场艰苦的战斗。特别是具有硬件多样化的环境&#xff0c;并且需要支持新的硬件类型时。借助 OS Deployer&#xff0c;可以对所有端点使用一个映像&#xff0c;无论品牌和型号如何&#…

SpringBoot项目--电脑商城【用户登录】

1. 用户登录功能 先分析一下思路:当用户输入用户名和密码将数据提交给后台数据库进行查询,如果存在对应的用户名和密码则表示登录成功,登录成功之后跳转到系统的主页就是index.html页面,跳转在前端使用jQuery来完成 2.持久层[Mapper] 规划需要执行的SQL语句 依据用户提交的用…

Android-Broadcast动态注册

广播的动作分别为&#xff1a;注册、发送、接收。 1. 定义接收器 public class MyReceiver extends BroadcastReceiver {Overridepublic void onReceive(Context context, Intent intent) {} } 2. 注册广播 final MyReceiver[] receivers {null};Button registerBroad fi…

【用unity实现100个游戏之7】从零开始制作一个仿杀戮尖塔卡牌回合制游戏

文章目录 前言素材资源开始一、UI框架二、挂载脚本三、事件监听&#xff0c;用于绑定按钮事件四、声音管理器五、excel转txt文本六、游戏配置七、用户信息表八、战斗管理器九、 敌人管理器十、玩家血量、能量、防御值、卡牌数十一、敌人血量 行动显示逻辑十二、UI提示效果实现十…

最新基于MATLAB 2023a的机器学习、深度学习教程

详情点击链接&#xff1a;最新基于MATLAB 2023a的机器学习、深度学习教程 前沿 MATLAB 2023版的深度学习工具箱&#xff0c;提供了完整的工具链&#xff0c;能够在一个集成的环境中进行深度学习的建模、训练和部署。与Python相比&#xff0c;MATLAB的语法简洁、易于上手&#…

vue 获取当前日期所属月的第一天和最后一天的日期

学习目标&#xff1a; 学习目标 - [ ] vue 获取当前日期所属月的第一天和最后一天的日期 学习内容&#xff1a; 学习内容如下所示&#xff1a; 1. 使用 JavaScript 的 Date 对象来获取当前日期所属月的第一天和最后一天的日期 // 获取当前日期 const today new Date();//…

第四篇 DirectShow 采集调用结构关系

第一篇: DirectShow视频采集_会头痛的可达鸭的博客-CSDN博客 一、GraphBuilder 1、IFilterGraph2、IGraphBuilder、ICaptureGraphBuiler2 (1)、CLSID IFilterGraph CLSID_FilterGraphIFilterGraph2 CLSID_CaptureGraphBuilderIGraphBuilder CL…

零碎的C++

构造函数和析构函数 构造函数不能是虚函数&#xff0c;而析构函数可以是虚函数。原因如下&#xff1a; 构造函数不能是虚函数&#xff0c;因为在执行构造函数时&#xff0c;对象还没有完全创建&#xff0c;还没有分配内存空间&#xff0c;也没有初始化虚函数表指针。如果构造…

Jetsonnano B01 笔记1:基础理解—网络配置—远程连接

今日开始学习 Jetsonnano B01&#xff0c;这是一台小电脑&#xff0c;可以用来&#xff1a; 运行现代 AI 负载&#xff0c;并行运行多个神经网络&#xff0c;以及同时处理来自多个高清传感器的数据&#xff0c;可广泛应用与图像分类、对象检测、图像分割、语音处 理等领域。它…

【python爬虫】15.Scrapy框架实战(热门职位爬取)

文章目录 前言明确目标分析过程企业排行榜的公司信息公司详情页面的招聘信息 代码实现创建项目定义item 创建和编写爬虫文件存储文件修改设置 代码实操总结 前言 上一关&#xff0c;我们学习了Scrapy框架&#xff0c;知道了Scrapy爬虫公司的结构和工作原理。 在Scrapy爬虫公司…

配置本地maven

安装maven安装包 修改环境变量 vim ~/.bash_profile export JMETER_HOME/Users/yyyyjinying/apache-jmeter-5.4.1 export GOROOT/usr/local/go export GOPATH/Users/yyyyjinying/demo-file/git/backend/go export GROOVY_HOME/Users/yyyyjinying/sortware/groovy-4.0.14 exp…

手写Mybatis:第10章-使用策略模式,调用参数处理器

文章目录 一、目标&#xff1a;参数处理器二、设计&#xff1a;参数处理器三、实现&#xff1a;参数处理器3.1 工程结构3.2 参数处理器关系图3.3 入参数校准3.4 参数策略处理器3.4.1 JDBC枚举类型修改3.4.2 类型处理器接口3.4.3 模板模式&#xff1a;类型处理器抽象基类3.4.4 类…

linux 进程隔离Namespace 学习

一、linux namespace 介绍 1.1、概念 Linux Namespace是Linux内核提供的一种机制&#xff0c;它用于隔离不同进程的资源视图&#xff0c;使得每个进程都拥有独立的资源空间&#xff0c;从而实现进程之间的隔离和资源管理。 Linux Namespace的设计目标是为了解决多个进程之间…

微服务设计和高并发实践

文章目录 1、微服务的设计原则1.1、服务拆分方法1.2、微服务的设计原则1.3、微服务架构 2、高并发系统的一些优化经验2.1、提高性能2.1.1、数据库优化2.1.2、使用缓存2.1.3、服务调用优化2.1.4、动静分离2.1.5、数据库读写分离 2.2、服务高可用2.2.1、限流和服务降级2.2.2、隔离…