前端讀取與導(dǎo)出XLSX文件的完整指南
一、前言
在實(shí)際業(yè)務(wù)場景中,我們經(jīng)常需要處理Excel文件的導(dǎo)入導(dǎo)出。本文將以React+Ant Design項(xiàng)目為例,演示如何通過xlsx庫實(shí)現(xiàn)以下功能:
- 讀取本地XLSX文件并解析為表格數(shù)據(jù)
- 將表格數(shù)據(jù)導(dǎo)出為XLSX文件
二、技術(shù)棧
- React: 構(gòu)建用戶界面
- Ant Design: UI組件庫
- xlsx (SheetJS): Excel文件處理庫
三、準(zhǔn)備工作
1. 創(chuàng)建React項(xiàng)目
npx create-react-app antd-xlsx --template typescript cd antd-xlsx
2. 安裝依賴
npm install antd @ant-design/icons xlsx
3. 目錄結(jié)構(gòu)
src/ ├── components/ │ └── XlsxHandler.tsx ├── App.tsx ├── index.tsx
四、核心實(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)文件類型
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ì)象
- 通過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列名
- 類型校驗(yàn):嚴(yán)格校驗(yàn)文件擴(kuò)展名防止格式錯(cuò)誤
- 內(nèi)存優(yōu)化:及時(shí)釋放FileReader實(shí)例避免內(nèi)存泄漏
六、常見問題排查
| 問題現(xiàn)象 | 解決方案 |
|---|---|
| 文件讀取失敗 | 確保使用readAsBinaryString而非readAsArrayBuffer |
| 中文亂碼 | 設(shè)置工作簿編碼為utf-8 |
| IE瀏覽器兼容 | 添加polyfill支持FileReader API |
| 大數(shù)據(jù)量卡頓 | 采用Web Workers進(jìn)行異步處理 |
七、擴(kuò)展方向
- 支持多工作表選擇
- 自定義導(dǎo)出模板
- 在線預(yù)覽Excel內(nèi)容
- 復(fù)雜公式計(jì)算支持
到此這篇關(guān)于前端讀取與導(dǎo)出XLSX文件的完整指南的文章就介紹到這了,更多相關(guān)前端讀取與導(dǎo)出XLSX內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
微信小程序?qū)崿F(xiàn)元素漸入漸出動(dòng)畫效果封裝方法
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)元素漸入漸出動(dòng)畫效果封裝方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
JS+CSS實(shí)現(xiàn)的經(jīng)典tab選項(xiàng)卡效果代碼
這篇文章主要介紹了JS+CSS實(shí)現(xiàn)的經(jīng)典tab選項(xiàng)卡效果代碼,通過簡單的鼠標(biāo)事件觸發(fā)js函數(shù)實(shí)現(xiàn)針對(duì)頁面元素的遍歷與樣式變換功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09
JavaScript深入V8引擎以及編寫優(yōu)化代碼的5個(gè)技巧
這篇文章主要介紹了JavaScript深入V8引擎以及編寫優(yōu)化代碼的5個(gè)技巧,JavaScript引擎是執(zhí)行 JavaScript 代碼的程序或解釋器。JavaScript引擎可以實(shí)現(xiàn)為標(biāo)準(zhǔn)解釋器,或者以某種形式將JavaScript編譯為字節(jié)碼的即時(shí)編譯器。,需要的朋友可以參考下2019-06-06
JS中利用swiper實(shí)現(xiàn)3d翻轉(zhuǎn)幻燈片實(shí)例代碼
大家都知道Swiper(Swiper master)是目前應(yīng)用較廣泛的移動(dòng)端網(wǎng)頁觸摸內(nèi)容滑動(dòng)js插件。下面這篇文章主要給大家介紹了在JS中利用swiper實(shí)現(xiàn)3d翻轉(zhuǎn)幻燈片的相關(guān)資料,文中給出了完整的示例代碼供大家參考學(xué)習(xí),需要的朋友可以參考借鑒,下面來一起看看吧。2017-08-08
JS實(shí)現(xiàn)顯示帶倒影的圖片橫排居中放大展示特效實(shí)例【測(cè)試可用】
這篇文章主要介紹了JS實(shí)現(xiàn)顯示帶倒影的圖片橫排居中放大展示功能,可實(shí)現(xiàn)點(diǎn)擊圖片及點(diǎn)擊左右按鈕滑動(dòng)切換的效果,涉及javascript針對(duì)鼠標(biāo)事件的響應(yīng)及頁面元素動(dòng)態(tài)操作相關(guān)技巧,需要的朋友可以參考下2016-08-08
element-ui 時(shí)間選擇器限制范圍的實(shí)現(xiàn)(隨動(dòng))
這篇文章主要介紹了element-ui 時(shí)間選擇器限制范圍(隨動(dòng)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01

