前端獲取excel表格數(shù)據(jù)并在瀏覽器展示方法實(shí)例
前言
本人是在使用react時(shí)產(chǎn)生這個(gè)需求的 所以示范代碼使用react
使用其他框架的可以提取關(guān)鍵代碼實(shí)現(xiàn)
1、安裝插件
安裝Univer
Univer:https://univer.ai/zh-CN
使用npm
npm install @univerjs/core @univerjs/design @univerjs/docs @univerjs/docs-ui @univerjs/engine-formula @univerjs/engine-render @univerjs/sheets @univerjs/sheets-formula @univerjs/sheets-ui @univerjs/ui
使用pnpm
pnpm add @univerjs/core @univerjs/design @univerjs/docs @univerjs/docs-ui @univerjs/engine-formula @univerjs/engine-render @univerjs/sheets @univerjs/sheets-formula @univerjs/sheets-ui @univerjs/ui
安裝xlsx
npm i xlsx
2、引入插件和實(shí)例化插件
你需要在項(xiàng)目中引入 Univer 的樣式文件、語(yǔ)言包,以及一些必要的插件:
import "@univerjs/design/lib/index.css"; import "@univerjs/ui/lib/index.css"; import "@univerjs/docs-ui/lib/index.css"; import "@univerjs/sheets-ui/lib/index.css"; import "@univerjs/sheets-formula/lib/index.css"; import { LocaleType, Tools, Univer, UniverInstanceType } from "@univerjs/core"; import { defaultTheme } from "@univerjs/design"; import { UniverFormulaEnginePlugin } from "@univerjs/engine-formula"; import { UniverRenderEnginePlugin } from "@univerjs/engine-render"; import { UniverUIPlugin } from "@univerjs/ui"; import { UniverDocsPlugin } from "@univerjs/docs"; import { UniverDocsUIPlugin } from "@univerjs/docs-ui"; import { UniverSheetsPlugin } from "@univerjs/sheets"; import { UniverSheetsFormulaPlugin } from "@univerjs/sheets-formula"; import { UniverSheetsUIPlugin } from "@univerjs/sheets-ui"; import DesignZhCN from "@univerjs/design/locale/zh-CN"; import UIZhCN from "@univerjs/ui/locale/zh-CN"; import DocsUIZhCN from "@univerjs/docs-ui/locale/zh-CN"; import SheetsZhCN from "@univerjs/sheets/locale/zh-CN"; import SheetsUIZhCN from "@univerjs/sheets-ui/locale/zh-CN";
然后創(chuàng)建一個(gè) Univer 實(shí)例,并注冊(cè)這些插件:
const univer = new Univer({ theme: defaultTheme, locale: LocaleType.ZH_CN, locales: { [LocaleType.ZH_CN]: Tools.deepMerge( SheetsZhCN, DocsUIZhCN, SheetsUIZhCN, UIZhCN, DesignZhCN, ), }, }); univer.registerPlugin(UniverRenderEnginePlugin); univer.registerPlugin(UniverFormulaEnginePlugin); univer.registerPlugin(UniverUIPlugin, { container: 'app', }); univer.registerPlugin(UniverDocsPlugin, { hasScroll: false, }); univer.registerPlugin(UniverDocsUIPlugin); univer.registerPlugin(UniverSheetsPlugin); univer.registerPlugin(UniverSheetsUIPlugin); univer.registerPlugin(UniverSheetsFormulaPlugin); univer.createUnit(UniverInstanceType.UNIVER_SHEET, {});
要加載數(shù)據(jù)還需這個(gè)包 @univerjs/facade
npm i @univerjs/facade
import { FUniver } from "@univerjs/facade"; const univerAPI = FUniver.newAPI(univer);
3、獲取數(shù)據(jù)源
上傳本地文件
const App = () => { const handleFileUpload = (e) => { const file = e.target.files[0]; const reader = new FileReader(); reader.onload = (event) => { const data = new Uint8Array(event.target.result); const workbook = XLSX.read(data, { type: "array" }); // 數(shù)據(jù)源 }; }; return <> <input type="file" onChange={handleFileUpload} /> </> }
根據(jù)接口獲取
const App = () => { const fetchExcelData = async () => { try { const response = await axios("http://xxx.xxx.xxx", { method: "get", responseType: "arraybuffer", headers: { Authorization: "bearer xxx", // 添加你的認(rèn)證令牌 }, }); const data = new Uint8Array(response.data); const workbook = XLSX.read(data, { type: "array" }); // 數(shù)據(jù)源 } catch (error) { console.error("Failed to fetch Excel data:", error); } }; return <></> }
4、處理成插件所需的數(shù)據(jù)格式
數(shù)據(jù)格式定義:Interface: IWorkbookData – Univer
workbook // 數(shù)據(jù)源 const convertWorkbookToJson = (workbook) => { const sheets = {}; const sheetOrder = []; workbook.SheetNames.forEach((sheetName, sheetIndex) => { const worksheet = workbook.Sheets[sheetName]; const jsonSheet = XLSX.utils.sheet_to_json(worksheet, { header: 1 }); console.log(jsonSheet); const cellData = {}; let maxColumnCount = 0; jsonSheet.forEach((row, rowIndex) => { row.forEach((cell, colIndex) => { if (cell !== null && cell !== undefined && cell !== "") { if (!cellData[rowIndex]) { cellData[rowIndex] = []; } cellData[rowIndex][colIndex] = { v: cell }; if (colIndex + 1 > maxColumnCount) { maxColumnCount = colIndex + 1; } } }); }); const sheetId = `sheet_${sheetIndex}`; sheets[sheetId] = { id: sheetId, name: sheetName, rowCount: jsonSheet.length, // 多少行 columnCount: maxColumnCount, // 多少列 zoomRatio: 1, defaultColumnWidth: 73, defaultRowHeight: 23, cellData: cellData, // 每個(gè)單元格的數(shù)據(jù) showGridlines: 1, rowHeader: { width: 40, hidden: 0, }, columnHeader: { height: 20, hidden: 0, }, }; sheetOrder.push(sheetId); }); return { id: "workbook", sheetOrder: sheetOrder, locale: "zhCN", sheets: sheets, }; };
5、在獲取數(shù)據(jù)源后渲染到界面上(完整代碼)
渲染效果界面
import "@univerjs/design/lib/index.css"; import "@univerjs/ui/lib/index.css"; import "@univerjs/docs-ui/lib/index.css"; import "@univerjs/sheets-ui/lib/index.css"; import "@univerjs/sheets-formula/lib/index.css"; import { LocaleType, Tools, Univer, UniverInstanceType } from "@univerjs/core"; import { defaultTheme } from "@univerjs/design"; import { UniverFormulaEnginePlugin } from "@univerjs/engine-formula"; import { UniverRenderEnginePlugin } from "@univerjs/engine-render"; import { UniverUIPlugin } from "@univerjs/ui"; import { UniverDocsPlugin } from "@univerjs/docs"; import { UniverDocsUIPlugin } from "@univerjs/docs-ui"; import { UniverSheetsPlugin } from "@univerjs/sheets"; import { UniverSheetsFormulaPlugin } from "@univerjs/sheets-formula"; import { UniverSheetsUIPlugin } from "@univerjs/sheets-ui"; import DesignZhCN from "@univerjs/design/locale/zh-CN"; import UIZhCN from "@univerjs/ui/locale/zh-CN"; import DocsUIZhCN from "@univerjs/docs-ui/locale/zh-CN"; import SheetsZhCN from "@univerjs/sheets/locale/zh-CN"; import SheetsUIZhCN from "@univerjs/sheets-ui/locale/zh-CN"; import { FUniver } from "@univerjs/facade"; import { useEffect, useRef, useState } from "react"; import * as XLSX from "xlsx"; const App = () => { const univerAPI = useRef(); const univer = useRef(); useEffect(() => { // fetchExcelData(); // 接口獲取刪除此行注釋 本地上傳點(diǎn)擊上傳按鈕 }, []); const init = () => { univer.current = new Univer({ theme: defaultTheme, locale: LocaleType.ZH_CN, locales: { [LocaleType.ZH_CN]: Tools.deepMerge( SheetsZhCN, DocsUIZhCN, SheetsUIZhCN, UIZhCN, DesignZhCN ), }, }); univer.current.registerPlugin(UniverRenderEnginePlugin); univer.current.registerPlugin(UniverFormulaEnginePlugin); univer.current.registerPlugin(UniverUIPlugin, { container: "excel2", }); univer.current.registerPlugin(UniverDocsPlugin, { hasScroll: false, }); univer.current.registerPlugin(UniverDocsUIPlugin); univer.current.registerPlugin(UniverSheetsPlugin); univer.current.registerPlugin(UniverSheetsUIPlugin); univer.current.registerPlugin(UniverSheetsFormulaPlugin); univerAPI.current = FUniver.newAPI(univer.current); // 創(chuàng)建一個(gè)空白的表格可刪除以下代碼注釋 并在useEffect中執(zhí)行init(); // univer.current.createUnit(UniverInstanceType.UNIVER_SHEET, { // id: "gyI0JO", // sheetOrder: ["RSfWjJFv4opmE1JaiRj80"], // name: "", // appVersion: "0.1.11", // locale: "zhCN", // styles: {}, // sheets: { // RSfWjJFv4opmE1JaiRj80: { // id: "RSfWjJFv4opmE1JaiRj80", // name: "測(cè)試", // tabColor: "", // hidden: 0, // rowCount: 20, // columnCount: 10, // zoomRatio: 1, // freeze: { // startRow: -1, // startColumn: -1, // ySplit: 0, // xSplit: 0, // }, // scrollTop: 0, // scrollLeft: 0, // defaultColumnWidth: 73, // defaultRowHeight: 23, // mergeData: [], // cellData: { // 0: [ // { // v: "123", // }, // { // v: "222", // }, // ], // }, // rowData: { // 0: { // h: 105, // hd: 0, // }, // }, // columnData: { // 0: { // w: 105, // hd: 0, // }, // 1: { // w: 100, // hd: 0, // }, // 2: { // w: 125, // hd: 0, // }, // 3: { // w: 125, // hd: 0, // }, // 4: { // w: 125, // hd: 0, // }, // 5: { // w: 125, // hd: 0, // }, // 6: { // w: 125, // hd: 0, // }, // 7: { // w: 125, // hd: 0, // }, // 8: { // w: 125, // hd: 0, // }, // 9: { // w: 125, // hd: 0, // }, // }, // showGridlines: 1, // rowHeader: { // width: 40, // hidden: 0, // }, // columnHeader: { // height: 20, // hidden: 0, // }, // selections: ["B2"], // rightToLeft: 0, // }, // }, // resources: [ // { // name: "SHEET_DEFINED_NAME_PLUGIN", // data: "", // }, // ], // }); }; // 點(diǎn)擊上傳按鈕獲取數(shù)據(jù) const handleFileUpload = (e) => { const file = e.target.files[0]; const reader = new FileReader(); reader.onload = (event) => { const data = new Uint8Array(event.target.result); const workbook = XLSX.read(data, { type: "array" }); // 數(shù)據(jù)源 const jsonWorkbook = convertWorkbookToJson(workbook); univer.current.createUnit(UniverInstanceType.UNIVER_SHEET, jsonWorkbook) // 輸入數(shù)據(jù)生成表格 }; }; // 接口獲取 const fetchExcelData = async () => { try { const response = await axios("http://xxx.xxx.xxx", { method: "get", responseType: "arraybuffer", // 確保以數(shù)組緩沖區(qū)的形式獲取二進(jìn)制數(shù)據(jù) headers: { Authorization: "bearer xxx", // 添加你的認(rèn)證令牌 }, }); const data = new Uint8Array(response.data); const workbook = XLSX.read(data, { type: "array" }); // 數(shù)據(jù)源 const jsonWorkbook = convertWorkbookToJson(workbook); univer.current.createUnit(UniverInstanceType.UNIVER_SHEET, jsonWorkbook) // 輸入數(shù)據(jù)生成表格 } catch (error) { console.error("Failed to fetch Excel data:", error); } }; const convertWorkbookToJson = (workbook) => { const sheets = {}; const sheetOrder = []; workbook.SheetNames.forEach((sheetName, sheetIndex) => { const worksheet = workbook.Sheets[sheetName]; const jsonSheet = XLSX.utils.sheet_to_json(worksheet, { header: 1 }); console.log(jsonSheet); const cellData = {}; let maxColumnCount = 0; jsonSheet.forEach((row, rowIndex) => { row.forEach((cell, colIndex) => { if (cell !== null && cell !== undefined && cell !== "") { if (!cellData[rowIndex]) { cellData[rowIndex] = []; } cellData[rowIndex][colIndex] = { v: cell }; if (colIndex + 1 > maxColumnCount) { maxColumnCount = colIndex + 1; } } }); }); const sheetId = `sheet_${sheetIndex}`; sheets[sheetId] = { id: sheetId, name: sheetName, rowCount: jsonSheet.length, columnCount: maxColumnCount, zoomRatio: 1, defaultColumnWidth: 73, defaultRowHeight: 23, mergeData: mergeData, cellData: cellData, showGridlines: 1, rowHeader: { width: 40, hidden: 0, }, columnHeader: { height: 20, hidden: 0, }, }; sheetOrder.push(sheetId); }); return { id: "workbook", sheetOrder: sheetOrder, locale: "zhCN", sheets: sheets, }; }; return ( <> {/* 表格容器 */} <div id="excel2" style={{ width: "1000px", height: "800px" }}></div> {/* 上傳按鈕 */} <input type="file" onChange={handleFileUpload} /> </> ); }; export default App;
總結(jié)
到此這篇關(guān)于前端獲取excel表格數(shù)據(jù)并在瀏覽器展示的文章就介紹到這了,更多相關(guān)前端獲取excel表格數(shù)據(jù)展示內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
通過(guò)JS自動(dòng)隱藏手機(jī)瀏覽器的地址欄實(shí)現(xiàn)原理與代碼
大家通過(guò)手機(jī)自帶瀏覽器打開(kāi)百度、淘寶,在首頁(yè)加載完畢后,會(huì)自動(dòng)隱藏頁(yè)面上方的地址欄,感興趣的朋友可以參考下2013-01-01微信小程序?qū)崿F(xiàn)吸頂效果的方法實(shí)例
在微信小程序的開(kāi)發(fā)中,經(jīng)常會(huì)有列表分類標(biāo)簽隨著界面滾動(dòng)吸頂?shù)男Ч?下面這篇文章主要給大家介紹了關(guān)于微信小程序?qū)崿F(xiàn)吸頂效果的相關(guān)資料,需要的朋友可以參考下2021-08-08簡(jiǎn)單談?wù)刯avascript中的變量、作用域和內(nèi)存問(wèn)題
這篇文章主要介紹了簡(jiǎn)單談?wù)刯avascript中的變量、作用域和內(nèi)存問(wèn)題的相關(guān)資料,需要的朋友可以參考下2015-08-08使用JavaScript實(shí)現(xiàn)圖片放大鏡功能
圖片放大鏡(Image?Zoom)效果在許多電子商務(wù)網(wǎng)站、在線畫(huà)廊和產(chǎn)品展示頁(yè)面中得到廣泛應(yīng)用,它允許用戶通過(guò)鼠標(biāo)懸停在圖片上,查看圖片的詳細(xì)局部放大效果,本文將詳細(xì)介紹如何使用?JavaScript?實(shí)現(xiàn)一個(gè)基本的圖片放大鏡功能,需要的朋友可以參考下2024-12-12JavaScript 未結(jié)束的字符串常量常見(jiàn)解決方法
做JavaScript的時(shí)候,發(fā)現(xiàn)老是出現(xiàn)錯(cuò)誤:“未結(jié)束的字符串常量”. 自己找了下應(yīng)該是傳參數(shù)的時(shí)候,有特殊字符引起的.網(wǎng)上也找了下,也有好多出現(xiàn)這種情況.做下總結(jié),以方便以后查閱.2010-01-01JavaScript中使用arguments獲得函數(shù)傳參個(gè)數(shù)實(shí)例
這篇文章主要介紹了JavaScript中使用arguments獲得函數(shù)傳參個(gè)數(shù)實(shí)例,本文用了多個(gè)例子來(lái)講解arguments的使用,需要的朋友可以參考下2014-08-08