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,一经查实,立即删除!

相关文章

Navicat Premium 16.2.7 for Mac

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

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

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

自动化驱动程序管理

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

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

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

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、隔离…

C语言插入排序

前言&#xff1a; 本文主要讲解插入排序中的直接插入排序和希尔排序。 1、直接插入排序&#xff1a; 1.1基本思想 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是把待排序的数值按照大小顺序逐个插入到一个已经排好序的有序序列中&#xff0c;直到将所有记录…

Spring Cloud--从零开始搭建微服务基础环境【四】

&#x1f600;前言 本篇博文是关于Spring Cloud–从零开始搭建微服务基础环境【四】&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;…

QT day5

服务器&#xff1a; #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//给服务器指针实例化对象server new QTcpServer(this); }Widget::~Widget() {delete ui…

Java“牵手”京东商品评论数据接口方法,京东商品评论接口,京东商品评价接口,行业数据监测,京东API实现批量商品评论内容数据抓取示例

京东平台商品评论数据接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取京东商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片、评论内容、评论日期、评论图片、追评内容等详细信息 。 获取商品评论接口API是一种用于获取…

el-select 加多选框使用

解决方法&#xff1a; el-select 添加属性 multiple&#xff0c; <el-form-item label"订单来源&#xff1a;"><el-selectv-model"tableFrom.userType"clearablemultipleplaceholder"请选择"class"selWidth"><el-opt…

LeetCode-53-最大子数组和-贪心算法

贪心算法理论基础&#xff1a; 局部最优推全局最优 贪心无套路~ 没有什么规律~ 重点&#xff1a;每个阶段的局部最优是什么&#xff1f; 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#…

开发工具——IDE安装 / IDEA子module依赖导入失败编译提示xx找不到符号 / IDEA在Git提交时卡顿

近期换了工作电脑&#xff0c;公司的IT团队不够给力&#xff0c;不能复制电脑系统&#xff0c;所以又到了需要重装IDE配置开发环境的时候了&#xff1b;在安装和导入Java编译器IDEA的时候遇到一些"棘手"问题&#xff0c;这里整理下解决方法以备不时之需&#xff1b; …

【python爬虫】16.爬虫知识点总结复习

文章目录 前言爬虫总复习工具解析与提取&#xff08;一&#xff09;解析与提取&#xff08;二&#xff09;更厉害的请求存储更多的爬虫更强大的爬虫——框架给爬虫加上翅膀 爬虫进阶路线指引解析与提取 存储数据分析与可视化更多的爬虫更强大的爬虫——框架项目训练 反爬虫应对…

Linux的命令

Linux的命令分为四个类型&#xff1a;文件操作命令、系统操作命令、文本处理命令和网络操作命令。下面简单介绍一下常用的Linux命令&#xff1a; 文件操作命令 ls&#xff1a;列出目录下的所有文件和目录。 cd&#xff1a;切换当前目录。 mkdir&#xff1a;创建一个新目录。…

Linux系统的安装

文章目录 1 Linux介绍1.1 Linux是什么1.2 Linux的特点1.3 Linux的应用1.4 Linux的发行版本1.5 Linux的Shell 2 Linux安装2.1 安装方式2.2 什么是VMware2.3 VMware主要功能2.4 什么是CentOS2.5 VMware与CentOS与Linux的关系2.6 VMware安装CentOS的步骤 1 Linux介绍 1.1 Linux是…