React 全面解析excel文件
React解析excel文件
首先安裝安裝xlsx插件
yarn add xlsx
使用xlsx解析
? ? /** ? ? ?* 上傳文件并解析成json ? ? ?*/ ? ? const HandleImportFile = (info) => { ? ? ? ? let files = info.file; ? ? ? ? // 獲取文件名稱 ? ? ? ? let name = files.name ? ? ? ? // 獲取文件后綴 ? ? ? ? let suffix = name.substr(name.lastIndexOf(".")); ? ? ? ? let reader = new FileReader(); ? ? ? ? reader.onload = (event) => { ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? // 判斷文件類型是否正確 ? ? ? ? ? ? ? ? if (".xls" != suffix && ".xlsx" != suffix) { ? ? ? ? ? ? ? ? ? ? message.error("選擇Excel格式的文件導(dǎo)入!"); ? ? ? ? ? ? ? ? ? ? return false; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? let { result } = event.target; ? ? ? ? ? ? ? ? // 讀取文件 ? ? ? ? ? ? ? ? let workbook = XLSX.read(result, { type: 'binary' }); ? ? ? ? ? ? ? ? let data = []; ? ? ? ? ? ? ? ? // 循環(huán)文件中的每個(gè)表 ? ? ? ? ? ? ? ? for (let sheet in workbook.Sheets) { ? ? ? ? ? ? ? ? ? ? if (workbook.Sheets.hasOwnProperty(sheet)) { ? ? ? ? ? ? ? ? ? ? ? ? // 將獲取到表中的數(shù)據(jù)轉(zhuǎn)化為json格式 ? ? ? ? ? ? ? ? ? ? ? ? data = data.concat(XLSX.utils.sheet_to_json(workbook.Sheets[sheet])); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? console.log('data:', data); ? ? ? ? ? ? } catch (e) { ? ? ? ? ? ? ? ? message.error('文件類型不正確!'); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? reader.readAsBinaryString(files); ? ? ? ? setIsLoading(false); ? ? }
使用antd的Upload組件上傳文件
?<Upload ? ? accept=".xls , .xlsx" ? ? maxCount={1} ? ? showUploadList={false} ? ? customRequest={HandleImportFile} ? > ? ?<Button icon={<UploadOutlined />} type="primary">上傳文件</Button> ?</Upload>
React上傳excel預(yù)覽
import React from 'react'; import * as XLSX from 'xlsx'; import {message, Table, Upload} from 'antd'; const { Dragger } = Upload; export class UploadFile extends React.Component { state = { tableData: [], tableHeader: [] }; toReturn = () => { this.props.close(); }; toSubmit = () => { const _this = this; console.log(_this.state.tableData); }; render() { return ( <div> <Dragger name="file" accept=".xls,.xlsx" maxCount={1} beforeUpload={function () { return false; }} onChange={this.uploadFilesChange.bind(this)} showUploadList={false}> <p className="ant-upload-text"> <span>點(diǎn)擊上傳文件</span> 或者拖拽上傳 </p> </Dragger> <Table columns={this.state.tableHeader} dataSource={this.state.tableData} style={{marginTop: '20px'}} pagination={false} /> </div> ); } uploadFilesChange(file) { // 通過FileReader對象讀取文件 const fileReader = new FileReader(); // 以二進(jìn)制方式打開文件 fileReader.readAsBinaryString(file.file); fileReader.onload = event => { try { const {result} = event.target; // 以二進(jìn)制流方式讀取得到整份excel表格對象 const workbook = XLSX.read(result, {type: 'binary'}); // 存儲(chǔ)獲取到的數(shù)據(jù) let data = {}; // 遍歷每張工作表進(jìn)行讀?。ㄟ@里默認(rèn)只讀取第一張表) for(const sheet in workbook.Sheets) { let tempData = []; // esline-disable-next-line if(workbook.Sheets.hasOwnProperty(sheet)) { // 利用 sheet_to_json 方法將 excel 轉(zhuǎn)成 json 數(shù)據(jù) console.log(sheet); data[sheet] = tempData.concat(XLSX.utils.sheet_to_json(workbook.Sheets[sheet])); } } const excelData = data.Sheet1; const excelHeader = []; // 獲取表頭 for(const headerAttr in excelData[0]) { const header = { title: headerAttr, dataIndex: headerAttr, key: headerAttr }; excelHeader.push(header); } // 最終獲取到并且格式化后的 json 數(shù)據(jù) this.setState({ tableData: excelData, tableHeader: excelHeader, }); console.log(this.state); } catch(e) { // 這里可以拋出文件類型錯(cuò)誤不正確的相關(guān)提示 console.log(e); message.error('文件類型不正確!'); } }; } } export default UploadFile;
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
利用React Router4實(shí)現(xiàn)的服務(wù)端直出渲染(SSR)
這篇文章主要介紹了利用React Router4實(shí)現(xiàn)的服務(wù)端直出渲染(SSR),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01react實(shí)現(xiàn)同頁面三級跳轉(zhuǎn)路由布局
這篇文章主要為大家詳細(xì)介紹了react實(shí)現(xiàn)同頁面三級跳轉(zhuǎn)路由布局,一個(gè)路由小案例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09react實(shí)現(xiàn)一個(gè)優(yōu)雅的圖片占位模塊組件詳解
這篇文章主要給大家介紹了關(guān)于react如何實(shí)現(xiàn)一個(gè)還算優(yōu)雅的占位模塊圖片組件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10ReactHooks批量更新state及獲取路由參數(shù)示例解析
這篇文章主要介紹了React Hooks如何實(shí)現(xiàn)批量更新state以及獲取路由參數(shù)的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10React中使用collections時(shí)key的重要性詳解
這篇文章主要給大家介紹了關(guān)于在React.js中使用collections時(shí)key的重要性,注意:一定不能不能忘了key,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08從零開始搭建一個(gè)react項(xiàng)目開發(fā)
這篇文章主要介紹了從零開始搭建一個(gè)react項(xiàng)目開發(fā),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02基于Cloud?Studio構(gòu)建React完成點(diǎn)餐H5頁面(騰訊云?Cloud?Studio?實(shí)戰(zhàn)訓(xùn)練營)
最近也是有機(jī)會(huì)參與到了騰訊云舉辦的騰訊云Cloud Studio實(shí)戰(zhàn)訓(xùn)練營,借此了解了騰訊云Cloud?Studio產(chǎn)品,下面就來使用騰訊云Cloud?Studio做一個(gè)實(shí)戰(zhàn)案例來深入了解該產(chǎn)品的優(yōu)越性吧,感興趣的朋友跟隨小編一起看看吧2023-08-08