当前位置: 首页 > news >正文

React 前端如何通过组件完成 “下载 Excel模板” 和 “上传 Excel 文件并读取内容生成可使用的对象数组”

文章目录

  • 一、Excel 模板下载
    • 01、代码示例
  • 二、Excel 文件上传
    • 01、文件展示
    • 02、示例代码
    • 03、前端样式展示
    • 04、数据结果展示
  • 三、完整代码

本文的业务需求是建立在批量导入数据的情况下,普通组件只能少量导入,数据较多的情况都会选择 Excel 数据导入,这就涉及到下载 Excel 模板和上传带有数据的Excel 文件,读取数据进行后一步的存储操作。

本文讲解了两部分内容:

  • 如何在 React 前端使用 UI 组件(这里使用button 按钮 和 input 输入框的组合样式)上传一个 Excel 文件,并读取文件内容转成可使用的 json 对象数组的数据格式。
  • 如何在 React 前端使用 UI 组件(这里使用button 按钮)下载一个 Excel 文件模板,用于对上传 Excel 做准备。

一、Excel 模板下载

先准备好模板文件,放在了 React 项目的 public 文件夹下,通过按钮的方式让用户点击并下载该文件。

01、代码示例

这里有两个很容易出错的问题:

  • 模板名字,const templateUrl = '/template.xlsx'; 路径引用中名字出错会出现找不到资源的问题,表现结果是刷新界面。
  • 路径问题,const templateUrl = '/template.xlsx'; 这个路径是正确的。下面两个示例在运行时不会工作,因为 public 文件夹的内容在构建时被复制到根目录。
    • const templateUrl = './public/template.xlsx';
    • const templateUrl = '../../public/template.xlsx';

只要你的 template.xlsx 文件位于 public 文件夹中,并且你使用 /template.xlsx 这个绝对路径来引用它,你就可以在 React 项目的任何组件中通过点击事件来触发下载,而无需担心组件文件的位置。

import React from 'react';const downExcelTemplate: React.FC = () => {// 模板文件的URL(由于放在public文件夹中,所以可以直接通过/来访问)  const templateUrl = '/template.xlsx';  // 处理下载的函数  const handleDownload = () => {  // 创建一个隐藏的<a>标签并触发点击事件来下载文件  const link = document.createElement('a');  link.href = templateUrl;  link.download = '测试.xlsx'; // 可以设置下载时的文件名  document.body.appendChild(link);  link.click();  document.body.removeChild(link); // 下载后移除<a>标签  };  return (<div>  <button onClick={handleDownload} className="download-button">  模板下载</button>  </div>);  
}  export default downExcelTemplate;

现在就可以点击模板下载弹出下载文件的界面了。
样式

二、Excel 文件上传

01、文件展示

下图是用模板文件填写的数据文件图片。

Excel 文件

02、示例代码

完整代码包装成了一个组件。需要注意,React 本身不支持读取 Excel 文件,需要导入依赖,在项目的 package.json 中引入依赖,我的引入的 xlsx 依赖版本如下:

"xlsx": "^0.18.5",

使用的是 button 按钮点击上传的方式,这样可以减少样式调整,重点是 input 输入框的 style 属性设置一个 display: "none"

import React from 'react';
import * as XLSX from 'xlsx';const ReadExcelWord: React.FC = () => {const handleFileChange = (event: any) => {const inputFile = event.target.files[0];if (inputFile){const reader = new FileReader();reader.onload = (e: any) => {const data = new Uint8Array(e.target?.result);const workbook = XLSX.read(data, {type: 'array'});// 只读取第一个sheetconst firstSheetName = workbook.SheetNames[0];const workSheet = workbook.Sheets[firstSheetName];const jsonData = XLSX.utils.sheet_to_json(workSheet, { header: 1});console.log("jsonData", jsonData);};reader.readAsArrayBuffer(inputFile); }}// input 输入框的 id = "upfile" 很重要const handleButtonClick = () => {let upExcel = document.getElementById("upfile");upExcel?.click();}return (<div><button onClick={handleButtonClick}>上传</button><input id="upfile" type="file" style={{ display: "none" }} accept=".xlsx" onChange={handleFileChange} /></div>);
};export default ReadExcelWord;

03、前端样式展示

在这里插入图片描述

04、数据结果展示

json对象结果

三、完整代码

import React from 'react';
import * as XLSX from 'xlsx';const ReadExcelWord: React.FC = () => {const handleFileChange = (event: any) => {const inputFile = event.target.files[0];if (inputFile) {const reader = new FileReader();reader.onload = (e: any) => {const data = new Uint8Array(e.target?.result);const workbook = XLSX.read(data, {type: 'array'});// 只读取第一个sheetconst firstSheetName = workbook.SheetNames[0];const workSheet = workbook.Sheets[firstSheetName];const jsonData = XLSX.utils.sheet_to_json(workSheet, { header: 1});console.log("jsonData", jsonData);};reader.readAsArrayBuffer(inputFile); }}// input 输入框的 id = "upfile" 很重要const handleButtonClick = () => {let upExcel = document.getElementById("upfile");upExcel?.click();}// 模板文件的URL(由于放在public文件夹中,所以可以直接通过/来访问)  const templateUrl = '/template.xlsx';  // 处理下载的函数  const handleDownload = () => {  // 创建一个隐藏的<a>标签并触发点击事件来下载文件  const link = document.createElement('a');  link.href = templateUrl;  link.download = '测试.xlsx'; // 可以设置下载时的文件名  document.body.appendChild(link);  link.click();  document.body.removeChild(link); // 下载后移除<a>标签  };  return (<div><button onClick={handleButtonClick}>上传</button><input id="upfile" type="file" style={{ display: "none" }} accept=".xlsx" onChange={handleFileChange} /><button onClick={handleDownload} className="download-button">  模板下载</button> </div>);
};export default ReadExcelWord;

http://www.mrgr.cn/news/66239.html

相关文章:

  • 【GeoJSON在线编辑平台】(1)创建地图+要素绘制+折点编辑+拖拽移动
  • 音频内容理解
  • matplotlib画boxplot并添加pvalue
  • HCIP(9)-边界网关协议BGP,路由反射器RR,联邦Confederation
  • 运筹说 第127期 | 存储论相关模型代码实现
  • redis:list列表命令和内部编码
  • Linux(文件管理 图片+大白话)
  • 人工智能学习--归一化(Normalization)
  • 动态规划-两个数组的dp问题——44.通配符匹配
  • 雷池社区版新版本功能防绕过人机验证解析
  • 如何无缝更换WordPress主题:关键步骤详解
  • 智慧工地:引领工地管理和监测的革新
  • 有代码MoSE: Modality Split and Ensemble forMultimodal Knowledge Graph Completion
  • lc 153 寻找旋转排序数组的最小值
  • keep-alive - 2024最新版前端秋招面试短期突击面试题【100道】
  • 【Ant.designpro】上传图片
  • 测试流程是什么?
  • ins账号多开被封?指纹浏览器来解决!
  • 全栈电子硬件工程师是怎样炼成的?
  • 苹果企业签名掉签有哪些原因
  • gitmakegdb
  • 生物医药产业前景如何?怎样开展生物医药产业分析?
  • 经纬恒润车载TSN网络测试仪TestBase-ATT全新上线!
  • 数组和字符串的es6新方法使用和综合案例
  • 数字身份发展趋势前瞻:身份韧性与安全
  • 筋膜枪哪个牌子好?深入探索国产筋膜枪品牌的口碑之选