react 怎么获取表格_react学习之js-xlsx导入和导出excel表格

前记:最近真的挺忙的,一件事接着一件,都忘了我的React项目,尽管这是一个没写概率没写离散的夜晚,我决定还是先做做我的React

好了,进入正题

项目需求,需要导入和导出表单,发现前端已经强大到无所不能(可惜我有点懒,学的并不勤快)

因此使用到js-xlsx,附上github地址:https://github.com/SheetJS/js-xlsx

导入表单

1.控制台安装

$ npm install xlsx

2.在js文件中引入

import XLSX from 'xlsx';

import ExcelUtil from '../../utils/excelUtil'; //注:excelUtil.js是我自定义的关于表单的操作模块

3.函数声明

function importExcel(file){

// 获取上传的文件对象

const { files } = file.target;

// 通过FileReader对象读取文件

const fileReader = new FileReader();

fileReader.onload = event => {

try {

const { result } = event.target;

// 以二进制流方式读取得到整份excel表格对象

const workbook = XLSX.read(result, { type: 'binary' });

let data = []; // 存储获取到的数据

// 遍历每张工作表进行读取(这里默认只读取第一张表)

for (const sheet in workbook.Sheets) {

if (workbook.Sheets.hasOwnProperty(sheet)) {

// 利用 sheet_to_json 方法将 excel 转成 json 数据

data = data.concat(XLSX.utils.sheet_to_json(workbook.Sheets[sheet]));

// break; // 如果只取第一张表,就取消注释这行

}

}

console.log(data);

} catch (e) {

// 这里可以抛出文件类型错误不正确的相关提示

console.log('文件类型不正确');

return;

}

};

// 以二进制方式打开文件

fileReader.readAsBinaryString(files[0]);

}

4.使用

{ExcelUtil.importExcel(e)} }/>

5.结果

控制台打印出结果:

导出表单

第一第二步同上

3.函数声明

function exportExcel(headers, data, fileName = '请假记录表.xlsx') {

const _headers = headers

.map((item, i) => Object.assign({}, { key: item.key, title: item.title, position: String.fromCharCode(65 + i) + 1 }))

.reduce((prev, next) => Object.assign({}, prev, { [next.position]: { key: next.key, v: next.title } }), {});

const _data = data

.map((item, i) => headers.map((key, j) => Object.assign({}, { content: item[key.key], position: String.fromCharCode(65 + j) + (i + 2) })))

// 对刚才的结果进行降维处理(二维数组变成一维数组)

.reduce((prev, next) => prev.concat(next))

// 转换成 worksheet 需要的结构

.reduce((prev, next) => Object.assign({}, prev, { [next.position]: { v: next.content } }), {});

// 合并 headers 和 data

const output = Object.assign({}, _headers, _data);

// 获取所有单元格的位置

const outputPos = Object.keys(output);

// 计算出范围 ,["A1",..., "H2"]

const ref = `${outputPos[0]}:${outputPos[outputPos.length - 1]}`;

// 构建 workbook 对象

const wb = {

SheetNames: ['mySheet'],

Sheets: {

mySheet: Object.assign(

{},

output,

{

'!ref': ref,

'!cols': [{ wpx: 45 }, { wpx: 100 }, { wpx: 200 }, { wpx: 80 }, { wpx: 150 }, { wpx: 100 }, { wpx: 300 }, { wpx: 300 }],

},

),

},

};

// 导出 Excel

XLSX.writeFile(wb, fileName);

}

4.定义表头和数据项

const initColumn = [{

title: '姓名',

dataIndex: 'name',

key: 'name',

className: 'text-monospace',

}, {

title: '年级',

dataIndex: 'grade',

key: 'grade',

}, {

title: '部门',

dataIndex: 'department',

key: 'department',

}];

let attendanceInfoList = [

{

name:"张三",

grade:"2017级",

department:"前端部门"

},

{

name:"李四",

grade:"2017级",

department:"程序部门"

}];

5.使用

{ExcelUtil.exportExcel(initColumn, attendanceInfoList,"人员名单.xlsx")}}>导出

6.结果

完整代码

//excelUtil.js

import XLSX from 'xlsx';

import React,{useState,useEffect} from 'react';

function importExcel(file){

// 获取上传的文件对象

const { files } = file.target;

// 通过FileReader对象读取文件

const fileReader = new FileReader();

fileReader.onload = event => {

try {

const { result } = event.target;

// 以二进制流方式读取得到整份excel表格对象

const workbook = XLSX.read(result, { type: 'binary' });

let data = []; // 存储获取到的数据

// 遍历每张工作表进行读取(这里默认只读取第一张表)

for (const sheet in workbook.Sheets) {

if (workbook.Sheets.hasOwnProperty(sheet)) {

// 利用 sheet_to_json 方法将 excel 转成 json 数据

data = data.concat(XLSX.utils.sheet_to_json(workbook.Sheets[sheet]));

// break; // 如果只取第一张表,就取消注释这行

}

}

console.log(data);

} catch (e) {

// 这里可以抛出文件类型错误不正确的相关提示

console.log('文件类型不正确');

return;

}

};

// 以二进制方式打开文件

fileReader.readAsBinaryString(files[0]);

}

