XLSX插件使用 — 导入导出(含中文表头)(React+Antd 对上传表格做数据格式验证)

news2025/3/13 15:03:23

需求说明

1.需要前端做数据导出(非调用接口)
2.需要对上传的表格数据做验证,不通过验证需要提示格式不正确,阻拦上传

技术栈介绍

React+Antdesign+XLSX

js-xlsx 介绍

SheetJS出品的js-xlsx是一款非常方便的只需要纯JS即可读取和导出excel的工具库,功能强大,支持格式众多,支持xls、xlsx、ods(一种OpenOffice专有表格文件格式)等十几种格式。

GitHub地址:https://github.com/SheetJS/sheetjs

官网地址:https://sheetjs.com/

React使用文档:https://docs.sheetjs.com/docs/demos/frontend/react

导出的简单使用

首先插件的几个重要的名词对应如下图

在这里插入图片描述

根据数据类型,写法可分为

  1. 纯数组

    /**
     * 导出 excel 文件
     * @param array JSON 数组
     * @param sheetName 第一张表名
     * @param fileName 文件名
     */
    export function exportExcelFile(array: any[], sheetName = '表1', fileName = 'example.xlsx') {
      const jsonWorkSheet = xlsx.utils.json_to_sheet(array);
      const workBook: WorkBook = {
        SheetNames: [sheetName],
        Sheets: {
          [sheetName]: jsonWorkSheet,
        }
      };
      return xlsx.writeFile(workBook, fileName);
    }
    
  2. 对象数组(后端返回的数组是一堆对象)(第一行为中文表头

      export function exportExcelFile(array: any[], sheetName = '表1', fileName = 'example.xlsx') {
        // 属性名数组
        const header = ['name', 'age', 'addr'];
        // 最终数组 第一行为中文表头
        let finalData = [
          {
            name: '账号',
            age: '密码',
            addr: '地址',
          },
        ]; 
        array?.forEach((item) => {
          const pickedItem = item?.map((e) => pick(e, header)); // 此方法是loadash中,找到当前对象e中,对应header属性名称的属性,返回一个对象
          if (pickedItem) {
            finalData.push(...pickedItem);
          }
        });
    
        const jsonWorkSheet = xlsx.utils.json_to_sheet(finalData,header);
        const workBook: WorkBook = {
          SheetNames: [sheetName],
          Sheets: {
            [sheetName]: jsonWorkSheet,
          }
        };
        return xlsx.writeFile(workBook, fileName);
      }
    

导入的简单使用

  1. 简单导入,获取表格数据

    /**
     * 从 excel 文件读取数据
     * @param excelRcFileBuffer excel 文件
     */
    export function importExcelFromBuffer<Item = any>(excelRcFileBuffer: ArrayBuffer): Item[] {
      // 读取表格对象
      const workbook = xlsx.read(excelRcFileBuffer, {type: 'buffer'});
      // 找到第一张表
      const sheetNames = workbook.SheetNames;
      const sheet1 = workbook.Sheets[sheetNames[0]];
      // 读取内容
      return xlsx.utils.sheet_to_json(sheet1);
    }
    
  2. 结合业务场景,需要对上传数据做校验,此demo简单校验是否为中文是否为数字

    // 此处的onChange方法为 Antd的Upload组件的API
    onChange(info) {
      // 文件状态为done时,可获取完整文件流
      if (info.file.status === 'done') {
        const fileReader = new FileReader();
        // 是否成功的标识
        let canPass = true;
        fileReader.onload = (e) => {
          const data = e.target.result;
          // 将获取的文件流 以数组形式读取
          const workBook = XLSX.read(data, { type: 'array' });
          // 获取当前文件第一个表的表名
          const workSheetNames = workBook.SheetNames[0];
          // 拿到对应的表
          const workSheet = workBook.Sheets[workSheetNames];
          // 通过需要的数据属性,把数据整理成对象数组
          const excelData = XLSX.utils.sheet_to_json(workSheet, {
            header: Object.keys(['name','age','addr']),
            raw: false,
          });
          // 删除第一行中文表头
          excelData.shift();
          // 如果上传的空数据就 不通过
          if (!(excelData && excelData.length > 0)) {
            canPass = false;
          }else{
            // name不允许有中文,age需要是数字
            const noPass= excelData.find(e=>hasChinese(e.name)||!isNumber(e.age))
            if(noPass){
              canPass = false;
            }
          }
         
          if (canPass) {
            const fileName = info.file.name;
            // 成功的回调(自定义的)
            onSuccess(excelData, fileName);
            message.success(`${fileName} 上传成功`);
          } else {
            message.warning('请按照格式填写');
          }
        };
      } else if (info.file.status === 'error') {
        message.error(`${info.file.name} 上传失败`);
      }
    }
    
    //**************单独方法
    
    // 判断是否含有汉字
    export const hasChinese = (str) => {
      const reg = /[\u4E00-\u9FA5]/g;
      return reg.test(str);
    };
    
    // 判断是否为数字
    export const isNumber = (str) => {
      const reg = /^(-?\d+)(\.\d+)?$/;
      return reg.test(str);
    };
    

有个博主讲了更多业务场景可查看:https://www.jianshu.com/p/f9ba3dd3cd4f

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

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

相关文章

Kafka技术认知

文章目录概念理解名词解释基本架构工作流程Kafka的特性概念理解 Kafka是分布式的基于发布-订阅消息队列。是一个分布式、支持分区的、多副本的&#xff0c;基于 Zookeeper 协调的分布式消息中间件系统&#xff0c;它的最大的特性就是可以实时的处理大量数据以满足各种需求场景…

FISCO BCOS 搭建区块链,在SpringBoot中调用合约

一、搭建区块链 使用的是FISCO BCOS 和 WeBASE-Front来搭建区块链&#xff0c;详细教程&#xff1a; https://blog.csdn.net/yueyue763184/article/details/128924144?spm1001.2014.3001.5501 搭建好能达到下图效果即可&#xff1a; 二、部署智能合约与导出java文件、SDK证…

【C语言】程序环境和预处理

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;别人可以拷贝我的模式&#xff0c;但不能拷贝我不断往前的激情 &#x1f6f8;C语言专栏&#xff1a;https://blog.csdn.net/vhhhbb/category_12174730.html 小苏希望大家能从这篇文章中收获到许…

决策树和期望货币价值

1、决策树和期望货币价值&#xff08;决策树、表&#xff09;---风险管理决策树分析是风险分析过程中的一项常用技术。某企业在项目风险分析过程中&#xff0c;采用了决策树分析方法&#xff0c;并计算出了EMV&#xff08;期望货币值&#xff09;。以下说法中&#xff0c;正确的…

使用 OpenAI 的 ChatGPT 提高开发人员的工作效率

&#x1f482; 个人网站:【海拥】【摸鱼游戏】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 想寻找共同学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 介绍 作为一名开发人…

第十天栈和队列

栈和队列的原理大家应该很熟悉了&#xff0c;队列是先进先出&#xff0c;栈是先进后出。首先大家要知道 栈和队列是STL&#xff08;C标准库&#xff09;里面的两个数据结构。接下来介绍的栈和队列也是SGI STL里面的数据结构&#xff0c; 知道了使用版本&#xff0c;才知道对应的…

雅思经验(6)

反正我是希望遇到的雅思听力section 4.里面填空的地方多一些&#xff0c;之后单选的部分少一些。练了一下剑9 test3 的section 4&#xff0c;感觉还是不难的&#xff0c;都是在复现&#xff0c;而且绕的弯子也不是很多。本次考试的目标就是先弄一个六分&#xff0c;也就是说&am…

构建Jenkins 2.340持续集成环境

一、前言 本文学习自&#xff1a;2022版Jenkins教程&#xff08;从配置到实战) 如有不妥&#xff0c;欢迎指正 二、构建资料 已经包括了本文档使用的所有所需的安装包 三、安装docker 1、解压docker docker-20.10.10.tgz2、复制文件 cp docker/* /usr/bin/3、编写启动文…

第三节 第一个内核模块

hellomodule 实验 实验说明 硬件介绍 本节实验使用到STM32MP157 开发板 实验代码讲解 本章的示例代码目录为&#xff1a;linux_driver/module/hellomodule 从前面我们已经知道了内核模块的工作原理&#xff0c;这一小节就开始写代码了&#xff0c;跟hello world 一样&…

经典文献阅读之--PLC-LiSLAM(面,线圆柱SLAM)

0. 简介 对于激光SLAM来说&#xff0c;现在越来越多的算法不仅仅局限于点线等简答特征的场景了&#xff0c;文章《PLC-LiSLAM: LiDAR SLAM With Planes, Lines,and Cylinders》说到&#xff0c;平面、线段与圆柱体广泛存在于人造环境中。为此作者提出了一个使用这些landmark的…

kafka集群搭建及问题

一、zookeeper集群搭建 1、创建文件夹 cd /home mkdir zookeeper 2、下载 cd zookeeper wget https://downloads.apache.org/zookeeper/zookeeper-3.8.0/apache-zookeeper-3.8.0-bin.tar.gz 解压到当前文件夹 tar -zxvf apache-zookeeper-3.8.0-bin.tar.gz 文件夹重命…

icomoon字体图标的使用

很久之前就学习过iconfont图标的使用&#xff0c;今天又遇到一个用icomoon字体图标写的案例&#xff0c;于是详细学习了一下&#xff0c;现整理如下。 一、下载 1.网址&#xff1a; https://icomoon.io/#home 2.点击IcoMoon App。 3.点击 https://icomoon.io/app 4.进入IcoM…

每天10个前端小知识 【Day 10】

前端面试基础知识题 1. es5 中的类和es6中的class有什么区别&#xff1f; 在es5中主要是通过构造函数方式和原型方式来定义一个类&#xff0c;在es6中我们可以通过class来定义类。 class类必须new调用&#xff0c;不能直接执行。 class类执行的话会报错&#xff0c;而es5中…

【PyTorch】教程:Transfer learning

Transfer learning 实际工作中&#xff0c;只有很少的人从头开始训练 CNN&#xff0c;因为很难获得大量的样本。一般情况下&#xff0c;会通过调用预训练模型&#xff0c;例如 ConvNet 在 ImageNet&#xff08;1.2 M 图像 1000 个类别&#xff09;,可以用 ConvNet 初始化&#…

Verilog 组合逻辑一些注意事项

reg型变量不一定会被综合成触发器 【参考链接】 以下是verilog-2001的标准中对wire和reg的定义如下&#xff1a; wire&#xff1a; A wire net can be used for nets that are driven by a single gate or continuous assignment. reg&#xff1a; Assignments to a reg are…

微信小程序 Springboot java nodejs图书馆图书借阅系统

图书借阅管理系统用户端是基于微信小程序&#xff0c;管理员端是基于java编程语言&#xff0c;mysql数据库&#xff0c; idea工具开发&#xff0c;本系统是分为用户和管理员两个角色&#xff0c;其中用户的主要功能有注册登陆小程序&#xff0c;查看系统功能&#xff0c;图书搜…

VB 消息、消息队列、事件

windows是图像化界面&#xff0c;多任务消息windows系统将消息&#xff08;大的结构&#xff09;发给其他应用程序Windows消息包含了所有的外部输入或者计算机内部信息&#xff0c;应用程序的消息队列先进先出&#xff0c;Windows消息的循环--每个应用程序里有自己的消息循环外…

微信卸载后重装的聊天记录还能找回吗?

很多人微信卸载后&#xff0c;问能不能恢复之前的聊天记录&#xff1f; 我想大家肯定都去百度搜索了&#xff0c;能搜出来可行的办法了么&#xff0c;没有是吧&#xff0c;那就看看我能不能帮到你&#xff0c;根据我的经验来解决。 答&#xff1a;理论上是不能的&#xff0c;因…

SpringBoot集成swagger3(CD2207)(内含教学视频+源代码)

SpringBoot集成swagger3&#xff08;CD2207&#xff09;&#xff08;内含教学视频源代码&#xff09; 教学视频源代码下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87435564 目录SpringBoot集成swagger3&#xff08;CD2207&#xff09;&#…

LeetCode栈与队列相关解法

栈与队列1. 用栈实现队列[232. 用栈实现队列](https://leetcode.cn/problems/implement-queue-using-stacks/)2. 用队列实现栈[225. 用队列实现栈](https://leetcode.cn/problems/implement-stack-using-queues/)两个队列实现一个队列实现3. 有效括号[20. 有效的括号](https://…