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

重写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);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智慧影院--java开源电影票优惠券制作系统快速开发

搭建一个智慧影院可以通过使用Java开源电影票优惠券制作系统来快速开发。这个系统可以帮助影院管理电影票的销售和优惠活动&#xff0c;提供便捷的购票方式和优惠券的生成与使用功能。 首先&#xff0c;我们需要建立一个数据库来存储电影、影厅、放映计划、订单等信息。在数据…

Java并发编程(一)多线程基础概念

概述 多线程技术&#xff1a;基于软件或者硬件实现多个线程并发执行的技术 线程可以理解为轻量级进程&#xff0c;切换开销远远小于进程 在多核CPU的计算机下&#xff0c;使用多线程可以更好的利用计算机资源从而提高计算机利用率和效率来应对现如今的高并发网络环境 并发编程…

C++代码生成静态LIB链接库及其调用方法

1、在进行C代码移植时可将CPP文件封装为静态lib链接库&#xff0c;本文章讲述了如何将cpp文件封装为lib文件。 2、假设有文件a.cpp、a.h、b.cpp、b.h以及main.cpp&#xff0c;假设main调用了b&#xff0c;b调用了a。现在需要将a.cpp以及b.cpp封装为a.lib以及b.lib。 3、在VS2…

RISC-V公测平台发布 · UnixBench完整测试

简介 UnixBench是一个开源的GPLv2许可的工具&#xff0c;它提供了对类Unix系统性能的基本指标。 通过运行UnixBench&#xff0c;可以获得有关系统性能的基本指标&#xff0c;用于与其他系统进行比较&#xff0c;也可以作为改进系统性能的参考。但UnixBench并不是一个综合性能…

MySQL和钉钉单据接口对接

MySQL和钉钉单据接口对接 数据源系统:钉钉 钉钉&#xff08;DingTalk&#xff09;是阿里巴巴集团打造的企业级智能移动办公平台&#xff0c;是数字经济时代的企业组织协同办公和应用开发平台。钉钉将IM即时沟通、钉钉文档、钉闪会、钉盘、Teambition、OA审批、智能人事、钉工牌…

【iOS】RunLoop

前言-什么是RunLoop&#xff1f; 什么是RunLoop? 跑圈&#xff1f;字面上理解确实是这样的。 Apple官方文档这样解释RunLoop RunLoop是与线程息息相关的基本结构的一部分。RunLoop是一个调度任务和处理任务的事件循环。RunLoop的目的是为了在有工作的时候让线程忙起来&#…

基于Echarts的大数据可视化模板:智慧物流管理

目录 引言物流管理的重要性大数据可视化在解决物流管理挑战中的作用智慧物流概述定义智慧物流的概念和特点智慧物流的关键技术和平台风险管理和预测:交通拥堵情况和风险预警Echarts与大数据可视化Echarts库以及其在大数据可视化领域的应用优势开发过程和所选设计方案模板如何满…

动手学深度学习Pytorch 4.4练习

1.这个多项式回归问题可以准确地解出吗&#xff1f;提⽰&#xff1a;使⽤线性代数。 可以,把多项式问题&#xff0c;用matlab的str2sym表示出来&#xff0c;再用solve求解。 2.考虑多项式的模型选择。 1. 绘制训练损失与模型复杂度&#xff08;多项式的阶数&#xff09;的关系…

关于在c++中使用数组名作为函数参数,或者使用数组名的地址作为函数参数问题的一些研究

前言 使用数组名作为函数参数&#xff0c;或者使用数组名的地址作为函数参数&#xff0c;常常出现于对于字符串的读入问题之中。 常有以下两种写法&#xff1a; 这是使用数组名作为函数参数 #include<cstdio> char s[100]; int main() {scanf("%s",s); }在…

抖音商品上架有攻略:详细介绍步骤与注意事项

抖音是一款非常流行的短视频分享平台&#xff0c;也是一个非常适合进行商品销售的平台。上架商品是在抖音上进行电商销售的重要一环&#xff0c;下面不若与众将介绍抖音商品的上架流程和注意事项。 1. 注册账号和认证&#xff1a;首先&#xff0c;你需要在抖音平台上注册一个账…

