React如何接收excel文件下载导出功能封装

目录
  • React接收excel文件下载导出功能封装
  • react导出excel文件的几种方式
    • 1.原生js导出 (带样式)
    • 2.使用xlsx导出(此方法导出的excel文件无样式,但导出的文件格式是 xlsx格式)
    • 3.使用 js-export-excel (可以导出多张sheet表)
    • 4.第四种 使用react-html-table-to-excel   不推荐使用

React接收excel文件下载导出功能封装

因为最近项目又需求要导出excel,所以封装了这部分的功能,对fetch的封装做了修改,使之后的调用导出功能更为方便

首先这个项目请求是对fetch进行过封装的 ,如果对fetch有了解的话,我们知道fetch种response返回的是一个实现了Body接口的对象, 所以可以使用Body接口中的方法 json()处理json,blob ()处理成blob文件对象 方法, 所以要先对封装的请求方法做如下修改

export default function request(url, option,noToken = false,type = 'json') {  
//这是封装request方法 noToken判断是否写代token  type用来区别 json/blob 这里我们需要下载文件所以传入blob
    ...
    .then(response => {
          if (newOptions.method === 'DELETE' || response.status === 204) {
            return response.text();
          }
          if(type == 'blob') {
           return  response.blob();  //处理成blob文件类型
          }
          return response.json();
        })
     .then(response => {
        if(type == 'blob') {
        return URL.createObjectURL(response); //使用URL.createObjectURL将blob放入一个object'
        ...
        }
       }
    }
}

上面我们通过一个参数,将blob文件处理成url

export async function exportExcel(params) {
  return request(`/api/xxxxx/${params}`,{method: 'GET'} ,false ,'blob' );
}  

上面就是我们导出文件的请求接口,获得的是一个url,然后我们在effect中接受url

* exportExcel({payload}, {call,put}) {
  try {
    const url = yield call(exportExcel, payload); //收到一个url
     let link = document.createElement('a') //创建一个a标签
     link.style.display = 'none' //不显示
     link.href = url  //将地址填入
     link.setAttribute('download', '表格.xlsx') //设置下载属性,取个文件名
     document.body.appendChild(link) //添加到页面上
     link.click() //点击触发下载
  } catch (e) {
  }
},

到这里就是实现了文件的导出,基本原理就是将接受的文件处理成url,用a标签触发下载

其实本来到这里就应该结束了,但是作为一个有原则的程序员, 反复添加a标签显示让我们觉得很不规范, 所以我们来改写成一直复用一个a标签来下载,动态修改url\\现在BasicLayout里加个a标签,因为这个是登陆都最先加载的,保证每个模块都能使用

   <a  
   style={{display: 'none'}} 
   ref={(link)=> {this.props.dispatch({type: 'global/saveLink', payload: link})}} //这个是用来讲a标签的ref存到redux里,随时可以调用
   ></a>

**然后我们在modes/global里写两个reducer**

  reducers: {
    saveLink(state, { payload }) {
    //保存a标签
      return {
        ...state,
        link: payload,
      }
    },
    exportFile(state, { payload }) {
    //设置a标签的地址并触发点击下载
      state.link.href = payload.url
      state.link.setAttribute('download',payload.name)
      state.link.click()
      return {
        ...state,
      };
    },
}

然后我们在普通的模块中effect调用时只需要这么写

* exportExcel({payload}, {call,put}) {
  try {
    const url = yield call(exportExcel, payload); //收到一个url
    yield put({type: 'global/exportFile',payload: {url,name: `表格.xlsx`}}) //设置地址并触发下载 
  } catch (e) {
  }
},

这样写方便了很多 ,其实最好的方式是将这部分代码封装到一个组件中,单独调用,这里就不演示了,写法差不多

react导出excel文件的几种方式

一共总结了四种方法  前两种适用范围比较广泛 可以适用导出多级表头合并等,第三种方法导出的文件比较中规中矩,但是支持导出多张sheet表。第四种方法导出不推荐使用

1.原生js导出 (带样式)

/**
 *  原生JS导出为excel文件
 */
export const jsToExcel = (id, name) => {
    //window.location.href='<%=basePath%>pmb/excelShowInfo.do';
    //获取表格
    var exportFileContent = document.getElementById(id).outerHTML;
    //设置格式为Excel,表格内容通过btoa转化为base64,此方法只在文件较小时使用(小于1M)
    //exportFileContent=window.btoa(unescape(encodeURIComponent(exportFileContent)));
    //var link = "data:"+MIMEType+";base64," + exportFileContent;
    //使用Blob
    var blob = new Blob([exportFileContent], { type: "text/plain;charset=utf-8" });         //解决中文乱码问题
    blob = new Blob([String.fromCharCode(0xFEFF), blob], { type: blob.type });
    //设置链接
    var link = window.URL.createObjectURL(blob);
    var a = document.createElement("a");    //创建a标签
    a.download = name;  //设置被下载的超链接目标(文件名)   建议文件后缀为 .xls
    a.href = link;                            //设置a标签的链接
    document.body.appendChild(a);            //a标签添加到页面
    a.click();                                //设置a标签触发单击事件
    document.body.removeChild(a);            //移除a标签
}

