react導(dǎo)出excel文件的四種方式
一共總結(jié)了四種方法 前兩種適用范圍比較廣泛 可以適用導(dǎo)出多級(jí)表頭合并等,第三種方法導(dǎo)出的文件比較中規(guī)中矩,但是支持導(dǎo)出多張sheet表。第四種方法導(dǎo)出不推薦使用
1、原生js導(dǎo)出 (帶樣式)
/**
* 原生JS導(dǎo)出為excel文件
*/
export const jsToExcel = (id, name) => {
//window.location.href='<%=basePath%>pmb/excelShowInfo.do';
//獲取表格
var exportFileContent = document.getElementById(id).outerHTML;
//設(shè)置格式為Excel,表格內(nèi)容通過(guò)btoa轉(zhuǎn)化為base64,此方法只在文件較小時(shí)使用(小于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" }); //解決中文亂碼問(wèn)題
blob = new Blob([String.fromCharCode(0xFEFF), blob], { type: blob.type });
//設(shè)置鏈接
var link = window.URL.createObjectURL(blob);
var a = document.createElement("a"); //創(chuàng)建a標(biāo)簽
a.download = name; //設(shè)置被下載的超鏈接目標(biāo)(文件名) 建議文件后綴為 .xls
a.href = link; //設(shè)置a標(biāo)簽的鏈接
document.body.appendChild(a); //a標(biāo)簽添加到頁(yè)面
a.click(); //設(shè)置a標(biāo)簽觸發(fā)單擊事件
document.body.removeChild(a); //移除a標(biāo)簽
}使用方式
<table id='table_report'>...</table>
<div onClick={() => jsToExcel('table_report', '現(xiàn)券交易異常日?qǐng)?bào).xls')}>導(dǎo)出</div>如果想導(dǎo)出xlsx格式請(qǐng)參考方法2,方法1僅改文件后綴 不會(huì)被Excel識(shí)別 但是wps可以
2、使用xlsx導(dǎo)出(此方法導(dǎo)出的excel文件無(wú)樣式,但導(dǎo)出的文件格式是 xlsx格式的)
首先安裝xlsx : yarn add xlsx
import XLSX from "xlsx"
/**
* 用XLSX導(dǎo)出 (導(dǎo)出無(wú)樣式)
*/
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', '現(xiàn)券交易異常日?qǐng)?bào).xlsx')}>導(dǎo)出</div>3、使用 js-export-excel (可以導(dǎo)出多張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: "調(diào)休",
name: "張三"
},
{
adID: "張三1",
leaveCount: 526,
leaveDuration: 82,
leaveType: "調(diào)休",
name: "張三1"
},
{
adID: "張三1",
leaveCount: 26,
leaveDuration: 852,
leaveType: "調(diào)休",
name: "張三1"
},
{
adID: "張三1",
leaveCount: 256,
leaveDuration: 82,
leaveType: "調(diào)休",
name: "張三1"
},
]
/**
* 導(dǎo)出數(shù)據(jù)
*/
const handleExportCurrentExcel = (data) => {
let sheetFilter = ["name", "leaveType", "leaveCount", "leaveDuration"];
let sheetFilter2 = ["name", "leaveType", "leaveCount", "leaveDuration"];
let option = {};
option.fileName = '考勤分析結(jié)果';
option.datas = [
{
sheetData: data1,
sheetName: '考勤分析結(jié)果',
sheetFilter: sheetFilter,
sheetHeader: ['姓名', '類(lèi)型', '次數(shù)', '時(shí)長(zhǎng)'],
columnWidths: [10, 10, 10, 10]
},
{
sheetData: data1, //比較懶得造數(shù)據(jù)了 跟表1數(shù)據(jù)一樣
sheetName: '考勤分析結(jié)果222',
sheetFilter: sheetFilter2,
sheetHeader: ['姓名22', '類(lèi)型22', '次數(shù)22', '時(shí)長(zhǎng)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' />
導(dǎo)出當(dāng)前數(shù)據(jù)
</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來(lái)獲取組件按鈕實(shí)例,使用里面的方法
const buttonRef = useRef(null);
// 禁止組件按鈕的默認(rèn)點(diǎn)擊事件
useEffect(() => {
const button = document.querySelector('#test-table-xls-button');
button.style['pointer-events'] = ('none');
}, []);
// 導(dǎo)出表格
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字段對(duì)應(yīng)
container.appendChild(tempTable); // 把創(chuàng)建的節(jié)點(diǎn)添加到頁(yè)面容器中
buttonRef.current.handleDownload(); // 手動(dòng)觸發(fā)下載
};
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='回購(gòu)日?qǐng)?bào)'
sheet='表1'
buttonText='導(dǎo)出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;到此這篇關(guān)于react導(dǎo)出excel文件的四種方式的文章就介紹到這了,更多相關(guān)react導(dǎo)出excel文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
react antd實(shí)現(xiàn)動(dòng)態(tài)增減表單
antd是react流行的ui框架庫(kù),本文主要介紹了react antd實(shí)現(xiàn)動(dòng)態(tài)增減表單,分享給大家,感興趣的小伙伴們可以參考一下2021-06-06
react實(shí)現(xiàn)移動(dòng)端下拉菜單的示例代碼
這篇文章主要介紹了react實(shí)現(xiàn)移動(dòng)端下拉菜單的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
如何對(duì)react hooks進(jìn)行單元測(cè)試的方法
這篇文章主要介紹了如何對(duì)react hooks進(jìn)行單元測(cè)試的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
解決React報(bào)錯(cuò)Expected an assignment or funct
這篇文章主要為大家介紹了React報(bào)錯(cuò)Expected an assignment or function call and instead saw an expression解決方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
React中useCallback useMemo使用方法快速精通
在React函數(shù)組件中,當(dāng)組件中的props發(fā)生變化時(shí),默認(rèn)情況下整個(gè)組件都會(huì)重新渲染。換句話說(shuō),如果組件中的任何值更新,整個(gè)組件將重新渲染,包括沒(méi)有更改values/props的函數(shù)/組件。在react中,我們可以通過(guò)memo,useMemo以及useCallback來(lái)防止子組件的rerender2023-02-02

