React + js-xlsx构建Excel文件上传预览功能
首先要准备react开发环境以及js-xlsx插件
1. 此处省略安装react安装步骤
2.下载js-xlsx插件
- yarn add xlsx 或者 npm install xlsx
在项目中引入
- import * as XLSX from 'xlsx';
- 定义插件,并暴露出去
- /**
- * @author tangzedong.programmer@gmail.com
- * @apiNote excel预览插件
- * @since 2019-02-14 10:36:42
- */
- export default class Preview extends React.Component {
- //...
- }
- 定义全局变量,用于数据接收后重新渲染页面
- state = {
- tableData: [], // table的数据
- tableHeader: [] // table的表头
- };
- 通过render返回预览视图(用table表格预览数据,Table是使用的ant design)
- render() {
- return (
- <div>
- <Table columns={this.state.tableHeader} dataSource={this.state.tableData}/>
- </div>
- );
- }
- 解析excel文件
- uploadFilesChange(file) {
- // 通过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) {
- let tempData = [];
- // esline-disable-next-line
- if (workbook.Sheets.hasOwnProperty(sheet)) {
- // 利用 sheet_to_json 方法将 excel 转成 json 数据
- console.log(sheet);
- data[sheet] = tempData.concat(XLSX.utils.sheet_to_json(workbook.Sheets[sheet]));
- }
- }
- const excelData = data.Sheet1;
- const excelHeader = [];
- // 获取表头
- for (const headerAttr in excelData[0]) {
- const header = {
- title: headerAttr,
- dataIndex: headerAttr,
- key: headerAttr
- };
- excelHeader.push(header);
- }
- // 解析后的变量赋值给state,重新渲染table页面
- // message.success('上传成功!')
- this.setState({
- tableData: excelData,
- tableHeader: excelHeader,
- })
- console.log(this.state)
- } catch (e) {
- // 这里可以抛出文件类型错误不正确的相关提示
- console.log(e);
- // message.error('文件类型不正确!');
- }
- }
- // 以二进制方式打开文件
- fileReader.readAsBinaryString(file.file);
- }
全部代码
(额外使用了ant design的Dragger、Table、message组件,实现拖拽点击上传)
- import React from "react";
- import * as XLSX from 'xlsx';
- import antd, {message, Table} from 'antd';
- const Dragger = antd.upload.Dragger;
- /**
- * @author tangzedong.programmer@gmail.com
- * @apiNote 音频、视频、excel、图片预览插件
- * @since 2019-02-14 10:36:42
- */
- export default class Preview extends React.Component {
- state = {
- tableData: [],
- tableHeader: []
- };
- render() {
- return (
- <div>
- <Dragger name="file"
- beforeUpload={function () {
- return false;
- }}
- onChange={this.uploadFilesChange.bind(this)}
- showUploadList={false}>
- <p className="ant-upload-text">
- <span>点击上传文件</span>
- 或者拖拽上传
- </p>
- </Dragger>
- <Table columns={this.state.tableHeader} dataSource={this.state.tableData}/>
- </div>
- );
- }
- uploadFilesChange(file) {
- // 通过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) {
- let tempData = [];
- // esline-disable-next-line
- if (workbook.Sheets.hasOwnProperty(sheet)) {
- // 利用 sheet_to_json 方法将 excel 转成 json 数据
- console.log(sheet);
- data[sheet] = tempData.concat(XLSX.utils.sheet_to_json(workbook.Sheets[sheet]));
- }
- }
- const excelData = data.Sheet1;
- const excelHeader = [];
- // 获取表头
- for (const headerAttr in excelData[0]) {
- const header = {
- title: headerAttr,
- dataIndex: headerAttr,
- key: headerAttr
- };
- excelHeader.push(header);
- }
- // 最终获取到并且格式化后的 json 数据
- message.success('上传成功!')
- this.setState({
- tableData: excelData,
- tableHeader: excelHeader,
- })
- console.log(this.state)
- } catch (e) {
- // 这里可以抛出文件类型错误不正确的相关提示
- console.log(e);
- message.error('文件类型不正确!');
- }
- }
- // 以二进制方式打开文件
- fileReader.readAsBinaryString(file.file);
- }
- }
特别鸣谢:https://blog.csdn.net/twodogya/article/details/87892765
如有疑问,请在下面留言评论,或者私信我,请多多指教!
- //
React + js-xlsx构建Excel文件上传预览功能的更多相关文章
- 基于bootstrap的上传插件fileinput实现ajax异步上传功能(支持多文件上传预览拖拽)
首先需要导入一些js和css文件 ? 1 2 3 4 5 6 <link href="__PUBLIC__/CSS/bootstrap.css" rel="exte ...
- 用file标签实现多图文件上传预览
效果图: js 代码: <script> //下面用于多图片上传预览功能 function setImagePreviews(avalue) { var docObj = document ...
- JQ实现图片上传预览功能
<input type="file" name="img" id="test1"> <img src="&quo ...
- JavaScript实现本地图片上传预览功能(兼容IE、chrome、FF)
需要解决的问题有:本地图片如何在上传前预览.编辑:最近发现这个功能很多是基于flash实现的,很多JavaScript实现的代码兼容性都很差,特别是在IE和firefox和chrome三个浏览器上不兼 ...
- [js] - 前端FileReader使用,适用于文件上传预览.(并未传入后端)
<body> <div class="box"> <div class="container"> <ul> &l ...
- js 移动端 多图上传 预览 删除 base64转为url 传给后端
说下主要的逻辑,首先是利用input type="file",上传文件,然后判断文件类型是否是图片,这里要注意(multiple,安卓一次一张,ios可以多张). 接着把本地图片转 ...
- js实现图片上传预览功能,使用base64编码来实现
实现图片上传的方法有很多,这里我们介绍比较简单的一种,使用base64对图片信息进行编码,然后直接将图片的base64信息存到数据库. 但是对于系统中需要上传的图片较多时并不建议采用这种方式,我们一般 ...
- 使用ajax,结合jquery,php实现图片上传预览功能
大致逻辑:点击页面的file,上传图片到指定的php处理图片的文件,处理完成以后,将图片的连接地址返回,JS控制返回的数据,然后将图片动态的展示出来html代码<label> <im ...
- HTML+Jquery实现多图片上传预览功能
HTML:使用input的onchange事件,它一改变就触发事件 <p id="p3"> <input name="File" onchan ...
随机推荐
- Ansible--配置文件及系列命令
Ansible目录结构 安装完成ansible后要知道ansible主要安装的了什么,安装的目录结构是什么,每个目录做什么的 可以使用:rpm -ql ansible | less 来查看ansibl ...
- Android JNI c/c++调用java 无需新建虚拟机
近期通过研究SDL源码 得出android JNI c/c++调用java 无需新建虚拟机: 具体步骤如下 第一步获得:两个参数 JNIEnv和jclass void Java_com_Test_A ...
- (后台)El表达式格式化两位小数
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>引入标签库. < ...
- WebSocket实现简单的在线聊天
SuperWebSocket在WebService中的应用 最开始使用是寄托在IIS中,发布之后测试时半个小时就会断开,所以改为WindowsService 1. 新建Windows服务项目[Test ...
- LeetCode题解之Binary Tree Paths
1.题目描述 2.分析 使用递归. 3.代码 vector<string> ans; vector<string> binaryTreePaths(TreeNode* root ...
- 安装Linux Mint 17后要做的20件事
Linux Mint 17 Qiana Cinnamon Linux Mint 17已经发布,定名为Qiana.Mint是Linux最佳发行版之一,它定位于桌面用户,关注可用性和简洁.它携带了风格迥异 ...
- 第七章 鼠标(CHECKER1)
CHECKER1程序将客户区划分成25个矩形,构成一个5*5的数组.如果在其中一个矩形内单击鼠标,就用X形填充该矩形.再次单击,则X形消失. /*--------------------------- ...
- .NET Core launch.json 简介
1.环境 Windows,.NET Core 2.0,VS Code dotnet> dotnet new console -o myApp 2.launch.json配置文件 { // Use ...
- 记录线上一次线程hang住问题
线上发现执行某特定任务在某个特定时间点后不再work.该任务由线程池中线程执行定时周期性调度,根据日志查看无任何异常.从代码研判应该无关定时任务框架,因为对提交的定时任务做了wrap,会将异常都cat ...
- one_code=soup.find('a',href=re.compile(r"ill")) NameError: name 're' is not defined
啊啊啊啊我又来了,真的是万事开头难啊,一个问题刚解决,又来了一个问题..依旧跟着视频教学,说“re"这里按Ctrl+e导入正则表达式,可我弄了半天也没有反应..以至于最后的运行结果就是这样. ...