React+Ant Design前端實(shí)現(xiàn)讀取與導(dǎo)出Excel文件
一、前言
在實(shí)際業(yè)務(wù)場(chǎng)景中,我們經(jīng)常需要處理 Excel 文件的導(dǎo)入導(dǎo)出。無(wú)論是數(shù)據(jù)填報(bào)、報(bào)表生成還是數(shù)據(jù)分析,Excel 作為一種廣泛使用的電子表格格式,與前端應(yīng)用的結(jié)合愈發(fā)緊密。本文將以 React + Ant Design 項(xiàng)目為例,演示如何通過(guò) xlsx 庫(kù)實(shí)現(xiàn)以下功能:
- 讀取本地 XLSX 文件并解析為表格數(shù)據(jù)
- 將表格數(shù)據(jù)導(dǎo)出為 XLSX 文件
二、技術(shù)棧
React: 構(gòu)建用戶(hù)界面,憑借其高效的渲染機(jī)制和豐富的生態(tài)系統(tǒng),成為現(xiàn)代 Web 開(kāi)發(fā)的熱門(mén)選擇。
Ant Design: UI 組件庫(kù),提供了一套美觀且易用的 UI 組件,大大加快了開(kāi)發(fā)速度。
xlsx (SheetJS): Excel 文件處理庫(kù),功能強(qiáng)大,支持多種 Excel 操作,如讀寫(xiě)、格式化等。
三、準(zhǔn)備工作
1. 創(chuàng)建React項(xiàng)目
npx create-react-app antd-xlsx --template typescript cd antd-xlsx
此命令會(huì)創(chuàng)建一個(gè)基于 TypeScript 的 React 項(xiàng)目,并為后續(xù)開(kāi)發(fā)做好準(zhǔn)備。
2. 安裝依賴(lài)
npm install antd @ant-design/icons xlsx
安裝所需的依賴(lài)包,包括 Ant Design 組件庫(kù)、圖標(biāo)庫(kù)以及用于處理 Excel 文件的 xlsx 庫(kù)。
3. 目錄結(jié)構(gòu)
src/
├── components/
│ └── XlsxHandler.tsx
├── App.tsx
├── index.tsx
合理的目錄結(jié)構(gòu)有助于項(xiàng)目的組織和維護(hù)。
四、核心實(shí)現(xiàn)
1. 文件讀取模塊
import React, { useState } from 'react';
import { Upload, Table, Button } from 'antd';
import * as XLSX from 'xlsx';
import { InboxOutlined } from '@ant-design/icons';
const XlsxHandler = () => {
const [dataSource, setDataSource] = useState<any[]>([]);
const [headers, setHeaders] = useState<string[]>([]);
// 文件讀取處理
const handleFileChange = (info: any) => {
const file = info.file;
if (!file) return;
// 校驗(yàn)文件類(lèi)型
const isXlsx = file.name.endsWith('.xlsx') || file.name.endsWith('.xls');
if (!isXlsx) {
info.status = 'error';
info.response = '請(qǐng)選擇正確的Excel文件';
return;
}
const reader = new FileReader();
reader.onload = (e: any) => {
const binaryStr = e.target.result;
const workbook = XLSX.read(binaryStr, { type: 'binary' });
const firstSheetName = workbook.SheetNames[0];
const sheet = workbook.Sheets[firstSheetName];
// 提取表頭
const jsonData = XLSX.utils.sheet_to_json(sheet);
if (jsonData.length > 0) {
setHeaders(Object.keys(jsonData[0]))
setDataSource(jsonData);
}
};
reader.readAsBinaryString(file);
};
// 數(shù)據(jù)導(dǎo)出功能
const exportToExcel = () => {
const ws = XLSX.utils.json_to_sheet(dataSource);
const wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, 'ExportedData');
XLSX.writeFile(wb, `export_${Date.now()}.xlsx`);
};
return (
<div style={{ padding: 20 }}>
<Upload
beforeUpload={handleFileChange}
showUploadList={false}
maxCount={1}
accept=".xlsx,.xls"
>
<Button icon={<InboxOutlined />}>選擇Excel文件</Button>
</Upload>
{headers.length > 0 && (
<Table
dataSource={dataSource}
rowKey="id"
pagination={{ pageSize: 10 }}
style={{ marginTop: 20 }}
>
{headers.map((header) => (
<Table.Column key={header} title={header} dataIndex={header} />
))}
</Table>
)}
<Button
type="primary"
onClick={exportToExcel}
disabled={!headers.length}
style={{ marginTop: 20 }}
icon={<DownloadOutlined />}
>
導(dǎo)出當(dāng)前數(shù)據(jù)
</Button>
</div>
);
};
export default XlsxHandler;
2. 主應(yīng)用集成
import React from 'react';
import './App.css';
import { ConfigProvider } from 'antd';
import XlsxHandler from './components/XlsxHandler';
import { DownloadOutlined } from '@ant-design/icons';
function App() {
return (
<ConfigProvider>
<div className="App">
<h1>Excel文件處理示例</h1>
<XlsxHandler />
</div>
</ConfigProvider>
);
}
export default App;
五、技術(shù)要點(diǎn)解析
1. 文件讀取流程
- 使用HTML5的File API獲取文件對(duì)象
- 通過(guò)FileReader讀取二進(jìn)制內(nèi)容
- 使用SheetJS解析二進(jìn)制流生成工作簿
- 提取第一個(gè)工作表的數(shù)據(jù)
- 轉(zhuǎn)換為JSON格式渲染表格
2. 數(shù)據(jù)導(dǎo)出流程
- 將JSON數(shù)據(jù)轉(zhuǎn)換為工作表
- 創(chuàng)建新的工作簿并添加工作表
- 使用writeFile方法生成Excel文件
3. 關(guān)鍵技術(shù)點(diǎn)
- 二進(jìn)制處理:必須使用
readAsBinaryString方法讀取文件 - 鍵值映射:JSON字段名對(duì)應(yīng)Excel列名
- 類(lèi)型校驗(yàn):嚴(yán)格校驗(yàn)文件擴(kuò)展名防止格式錯(cuò)誤
- 內(nèi)存優(yōu)化:及時(shí)釋放FileReader實(shí)例避免內(nèi)存泄漏
到此這篇關(guān)于React+Ant Design前端實(shí)現(xiàn)讀取與導(dǎo)出Excel文件的文章就介紹到這了,更多相關(guān)React讀取與導(dǎo)出Excel內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ReactQuery系列之?dāng)?shù)據(jù)轉(zhuǎn)換示例詳解
這篇文章主要為大家介紹了ReactQuery系列之?dāng)?shù)據(jù)轉(zhuǎn)換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
react搭建在線編輯html的站點(diǎn)通過(guò)引入grapes實(shí)現(xiàn)在線拖拉拽編輯html
Grapes插件是一種用于Web開(kāi)發(fā)的開(kāi)源工具,可以幫助用戶(hù)快速創(chuàng)建動(dòng)態(tài)和交互式的網(wǎng)頁(yè)元素,它還支持多語(yǔ)言和多瀏覽器,適合開(kāi)發(fā)響應(yīng)式網(wǎng)頁(yè)和移動(dòng)應(yīng)用程序,這篇文章主要介紹了react搭建在線編輯html的站點(diǎn)通過(guò)引入grapes實(shí)現(xiàn)在線拖拉拽編輯html,需要的朋友可以參考下2023-08-08
React ant 點(diǎn)擊導(dǎo)航條閃爍問(wèn)題解決
很多小伙伴反饋React ant 點(diǎn)擊導(dǎo)航條閃爍,沒(méi)有傳遞具體的參數(shù)給點(diǎn)擊事件 , 導(dǎo)致在函數(shù)內(nèi)部無(wú)法準(zhǔn)確判斷要展示哪個(gè)子菜單,可能導(dǎo)致頁(yè)面狀態(tài)的短暫變化,出現(xiàn)閃爍效果,下面給大家分享解決方法,感興趣的的朋友跟隨小編一起看看吧2024-04-04
JavaScript中rem布局在react中的應(yīng)用
這篇文章主要介紹了JavaScript中rem布局在react中的應(yīng)用 的相關(guān)資料,需要的朋友可以參考下2015-12-12
react.js使用webpack搭配環(huán)境的入門(mén)教程
本文主要介紹了react 使用webpack搭配環(huán)境的入門(mén)教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-08-08
Electron打包React生成桌面應(yīng)用方法詳解
這篇文章主要介紹了React+Electron快速創(chuàng)建并打包成桌面應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-12-12
TypeScript在React中的應(yīng)用技術(shù)實(shí)例解析
這篇文章主要為大家介紹了TypeScript在React中的應(yīng)用技術(shù)實(shí)例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
使用react+redux實(shí)現(xiàn)計(jì)數(shù)器功能及遇到問(wèn)題
使用redux管理數(shù)據(jù),由于Store獨(dú)立于組件,使得數(shù)據(jù)管理獨(dú)立于組件,解決了組件之間傳遞數(shù)據(jù)困難的問(wèn)題,非常好用,今天重點(diǎn)給大家介紹使用react+redux實(shí)現(xiàn)計(jì)數(shù)器功能及遇到問(wèn)題,感興趣的朋友參考下吧2021-06-06

