首先要准备react开发环境以及js-xlsx插件

1. 此处省略安装react安装步骤

2.下载js-xlsx插件

  1. yarn add xlsx 或者 npm install xlsx

在项目中引入

  1. import * as XLSX from 'xlsx';
  • 定义插件,并暴露出去
  1. /**
  2. * @author tangzedong.programmer@gmail.com
  3. * @apiNote excel预览插件
  4. * @since 2019-02-14 10:36:42
  5. */
  6. export default class Preview extends React.Component {
  7. //...
  8. }
  • 定义全局变量,用于数据接收后重新渲染页面
  1. state = {
  2. tableData: [], // table的数据
  3. tableHeader: [] // table的表头
  4. };
  • 通过render返回预览视图(用table表格预览数据,Table是使用的ant design)
  1. render() {
  2. return (
  3. <div>
  4. <Table columns={this.state.tableHeader} dataSource={this.state.tableData}/>
  5. </div>
  6. );
  7. }
  • 解析excel文件
  1. uploadFilesChange(file) {
  2. // 通过FileReader对象读取文件
  3. const fileReader = new FileReader();
  4. fileReader.onload = event => {
  5. try {
  6. const {result} = event.target;
  7. // 以二进制流方式读取得到整份excel表格对象
  8. const workbook = XLSX.read(result, {type: 'binary'});
  9. // 存储获取到的数据
  10. let data = {};
  11. // 遍历每张工作表进行读取(这里默认只读取第一张表)
  12. for (const sheet in workbook.Sheets) {
  13. let tempData = [];
  14. // esline-disable-next-line
  15. if (workbook.Sheets.hasOwnProperty(sheet)) {
  16. // 利用 sheet_to_json 方法将 excel 转成 json 数据
  17. console.log(sheet);
  18. data[sheet] = tempData.concat(XLSX.utils.sheet_to_json(workbook.Sheets[sheet]));
  19. }
  20. }
  21. const excelData = data.Sheet1;
  22. const excelHeader = [];
  23. // 获取表头
  24. for (const headerAttr in excelData[0]) {
  25. const header = {
  26. title: headerAttr,
  27. dataIndex: headerAttr,
  28. key: headerAttr
  29. };
  30. excelHeader.push(header);
  31. }
  32. // 解析后的变量赋值给state,重新渲染table页面
  33. // message.success('上传成功!')
  34. this.setState({
  35. tableData: excelData,
  36. tableHeader: excelHeader,
  37. })
  38. console.log(this.state)
  39. } catch (e) {
  40. // 这里可以抛出文件类型错误不正确的相关提示
  41. console.log(e);
  42. // message.error('文件类型不正确!');
  43. }
  44. }
  45. // 以二进制方式打开文件
  46. fileReader.readAsBinaryString(file.file);
  47. }

全部代码

(额外使用了ant design的Dragger、Table、message组件,实现拖拽点击上传)

  1. import React from "react";
  2. import * as XLSX from 'xlsx';
  3. import antd, {message, Table} from 'antd';
  4.  
  5. const Dragger = antd.upload.Dragger;
  6.  
  7. /**
  8. * @author tangzedong.programmer@gmail.com
  9. * @apiNote 音频、视频、excel、图片预览插件
  10. * @since 2019-02-14 10:36:42
  11. */
  12. export default class Preview extends React.Component {
  13. state = {
  14. tableData: [],
  15. tableHeader: []
  16. };
  17.  
  18. render() {
  19. return (
  20. <div>
  21. <Dragger name="file"
  22. beforeUpload={function () {
  23. return false;
  24. }}
  25. onChange={this.uploadFilesChange.bind(this)}
  26. showUploadList={false}>
  27. <p className="ant-upload-text">
  28. <span>点击上传文件</span>
  29. 或者拖拽上传
  30. </p>
  31. </Dragger>
  32. <Table columns={this.state.tableHeader} dataSource={this.state.tableData}/>
  33. </div>
  34. );
  35. }
  36.  
  37. uploadFilesChange(file) {
  38. // 通过FileReader对象读取文件
  39. const fileReader = new FileReader();
  40. fileReader.onload = event => {
  41. try {
  42. const {result} = event.target;
  43. // 以二进制流方式读取得到整份excel表格对象
  44. const workbook = XLSX.read(result, {type: 'binary'});
  45. // 存储获取到的数据
  46. let data = {};
  47. // 遍历每张工作表进行读取(这里默认只读取第一张表)
  48. for (const sheet in workbook.Sheets) {
  49.  
  50. let tempData = [];
  51. // esline-disable-next-line
  52. if (workbook.Sheets.hasOwnProperty(sheet)) {
  53. // 利用 sheet_to_json 方法将 excel 转成 json 数据
  54. console.log(sheet);
  55. data[sheet] = tempData.concat(XLSX.utils.sheet_to_json(workbook.Sheets[sheet]));
  56. }
  57. }
  58. const excelData = data.Sheet1;
  59. const excelHeader = [];
  60. // 获取表头
  61. for (const headerAttr in excelData[0]) {
  62. const header = {
  63. title: headerAttr,
  64. dataIndex: headerAttr,
  65. key: headerAttr
  66. };
  67. excelHeader.push(header);
  68. }
  69. // 最终获取到并且格式化后的 json 数据
  70. message.success('上传成功!')
  71. this.setState({
  72. tableData: excelData,
  73. tableHeader: excelHeader,
  74. })
  75. console.log(this.state)
  76. } catch (e) {
  77. // 这里可以抛出文件类型错误不正确的相关提示
  78. console.log(e);
  79. message.error('文件类型不正确!');
  80. }
  81. }
  82. // 以二进制方式打开文件
  83. fileReader.readAsBinaryString(file.file);
  84. }
  85.  
  86. }