MYSQL06高级_为什么使用索引、优缺点、索引的设计、方案、聚簇索引、联合索引、注意事项

文章目录 ①. 为什么使用索引②. 索引及其优缺点③. InnoDb - 索引的设计④. InnoDb中的索引方案⑤. 索引 - 聚簇索引⑥. 索引 - 二级索引⑦. B树索引的注意事项⑧. MyISAM中索引方案 ①. 为什么使用索引 ①. 索引是存储引擎用于快速找到数据记录的一种数据结构,就好比去图书馆…

图像 检测 - RetinaNet: Focal Loss for Dense Object Detection (arXiv 2018)

图像 检测 - RetinaNet: Focal Loss for Dense Object Detection - 密集目标检测中的焦点损失&#xff08;arXiv 2018&#xff09; 摘要1. 引言2. 相关工作3. 焦点损失3.1 平衡交叉熵3.2 焦点损失定义3.3 类别不平衡与模型初始化3.4 类别不平衡和两级检测器 4. RetinaNet检测器…

Springboot中使用过滤器校验PSOT类型请求参数内容

目录 目的 实现步骤 完整代码 目的 在Springboot中创建过滤器&#xff0c;用来过滤所有POST类型请求并获取body中的参数进行校验内容是否合法&#xff1b;该方法仅适用于POST类型请求&#xff0c;因为POST和GET请求的参数位置不一样所以处理方式也不一样&#xff0c;如果想要…

flutter 没有open android module in Android studio 插件代码爆红

参考 1.结论 其实就是缺少这个文件 2.解决方案有两个 2.1 方案一 手动创建一个,命名规则是项目名字‘_android’‘.iml’ 内容如下: <?xml version"1.0" encoding"UTF-8"?> <module type"JAVA_MODULE" version"4">&l…

IoTDB在springboot2中的(二) 查询

上一章我们处理的基本的构建接入&#xff0c;以及插入的处理&#xff0c;那么接下来我们进行查询的操作处理。 我们继续在IoTDBSessionConfig工具类中加入查询的方法处理 /*** description: 根据SQL查询最新一条数据* author:zgy* param sql sql查询语句&#xff0c;count查询…

基于Java开发的企业级数字化采购系统

一、项目介绍 一款全源码可二开&#xff0c;可基于云部署、私有部署的企业级数字化采购管理系统&#xff0c;供应商全生命周期管控&#xff0c;公开询价管理&#xff0c;招标&#xff0c;定标&#xff0c;评审&#xff0c;生成订单&#xff0c;送货&#xff0c;收货全流程管理…

(十一)大数据实战——hadoop高可用之HDFS手动模式高可用

前言 本节内容我们介绍一下hadoop在手动模式下如何实现HDFS的高可用&#xff0c;HDFS的高可用功能是通过配置多个 NameNodes(Active/Standby)实现在集群中对 NameNode 的热备来解决上述问题。如果出现故障&#xff0c;如机器崩溃或机器需要升级维护&#xff0c;这时可通过此种…

【perl】报错合集

perl报错合集 &#xff08;注&#xff1a;可能会不定时更新&#xff09; 1.Name “main::x” used only once: possible typo at … 1.Name "main::x" used only once: possible typo at ...给某个变量赋值但是从来没有用它&#xff0c;或者变量之只用一次但没有…

Nginx(1)

目录 1.Nginx概述2.Nginx的特点3.Nginx主要功能1.反向代理2.负载均衡 1.Nginx概述 Nginx (engine x) 是一个自由的、开源的、高性能的HTTP服务器和反向代理服务器&#xff0c;也是一个IMAP、POP3、SMTP代理服务器。 Nginx是一个强大的web服务器软件&#xff0c;用于处理高并发…

仅使用 CSS 创建打字机动画效果

创建打字机效果比您想象的要容易。虽然实现这种效果的最常见方法是使用 JavaScript&#xff0c;但我们也可以使用纯 CSS 来创建我们的打字机动画。 在本文中&#xff0c;我们将了解如何仅使用 CSS 创建打字机动画效果。它简单、漂亮、容易。我们还将看看使用 CSS 与 JavaScrip…