function exportExcel(headers, data, fileName = '请假记录表.xlsx') {

const _headers = headers

.map((item, i) => Object.assign({}, { key: item.key, title: item.title, position: String.fromCharCode(65 + i) + 1 }))

.reduce((prev, next) => Object.assign({}, prev, { [next.position]: { key: next.key, v: next.title } }), {});

const _data = data

.map((item, i) => headers.map((key, j) => Object.assign({}, { content: item[key.key], position: String.fromCharCode(65 + j) + (i + 2) })))

// 对刚才的结果进行降维处理(二维数组变成一维数组)

.reduce((prev, next) => prev.concat(next))

// 转换成 worksheet 需要的结构

.reduce((prev, next) => Object.assign({}, prev, { [next.position]: { v: next.content } }), {});

// 合并 headers 和 data

const output = Object.assign({}, _headers, _data);

// 获取所有单元格的位置

const outputPos = Object.keys(output);

// 计算出范围 ,["A1",..., "H2"]

const ref = `${outputPos[0]}:${outputPos[outputPos.length - 1]}`;

// 构建 workbook 对象

const wb = {

SheetNames: ['mySheet'],

Sheets: {

mySheet: Object.assign(

{},

output,

{

'!ref': ref,

'!cols': [{ wpx: 45 }, { wpx: 100 }, { wpx: 200 }, { wpx: 80 }, { wpx: 150 }, { wpx: 100 }, { wpx: 300 }, { wpx: 300 }],

},

),

},

};

// 导出 Excel

XLSX.writeFile(wb, fileName);

}

export default {importExcel,exportExcel};

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

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

相关文章

android 最新的框架搭建,Android之Mvp模式框架搭建

前言在做Android开发时,我们通常为了更合理,更高效,优质的开发项目,并不是直接上来就开始开发功能,而是先搭建好自己的一个开发框架,一个好的开发框架,通常会让我们事倍功半,它就好比我们去建造一个房子,如果你的地基打的越深,越牢固,那么就可以建造出很高很大的房子.在搭建一个…

curl在android服务器上编译,Android curl的上载编译和使用

mm执行编译:PLATFORM_VERSION_CODENAMERELPLATFORM_VERSION4.0.3TARGET_PRODUCTfullTARGET_BUILD_VARIANTengTARGET_BUILD_TYPEreleaseTARGET_BUILD_APPSTARGET_ARCHarmTARGET_ARCH_VARIANTarmv7-aHOST_ARCHx86HOST_OSlinuxHOST_BUILD_TYPEreleaseBUILD_IDIML74Kmak…

英特尔nuc能代替主机吗_python编程,热度为什么越来越高,python能代替JAVA吗?...

大家好,我是你们的软件主讲老师宁彤天,python编程是这几年刚火起来了,这可能是这几年人工智能的普及吧,现在是人工智能非python,没有第二,当能其它语言也能实现人工智能,但python的代码量能用最…

python 网页自动化框架_python+selenium自动化框架

项目以前的UI自动化大概是这样分层的1.Common功能层:一些经常被调用的基本常用操作,用来完成某项具体的功能,与具体的业务无关。比如常用的封装:--将元素定位方法重新封装--封装上下左右滑动 eg: swipe(directdown,count1)--pinch…

小程序监听android返回键,如何监听小程序返回按钮事件?

写在前面为了能及时的将自己踩到的前端坑(包括ionic,angular,react,ReactNative,小程序,APICloud)分享给大家,以后会逐渐将文章转移到微信公众号:前端e家(front_e_family)。可直接扫码关注,公众号会不定期更新新文章,分享踩坑笔记…

mix2s 升级android p,小米推送小米MIX2S 安卓P稳定版更新 这两个隐藏升级你发现了吗?...

原标题:小米推送小米MIX2S 安卓P稳定版更新 这两个隐藏升级你发现了吗?今天上午,小米推送了小米MIX2S的稳定版更新,版本号为MIUI V10.0.4.0,体积为2GB,这一次更新将系统底层更新至了Android P,不…

如何用python做一个会聊天的女朋友_520来啦~教你用Python给自己造了一个女朋友!...

520这一天,也是网络情人节。就在那天,如果没有女朋友的自己,如何假装自己是有朋友的!如何在朋友圈“秀恩爱。女生版:image很有感觉有木有~~男生版:imageimage其实这些都是小意思啦~~这些都是假装自己有女朋…