使用方式

<table id='table_report'>...</table>
 
<div onClick={() => jsToExcel('table_report', '现券交易异常日报.xls')}>导出</div>

如果想导出xlsx格式请参考方法2,方法1仅改文件后缀 不会被Excel识别  但是wps可以

2.使用xlsx导出(此方法导出的excel文件无样式,但导出的文件格式是 xlsx格式)

首先安装xlsx  : yarn add xlsx

import XLSX from "xlsx"
 
 
/**
 *  用XLSX导出 (导出无样式)
 */
export const exportExcel = (id, name) => {
    var exportFileContent = document.getElementById(id).cloneNode(true);
    var wb = XLSX.utils.table_to_book(exportFileContent, { sheet: "sheet1" });
    XLSX.writeFile(wb, name);
}
    

使用方式

<table id='table_report'>...</table>
 
<div onClick = {() => exportExcel('table_report', '现券交易异常日报.xlsx')}>导出</div>

3.使用 js-export-excel (可以导出多张sheet表)

首先安装 js-export-excel  : yarn add js-export-excel

import { Table } from 'antd';
import { columns } from './config';
import ExportJsonExcel from "js-export-excel";
import { PlusCircleOutlined } from '@ant-design/icons';
 
function Tables(props) {
  const { isLoading, viewData, data } = props;
  // data格式
  const data1 = [
    {
      adID: "张三",
      leaveCount: 26,
      leaveDuration: 82,
      leaveType: "调休",
      name: "张三"
    },
    {
      adID: "张三1",
      leaveCount: 526,
      leaveDuration: 82,
      leaveType: "调休",
      name: "张三1"
    },
    {
      adID: "张三1",
      leaveCount: 26,
      leaveDuration: 852,
      leaveType: "调休",
      name: "张三1"
    },
    {
      adID: "张三1",
      leaveCount: 256,
      leaveDuration: 82,
      leaveType: "调休",
      name: "张三1"
    },
  ]
  /**
   *  导出数据
   */
  const handleExportCurrentExcel = (data) => {
    let sheetFilter = ["name", "leaveType", "leaveCount", "leaveDuration"];
    let sheetFilter2 = ["name", "leaveType", "leaveCount", "leaveDuration"];
    let option = {};
    option.fileName = '考勤分析结果';
    option.datas = [
      {
        sheetData: data1,
        sheetName: '考勤分析结果',
        sheetFilter: sheetFilter,
        sheetHeader: ['姓名', '类型', '次数', '时长'],
        columnWidths: [10, 10, 10, 10]
      },
      {
        sheetData: data1,  //比较懒得造数据了  跟表1数据一样
        sheetName: '考勤分析结果222',
        sheetFilter: sheetFilter2,
        sheetHeader: ['姓名22', '类型22', '次数22', '时长22'],
        columnWidths: [10, 10, 10, 10]
      },
    ];
    var toExcel = new ExportJsonExcel(option); //new
    toExcel.saveExcel(); //保存
  }
 
  return (
    <div>
      <div className='exportButton' onClick={() => handleExportCurrentExcel(data)}>
        <PlusCircleOutlined className='icon-but' />
        导出当前数据
      </div>
      <Table
        loading={isLoading}
        columns={columns}
        dataSource={viewData}
        pagination={false}
      />
    </div>
  )
}
export default Tables;

4.第四种 使用react-html-table-to-excel   不推荐使用

安装   react-html-table-to-excel : yarn add react-html-table-to-excel