特别鸣谢:https://blog.csdn.net/twodogya/article/details/87892765

如有疑问,请在下面留言评论,或者私信我,请多多指教!

  1. //

React + js-xlsx构建Excel文件上传预览功能的更多相关文章

  1. 基于bootstrap的上传插件fileinput实现ajax异步上传功能(支持多文件上传预览拖拽)

    首先需要导入一些js和css文件 ? 1 2 3 4 5 6 <link href="__PUBLIC__/CSS/bootstrap.css" rel="exte ...

  2. 用file标签实现多图文件上传预览

    效果图: js 代码: <script> //下面用于多图片上传预览功能 function setImagePreviews(avalue) { var docObj = document ...

  3. JQ实现图片上传预览功能

    <input type="file" name="img" id="test1"> <img src="&quo ...

  4. JavaScript实现本地图片上传预览功能(兼容IE、chrome、FF)

    需要解决的问题有:本地图片如何在上传前预览.编辑:最近发现这个功能很多是基于flash实现的,很多JavaScript实现的代码兼容性都很差,特别是在IE和firefox和chrome三个浏览器上不兼 ...

  5. [js] - 前端FileReader使用,适用于文件上传预览.(并未传入后端)

    <body> <div class="box"> <div class="container"> <ul> &l ...

  6. js 移动端 多图上传 预览 删除 base64转为url 传给后端

    说下主要的逻辑,首先是利用input type="file",上传文件,然后判断文件类型是否是图片,这里要注意(multiple,安卓一次一张,ios可以多张). 接着把本地图片转 ...

  7. js实现图片上传预览功能,使用base64编码来实现

    实现图片上传的方法有很多,这里我们介绍比较简单的一种,使用base64对图片信息进行编码,然后直接将图片的base64信息存到数据库. 但是对于系统中需要上传的图片较多时并不建议采用这种方式,我们一般 ...

  8. 使用ajax,结合jquery,php实现图片上传预览功能

    大致逻辑:点击页面的file,上传图片到指定的php处理图片的文件,处理完成以后,将图片的连接地址返回,JS控制返回的数据,然后将图片动态的展示出来html代码<label> <im ...

  9. HTML+Jquery实现多图片上传预览功能

    HTML:使用input的onchange事件,它一改变就触发事件 <p id="p3"> <input name="File" onchan ...

随机推荐

  1. Ansible--配置文件及系列命令

    Ansible目录结构 安装完成ansible后要知道ansible主要安装的了什么,安装的目录结构是什么,每个目录做什么的 可以使用:rpm -ql ansible | less 来查看ansibl ...

  2. Android JNI c/c++调用java 无需新建虚拟机

    近期通过研究SDL源码 得出android JNI  c/c++调用java 无需新建虚拟机: 具体步骤如下 第一步获得:两个参数 JNIEnv和jclass void Java_com_Test_A ...

  3. (后台)El表达式格式化两位小数

    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>引入标签库. < ...

  4. WebSocket实现简单的在线聊天

    SuperWebSocket在WebService中的应用 最开始使用是寄托在IIS中,发布之后测试时半个小时就会断开,所以改为WindowsService 1. 新建Windows服务项目[Test ...

  5. LeetCode题解之Binary Tree Paths

    1.题目描述 2.分析 使用递归. 3.代码 vector<string> ans; vector<string> binaryTreePaths(TreeNode* root ...

  6. 安装Linux Mint 17后要做的20件事

    Linux Mint 17 Qiana Cinnamon Linux Mint 17已经发布,定名为Qiana.Mint是Linux最佳发行版之一,它定位于桌面用户,关注可用性和简洁.它携带了风格迥异 ...

  7. 第七章 鼠标(CHECKER1)

    CHECKER1程序将客户区划分成25个矩形,构成一个5*5的数组.如果在其中一个矩形内单击鼠标,就用X形填充该矩形.再次单击,则X形消失. /*--------------------------- ...

  8. .NET Core launch.json 简介

    1.环境 Windows,.NET Core 2.0,VS Code dotnet> dotnet new console -o myApp 2.launch.json配置文件 { // Use ...

  9. 记录线上一次线程hang住问题

    线上发现执行某特定任务在某个特定时间点后不再work.该任务由线程池中线程执行定时周期性调度,根据日志查看无任何异常.从代码研判应该无关定时任务框架,因为对提交的定时任务做了wrap,会将异常都cat ...

  10. one_code=soup.find('a',href=re.compile(r"ill")) NameError: name 're' is not defined

    啊啊啊啊我又来了,真的是万事开头难啊,一个问题刚解决,又来了一个问题..依旧跟着视频教学,说“re"这里按Ctrl+e导入正则表达式,可我弄了半天也没有反应..以至于最后的运行结果就是这样. ...