Vue3项目中使用原生input实现excel导入导出功能

news2024/9/20 20:44:37

重写input样式

首先我们先来重写input的原生样式,毕竟实在不好看。这里的思路很简单input外面套一层div然后让input撑满盒子然后给input隐藏了就行

<div class="bg-[#f8f8f8]  w-[430px] h-[220px] rounded-md cursor-pointer relative outline-0">
  <input type="file" @change="file_upload"
    class=" absolute z-10 opacity-0 block w-full cursor-pointer h-full outline-0 ">
  <div class="absolute inset-0 ">
    <div class="flex h-full flex-col justify-center items-center  leading-[3]">
      <div class="">
        <t-icon name="cloud-upload" size="40px"></t-icon>
      </div>
      <div class="text-[#616161]">
        请将文件拖拽此处,或点击上传
      </div>
      <div class="text-[#9a9a9a]">
        仅支持CSV、XLSX、XLS文件,单文件大小限制在5M以内
      </div>
    </div>
  </div>
</div>

下面是写好的效果

![在这里插入图片描述](https://img-blog.csdnimg.cn/eba0d369e5cf4d1f8b836ce6a97187f1.png

导入功能

首先下载xlsx

npm install -S xlsx

在需要使用的vue文件中引入

import * as XLSX from 'xlsx' // Vue3 版本

因为我们只需要上传xlsx和xls文件,所有我们要做上传之前的校验

// 文件上传
const file_upload = (e: any) => {

  // 校验文件类型
  const file = e.target.files[0]
  const { name, size } = file

  const m5 = size / 1024 / 1024
  if (m5 > 5) {
    MessagePlugin.error("上传文件不能超过,5M")
    return
  }

  const is_type = name.indexOf(".xls") != -1 || name.indexOf(".xlsx") != -1

  if (!is_type) {
    MessagePlugin.error("上传文件必须是,.xls和.xlsx文件")
    return
  }


  file_import(file)		// 调用导入方法
}

下面就是导入的逻辑

const file_import = (file: File) => {
  // 创建一个新的 'FileReader' 实例
  const read_file = new FileReader();

  // 定义文件加载完成时的事件处理函数
  read_file.onload = (e: any) => {
    // 将加载的文件数据转换为 Uint8Array
    const data = new Uint8Array(e.target.result);

    // 使用 XLSX 库读取加载的数据,将其视为数组
    const work = XLSX.read(data, { type: "array" });

    // 获取 Excel 工作簿中第一个工作表的名称
    const sheet_name = work.SheetNames[0];

    // 使用工作表名称访问第一个工作表的数据
    const sheet_data = work.Sheets[sheet_name];

    // 将工作表数据转换为 JSON 对象(对象数组)
    const table = XLSX.utils.sheet_to_json(sheet_data);

    // 将生成的 JSON 数据(表格)记录到控制台
    console.log(table);
  };

  // 以 ArrayBuffer 格式读取文件内容
  read_file.readAsArrayBuffer(file);
};

下面是导出的逻辑

首先先看html结构

<div  @click="file_export" class="text-[#56c206] my-5 flex flex-col cursor-pointer justify-center  items-center p-3 border w-fit border-[#56c206] rounded-md">
        <div class="text-center">
          <t-icon name="arrow-down-rectangle" size="35px"></t-icon>
        </div>
        <div class=" ">下载模板</div>
</div>

然后是数据结构,如果需求换成动态的就行

const table = [
  {
    '第三方订单号 没有可留空': "123456",
    '收件人姓名 必填': "张三",
    '联系电话 必填': "1300000000",
    '收货人详细地址 必填': "河北省石家庄市康美丽街道01号"
  },
]

然后是ts部分

const file_export = () => {
  // 创建工作簿
  const workbook = XLSX.utils.book_new();
  // 创建工作表
  const worksheet = XLSX.utils.json_to_sheet(table);
  // 设置表格宽度
  worksheet['!cols'] = [
    { wch: 25 },
    { wch: 25 },
    { wch: 25 },
    { wch: 40 }
  ];


  // 将工作表添加到工作簿
  XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');


  // 生成 Blob 对象
  const blob = new Blob([XLSX.write(workbook, { bookType: 'xlsx', type: 'array' })], {
    type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  });
  // 创建下载链接
  const url = URL.createObjectURL(blob);
  // 创建一个虚拟链接并模拟点击以下载文件
  const link = document.createElement('a');
  link.href = url;
  link.download = 'exported_data.xlsx';
  link.click();
  // 释放链接
  URL.revokeObjectURL(url);
}

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

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

相关文章

Git详解及使用

Git简介 Git 是一种分布式版本控制系统&#xff0c;它可以不受网络连接的限制&#xff0c;加上其它众多优点&#xff0c;目前已经成为程序开发人员做项目版本管理时的首选&#xff0c;非开发人员也可以用 Git 来做自己的文档版本管理工具。 大概是大二的时候开始接触和使用Gi…

计算机组成原理-笔记-第四章

目录 第四章——指令系统 1、指令格式 &#xff08;1&#xff09;指令&#xff08;机器指令-二进制数&#xff09; &#xff08;2&#xff09;指令分类&#xff08;按照 地址码的数量 分类&#xff09; &#xff08;3&#xff09;指令分类&#xff08;按照长度分类&#x…

Dubbo启动错误

加完Nacos配置后报错 信息: [DUBBO] The registry[<dubbo:registry address"nacos://localhost:8848" protocol"nacos" port"8848" />] will be used as the config center, dubbo version: 2.7.8, current host: 192.168.0.103 八月 09…

【香瓜说职场】如何高效地提问(2018.05.06)

一、什么是低效地提问&#xff1f; 香瓜先举3个非常非常常见的低效提问实例&#xff1a; 1、“为什么我的XXX不成功&#xff1f;” 这个问题就像“为什么我会摔倒”&#xff0c;可能原因有“腿残疾”、“路上有坑”、“眼神不好”等无数种原因……“不摔倒”的我是回答不了的、…

怎么学习JavaScript相关技术? - 易智编译EaseEditing

学习JavaScript相关技术需要一步步地积累知识和实践经验。以下是一些建议的学习步骤和资源&#xff1a; 基础知识&#xff1a; 开始学习JavaScript之前&#xff0c;了解基本的编程概念和术语。你可以通过在线课程、教材或教学视频来学习编程的基础知识。 学习基本语法&#x…

设计模式行为型——模板模式

目录 模板模式的定义 模板模式的实现 模板模式角色 模板模式类图 模板模式举例 模板模式代码实现 模板模式的特点 优点 缺点 使用场景 注意事项 实际应用 模板模式的定义 模板模式&#xff08;Template Pattern&#xff09;属于行为型设计模式&#xff0c;又叫模版…

OpenLayers入门,OpenLayers实现地图原地旋转动画效果

专栏目录: OpenLayers入门教程汇总目录 前言 OpenLayers实现地图原地旋转动画效果,顾名思义,就是站在原地转一圈。 二、依赖和使用 "ol": "^6.15.1"使用npm安装依赖npm install ol@6.15.1使用Yarn安装依赖yarn add olvue中如何使用: vue项目使用…

opencv基础 42- Scharr算子-cv2.Scharr()(边缘检测基础)

Scharr算子是用于计算图像梯度的一种常用算子&#xff0c;特别是在边缘检测任务中。它是Sobel算子的改进版本&#xff0c;旨在提供更加准确和敏感的边缘检测。 在离散的空间上&#xff0c;有很多方法可以用来计算近似导数&#xff0c;在使用 33 的 Sobel 算子时&#xff0c;可能…

Android进阶之SeekBar动态显示进度

SeekBar 在开发中并不陌生,默认的SeekBar是不显示进度的,当然用吐司或者文案在旁边实时显示也是可以的,那能不能移动的时候才显示&#xff0c;默认不显示呢,当然网上花哨的三方工具类太多了&#xff0c;但是我只是单纯的想在SeekBar的基础上去添加一个可以跟随移动显示的气泡而…

循环结构的学习

循环结构 文章目录 为什么要学习循环while循环dowhile循环偶数之和断点调试购物结算循环的选择类名和全类名摄氏华氏对照表for循环for执行次序五门功课成绩for的特殊写法break和continue录入客户信息_continue使代码优雅小数的比较不能用或! 为什么要学习循环 在编写代码时&a…

mysql死锁分析show engine innodb status

文章目录 1、show engine innodb status命令2、前置知识3、无符号数、有符号数4、innodb关于有符号数的规定5、为什么会有这个规定 1、show engine innodb status命令 最近在使用mysql的show engine innodb status命令分析死锁&#xff0c;发现了一个有意思的点。就是红框里圈…

【小梦C嘎嘎——启航篇】类和对象(中篇)

【小梦C嘎嘎——启航篇】类和对象&#xff08;中篇&#xff09;&#x1f60e; 前言&#x1f64c;类的6个默认成员函数构造函数析构函数拷贝构造函数拷贝构造函数的特性有哪些&#xff1f;既然编译器可以自动生成一个拷贝构造函数&#xff0c;为什么我们还要自己设计实现呢&…

python数据分析 期末测验,python数据分析基础题库

大家好&#xff0c;小编为大家解答python数据分析选择题题目的问题。很多人还不知道python数据分析题目和答案&#xff0c;现在让我们一起来看看吧&#xff01; 自测试卷 5 一、选择题 1 &#xff0e;下面关于 RFM 模型说法正确的是&#xff08; &#xff09;。 A &#xff0e;…

微信小程序(由浅到深)

文章目录 一. 项目基本配置1. 项目组成2. 常见的配置文件解析3. app.json全局的五大配置4.单个页面中的page配置5. App函数6.tabBar配置 二. 基本语法&#xff0c;事件&#xff0c;单位1. 语法2. 事件3. 单位 三. 数据响应式修改四 . 内置组件1. button2. image3. input4. 组件…

钓鱼攻击:相似域名识别及如何有效预防攻击

网络犯罪分子很乐意劫持目标公司或其供应商或业务合作伙伴的官方域名&#xff0c;但在攻击的早期阶段&#xff0c;他们通常没有这种选择。相反&#xff0c;在有针对性的攻击之前&#xff0c;他们会注册一个与受害组织的域名相似的域名 - 他们希望您不会发现其中的差异。此类技术…

opencv基础51-图像轮廓04-轮廓多种图形拟合讲解及示例

轮廓拟合&#xff08;Contour Fitting&#xff09;是指在图像处理中&#xff0c;通过一些数学模型或曲线拟合方法来近似描述图像中的轮廓。图像中的轮廓是指物体的边界&#xff0c;轮廓拟合可以用于提取、描述和分析物体的形状。 常用的轮廓拟合方法包括多项式拟合、贝塞尔曲线…

【刷题笔记8.9】LeetCode题目:两数相加

LeetCode题目2&#xff1a;两数相加 题目及描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设…

【uniapp】封装一个全局自定义的模态框

【需求描述】 在接口401处&#xff0c;需要实现全局提示并弹出自定义模态框的功能。考虑到uni-app内置的模态框和app原生提示框的自定义能力有限&#xff0c;我决定自行封装全局自定义的模态框&#xff0c;以此为应用程序提供更加统一且个性化的界面。 【效果图】 【封装】 主…

Ansible Playbook快速部署一主多从MySQL集群

部署目标&#xff1a; 1、快速部署一套一主两从的mysql集群 2、部署过程中支持交互式定义安装目录及监听端口号 部署清单目录结构&#xff1a; rootmaster:/opt/mysql# tree . . ├── group_vars │ └── all.yml ├── hosts ├── mysql.yml └── roles└── mys…