import React, {  useRef, useEffect } from 'react';
import { Table } from "antd";
import {  columns } from './config';
import ReactHTMLTableToExcel from 'react-html-table-to-excel';
import styles from './index.module.less';
function StudyExcel() {
 
    const data = [
        {
            key: '0',
            name: '张三'
        },
        {
            key: '1',
            name: '赵四'
        },
        {
            key: '2',
            name: '王五'
        },
        {
            key: '3',
            name: '齐六'
        }
    ];
 
    // 用ref来获取组件按钮实例,使用里面的方法
    const buttonRef = useRef(null);
 
    // 禁止组件按钮的默认点击事件
    useEffect(() => {
        const button = document.querySelector('#test-table-xls-button');
        button.style['pointer-events'] = ('none');
    }, []);
 
 
    // 导出表格
    const exportTable = (e) => {
        e.stopPropagation();
        const table = document.getElementsByTagName('table');
        const container = document.querySelector('#hiddenBox');
        const tempTable = document.createElement('table');
        tempTable.appendChild(table[0]);
        tempTable.setAttribute('id', 'table-to-xls');                    // 给table添加id,值与按钮上的table字段对应
        container.appendChild(tempTable);                                // 把创建的节点添加到页面容器中
        buttonRef.current.handleDownload();                              // 手动触发下载
    };
    return (
        <div style={{ backgroundColor: '#fff' }} className={styles.container}>
            <span onClick={(e) => exportTable(e)}>
                <ReactHTMLTableToExcel
                    width={1900}
                    ref={buttonRef}
                    table="table-to-xls"
                    id='test-table-xls-button'
                    filename='回购日报'
                    sheet='表1'
                    buttonText='导出Excel'
                />
            </span>
            <Table
                columns={columns}
                dataSource={data}
                bordered
                pagination={false}
            />
            <div id='hiddenBox' style={{ position: 'absolute', zIndex: -1, top: 0, left: 0 }} />
        </div>
    )
}
export default StudyExcel;

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • React的特征单向数据流学习

    目录 正文 状态 => 视图 事件 => 状态改变 => 视图 正文 React推荐one-way单向数据流,注意只是推荐,并不强制,常见有以下两种情况: 状态 => 视图 事件 => 状态改变 => 视图 状态 => 视图 import React from 'react' const App = () => { //设置状态 const [data, setData] = React.useState('状态 => 视图') return ( &l

  • React项目中使用Redux的 react-redux

    目录 背景 UI 组件 容器组件 connect() mapStateToProps() mapDispatchToProps() 组件 实例:计数器 背景 在前面文章一文理解Redux及其工作原理中,我们了解到redux是用于数据状态管理,而react是一个视图层面的库 如果将两者连接在一起,可以使用官方推荐react-redux库,其具有高效且灵活的特性 react-redux将组件分成: 容器组件:存在逻辑处理 UI 组件:只负责现显示和交互,内部不处理逻辑,状态由外部控制 通过redux

  • react Scheduler 实现示例教程

    目录 正文 简单的css动画 etTimeout来实现 循环处理 具体思路 正文 最近在看react源码,react构建fiber树这一块逻辑还比较好理解,但是一旦涉及到任务调度相关的逻辑,看起来是一头雾水.在参考了一些资料和react scheduler源码后,我决定来实现一个简单版的scheduler,相信跟着本文的思路实现一遍,就可以理解为什么react需要有scheduler这个东西来调度任务. 简单的背景知识: 我们知道现在大部分设备的帧率都是60fps,也就是说浏览器每16.7ms会

  • react中的watch监视属性-useEffect介绍

    目录 react的watch监视属性-useEffect useEffect使用指南 最基本的使用 响应更新 如何处理Loading和Error 处理表单 自定义hooks 使用useReducer整合逻辑 取消数据请求 react的watch监视属性-useEffect 在vue中可以使用watch属性,去监视一个值,当这个值进行变化的时候就去执行一些操作.在react是没有这个属性的,但是它也一样可以达到相同的效果,那么接下来看看它是怎么实现的呢? 在react中实现监听效果有一个比较简单的

  • react-router-dom v6 使用详细示例

    目录 一.基本使用 二.路由跳转 2.1 Link 组件 2.2 NavLink 组件 2.3 编程式跳转 三.动态路由参数 3.1 路径参数 路径匹配规则 兼容类组件 3.2 search 参数 四.嵌套路由 5.1 路由定义 5.2 在父组件中展示 5.3 在组件中定义 五.默认路由 六.全匹配路由 七.多组路由 八.路由重定向 九.布局路由 十.订阅和操作 history stack的原理 10.1 History对象 11.2 Location对象 state key 十一. 各类Rou

  • React如何接收excel文件下载导出功能封装

    目录 React接收excel文件下载导出功能封装 react导出excel文件的几种方式 1.原生js导出 (带样式) 2.使用xlsx导出(此方法导出的excel文件无样式,但导出的文件格式是 xlsx格式) 3.使用 js-export-excel (可以导出多张sheet表) 4.第四种 使用react-html-table-to-excel   不推荐使用 React接收excel文件下载导出功能封装 因为最近项目又需求要导出excel,所以封装了这部分的功能,对fetch的封装做了修

  • vue使用axios实现excel文件下载的功能

    前端VUE页面上的导出或者下载功能,一般是调用后端的一个接口,由接口生成excel,word这些文件的流信息,返回给vue,然后由vue去构建下载的动作,这边整理了一下,封装了一下,方便以后复用. 封装一个download文件 使用年月日时分秒毫秒做为文件的名称,下载为excel文件 /** * 下载文件 */ export const downloadFile = (url,ext, params) => { let accessToken = getStore('accessToken');

  • Easypoi 轻松实现复杂excel文件导出功能

    之前做的excel文件导出都相对简单,用的都是公司自己封装的一些poi方法,导出内容都是表头+一行行的数据,但是这次需要导出的excel复杂度高了不少,自己用现有方法做比较麻烦,因此引入了Easypoi 进行实现. 之所以用Easypoi我是看中了它可以直接根据现有模板填充数据实现excel生成,而模板产品已经给出,那么接下来只需要稍微做修改就能使用,修改后的模板如图: 对照着官方文档的示例(http://easypoi.mydoc.io/ ) 很容易就能理解模板的使用规则 注意其中的{{$fe

  • SpringBoot整合EasyExcel实现Excel表格导出功能

    目录 栗子 1.组件介绍 2.配置文件 SpringBoot项目pom.xml 3.项目代码 项目结构 ExportController.java Mock.java CitySheet.java CompanySheet.java UserSheet.java SpringBootEasyexcelApplication.java 4.效果展示 单个sheet导出 多个sheet导出 5.总结 栗子 在后端管理系统的开发中,经常有需要导出当前表格数据的功能,有些前端表格组件可以直接做到,但是不

  • C#使用NPOI实现Excel导入导出功能

    本文实例为大家分享了C#使用NPOI实现Excel导入导出的具体代码,供大家参考,具体内容如下 Excel导入 使用OpenFileDiolog控件和button结合,选择文件导入,将路径显示在文本框 设置按钮点击事件,将文件路径赋给textBox.Text private void Department_SUM_Click(object sender, EventArgs e)         {             OpenFileDialog open = new OpenFileDi

  • 详解Java如何实现百万数据excel导出功能

    目录 前言 1.异步处理 1.1 使用job 1.2 使用mq 2.使用easyexcel 3.分页查询 4.多个sheet 5.计算limit的起始位置 6.文件上传到OSS 7.通过WebSocket推送通知 8.总条数可配置 9.order by商品编号 总结 前言 最近我做过一个MySQL百万级别数据的excel导出功能,已经正常上线使用了. 这个功能挺有意思的,里面需要注意的细节还真不少,现在拿出来跟大家分享一下,希望对你会有所帮助. 原始需求:用户在UI界面上点击全部导出按钮,就能导

  • SpringBoot+EasyPoi实现excel导出功能

    在实际项目开发中,对于Excel的导入导出还是很常见的需求,比如说将数据根据模板批量导入到数据库中,以及将数据库中的数据批量导出陈Excel的形式 现有需求: 根据检索条件查询列表并将结果导出到excel Easypoi文档:https://easypoi.mydoc.io/#text_186900 EasyPoi的主要特点 1.设计精巧,使用简单 2.接口丰富,扩展简单 3.默认值多,write less do more 4.spring mvc支持,web导出可以简单明了 实现过程 1.创建

  • Asp.Net Core实现Excel导出功能的实现方法

    目录 安装 ClosedXML 将数据导出成 CSV 文件 将数据导出成 XLSX 文件 下载 Excel 在web应用程序开发时,或许你会遇到这样的需求,如何在 Asp.Net Core 中实现 excel 或者 word 的导入导出,在 NuGet 上有大量的工具包可以实现这样的功能,本篇就讨论下如何使用 ClosedXML 实现 Excel 数据导出. 安装 ClosedXML 如果想实现 Excel 的导出功能,在 Asp.Net Core 中有很多的dll可以做到,其中的一个叫做 Cl

  • vue中后端做Excel导出功能返回数据流前端的处理操作

    项目中有一个导出功能的实现,用博客来记录一下.因为需求对导出表格的数据格式和样式有要求,所以这个导出功能放到后端来做,而且后端返回的是数据流,所以需要处理成想要的表格并导出来. 先看下效果图: 页面效果: 点击 导出Excel 调用导出接口成功了: 后台返回的数据流,一堆看不懂的乱码: 接下来要处理这堆乱码,因为用到的地方多,所以在util.js文件里封装了一个公共方法并抛出: 虽然vue里有封装好的请求接口的方法,但这里要单独用axios,所以先在util.js里引入axios import

  • Java中Easypoi实现excel多sheet表导入导出功能

    Easypoi简化了开发中对文档的导入导出实现,并不像poi那样都要写大段工具类来搞定文档的读写. 第一步引入Easypoi依赖 <!-- 导出文件工具 EasyPoi实现Excel读写管理测试用例 --> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-spring-boot-starter</artifactId> <version>4.

随机推荐