鸿蒙系统定位低端市场,明年年初见!鸿蒙系统会先定位中低端,后续全面升级...

惊变20年鸿蒙系统手机会先定位中低端惊变20年上个月的华为H..DC2020开发者大会上,余承东对外公布将在明年开发出搭载鸿蒙系统的手机,并且采用EMUI11的华为手机可以拥有优先享受升级鸿蒙的待遇,手持华为手机的用户都颇为期待。惊变20年根据最新…

jsfor循环终止_js 终止 forEach 循环

wp8 入门到精通 MultiMsgPromptList arraymsg new List(); List ArrayNotifyInfo ...转:Top 10 Algorithms for Coding InterviewThe following are top 10 algorithms related concepts in coding interview. I will try to illustrate t ...Unity游戏开发——自动…

python求出五位数的回文数_python之递归

#codingutf-8#题目:打印出如下图案(菱形)nu 1 # 开始值k 2 # 变量值while nu > 0:print(int((7 - nu) / 2) * * * nu)nu kif nu 7:k -k#题目:有一分数序列:2/1 ,3/2 ,5/3 ,8/5 ,1…

html大小写字符串转换成整数,c++字符串大小写转换

由于ANSI和Unicode在函数名上有差别,故都列出来,不过本人以Unicode为主。【1.用C语言标准库函数toupper,tolower】头文件:cctype c下面:ctype.h转大写Ansi版: int toupper(int c);Unicode版:int towupper(w…

adams建立一绳索不带滑轮_ADAMS绳索仿真

在实际生活中有大量的绳索类传动运动形式。绳索类部件看似简单,但是用计算机软件对其模拟时却存在较大障碍。以钢丝绳为例,通常都是通过细长的钢丝螺旋缠绕在一起形成,在工作时当施加拉力载荷于其上,除了材料自身的拉力作用外&…

html正则判断全数字,javascript如何判断是不是数字?

javascript判断是不是数字的方法:方法一、使用js自带的全局函数isNaN()判断是不是数字。方法二、使用正则表达式判断是不是数字。方法三、通过typeof的返回值判断。JavaScript中判断是不是数字方法详解:第一种方法:isNaN()使用js自带全局函数…

弱加密算法有哪几种_常见的几种加密方法

常见的几种加密方法和实常见的几种加密方法 :MD5SHA1RSAAESDES1、MD5加密 是HASH算法一种、 是生成32位的数字字母混合码。 MD5主要特点是 不可逆MD5算法还具有以下性质:1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。2、…

html怎么无损插入背景音乐,HTML插入背景音乐方法【全】

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Syche我今天本来是做网页玩来着,忽然想在博客上放一个类似QQ空间背景的音乐播放器,于是晚上找了之后,终于实现了这个功能,这里和大家来分享一下:一:TESTsrc&qu…

law是什么的缩写_Lawyer和Attorney 有什么不同?

据美国劳工统计局(Bureau of Labor Statistics)预计,2016年至2026年间,律师的就业增长率为8.2%。在此期间,预计将新增6.5万个就业岗位。而且美国律师行业的,律师行业在US.NEWS 的Best Social Services Jobs中排名第一,…

获取不到html页面上的元素,Vue v-for渲染页面,获取不到DOM元素解析

v-for 渲染循环渲染页面的出现让我们告别了繁琐的JS拼接,在开发上面节省了很多时间。近期在开发中发现了在某些特定情况下,出现了获取不到渲染出来的DOM元素的情况,原因身为小白的我暂时还没搞清楚(忘大佬指出),但是却得出来初步的…

android ble蓝牙接收不到数据_Android蓝牙4.0 Ble读写数据详解 -2

Android蓝牙4.0 Ble读写数据详解 -2上一篇说了如何扫描与链接蓝牙 这篇文章讲讲与蓝牙的数据传输,与一些踩到的坑。先介绍一款调试工具,专门调试Ble蓝牙的app。名字叫:nRF-Connect 谷歌应用商店也能下载到。这里我先连接一个蓝牙设备 贴几个截图。UUID的…

选择座位html,影厅座位预览效果(css3)_html/css_WEB-ITnose

查看 demo 下载源码你可能对那些购买时需要选择座位的订票系统比较熟悉。通常在比赛,电影,搏击或者演唱会售票的时候需要这样做。如果能有一种座位的预览效果该有多酷啊,比如能够从你选择的位置的角度去预览舞台或者屏幕。这个问题引出了今天…

html 使用百度搜索,百度搜索uzer,进入主页

windows7的uzer.me怎么 安全上网百度搜索uzer,进入主页下载完成以后,点击,快捷方式,运行。登陆后,首先出现的是文档库,点击文档库。UZER上的软件和文件都打不开,网络没问题。因为安装的软件版本…