前端使用xlsx
import React, { useState, useEffect} from ‘react‘;
import { Table, Tag, Space } from ‘antd‘;
import XLSX from "xlsx";
const Xlsx = ({...props}) =>{
const [columns, setColumns] = useState([
{
title: ‘Name‘,
dataIndex: ‘name‘,
key: ‘name‘,
render: text => <a>{text}</a>,
},
{
title: ‘Age‘,
dataIndex: ‘age‘,
key: ‘age‘,
render: ()=> ‘xxx‘
},
{
title: ‘Address‘,
dataIndex: ‘address‘,
key: ‘address‘,
},
{
title: ‘Tags‘,
key: ‘tags‘,
dataIndex: ‘tags‘,
render: tags => (
<>
{tags.map(tag => {
let color = tag.length > 5 ? ‘geekblue‘ : ‘green‘;
if (tag === ‘loser‘) {
color = ‘volcano‘;
}
return (
<Tag color={color} key={tag}>
{tag.toUpperCase()}
</Tag>
);
})}
</>
),
},
{
title: ‘Action‘,
key: ‘action‘,
render: (text, record) => (
<Space size="middle">
<a>Invite {record.name}</a>
<a>Delete</a>
</Space>
),
},
]);
const [data, setData] = useState([
{
key: ‘1‘,
name: ‘John Brown‘,
age: 32,
address: ‘New York No. 1 Lake Park‘,
tags: [‘nice‘, ‘developer‘],
},
{
key: ‘2‘,
name: ‘Jim Green‘,
age: 42,
address: ‘London No. 1 Lake Park‘,
tags: [‘loser‘],
},
{
key: ‘3‘,
name: ‘Joe Black‘,
age: 32,
address: ‘Sidney No. 1 Lake Park‘,
tags: [‘cool‘, ‘teacher‘],
},
]);
useEffect(()=>{
console.log(‘初次进入‘);
},[]);
const exportExcle = () =>{
var elt = document.getElementsByTagName(‘table‘)[0];
console.log(elt)
// 将表格的dom 元素转化为 excel工作薄
var wb = XLSX.utils.table_to_book(elt, {sheet:"Sheet JS"});
// 将工作薄导出为excel文件
XLSX.writeFile(wb,‘导出.xlsx‘);
}
const onImportExcel = 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]);
}
return (
<div>
<button onClick={exportExcle}>
导出
</button>
<input type=‘file‘ accept=‘.xlsx, .xls‘ onChange={onImportExcel} />
<Table className=‘table‘ columns={columns} dataSource={data} />
</div>
)
}
export default Xlsx;
后端实现
export const downloadFile = (content, fileName) => {
const blob = new Blob([content]);
const downloadLink = document.createElement(‘a‘);
downloadLink.download = fileName;
downloadLink.style.display = ‘none‘;
downloadLink.href = URL.createObjectURL(blob);
document.body.appendChild(downloadLink);
downloadLink.click();
URL.revokeObjectURL(downloadLink);
document.body.removeChild(downloadLink);
};
原文:https://www.cnblogs.com/lixingqian/p/15100791.html