当前位置: 首页 > news >正文

前端univer创建、编辑excel

前端univer创建、编辑excel

源码在线demo:https://codesandbox.io/p/sandbox/univer-q87kqg?file=/src/Demo.jsx

univer官网地址:https://univer.ai/zh-CN/guides/sheet/introduction

安装univer

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 @univerjs/facade

安装xlsx处理数据

npm install xlsx

创建实例

  1. 引入 Univer 的样式文件、语言包,插件
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 } 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 { UniverInstanceType } from "@univerjs/core";
import { FUniver } from "@univerjs/facade";
  1. 创建sheet实例,挂载到dom元素上
  const workbookConfig = {id: 'workbook',locale: "zhCN",}const univerAPI = useRef();const univer = useRef();useEffect(() => {createSheet()return () => {univerAPI.current.disposeUnit(workbookConfig.id);};}, []);const createSheet = (config = workbookConfig) => {if (univerAPI.current) {univerAPI.current.disposeUnit(workbookConfig.id);}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: "univer-sheet-container-id",});univer.current.registerPlugin(UniverDocsPlugin);univer.current.registerPlugin(UniverDocsUIPlugin);univer.current.registerPlugin(UniverSheetsPlugin);univer.current.registerPlugin(UniverSheetsUIPlugin);univer.current.registerPlugin(UniverSheetsFormulaPlugin);univer.current.createUnit(UniverInstanceType.UNIVER_SHEET, config);univerAPI.current = FUniver.newAPI(univer.current);}// 挂在实例<div id="univer-sheet-container-id" className="univer-sheet-container" style={{height: "500px" }} />

导入excel文件、通过xlsx对文件进行处理,通过@univerjs/facade导入数据

  /** 上传文件 */const handleChangeUploadExcel = async (fileData) => {const reader = new FileReader();reader.onload = (e) => {const data = e.target.result;const workbook = XLSX.read(data, { type: "binary" });const excelData = convertWorkbookToJson(workbook);console.log("%c [ excelData ]-87","font-size:13px; background:pink; color:#bf2c9f;",excelData);createSheet(excelData);};reader.readAsBinaryString(fileData.file);};/** 将sheet数据转换为json */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 });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 + 50,columnCount: maxColumnCount + 50,zoomRatio: 1,cellData: cellData,showGridlines: 1,};sheetOrder.push(sheetId);});return {...workbookConfig,sheetOrder: sheetOrder,sheets: sheets,};};<Uploadaccept=".xls,.xlsx"onChange={handleChangeUploadExcel}beforeUpload={() => false}showUploadList={false}multiple={false}><Button type="primary" className="upload-btn">选择excel文件</Button></Upload>

获取表格数据

univerAPI.current.getActiveWorkbook().save()

效果:

初始化
在这里插入图片描述
导入数据

在这里插入图片描述
获取表格数据
在这里插入图片描述

完整代码:

import React, { useEffect, useRef, useState } from "react";
import "antd/dist/antd.css";
import "./index.css";
import { Button, Upload } from "antd";
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 } 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 { UniverInstanceType } from "@univerjs/core";
import { FUniver } from "@univerjs/facade";
import * as XLSX from "xlsx";const workbookConfig = {id: "workbook",locale: "zhCN",
};const App = () => {const univerAPI = useRef();const univer = useRef();const [excelData, setExcelData] = useState("");useEffect(() => {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: "univer-sheet-container-id",});univer.current.registerPlugin(UniverDocsPlugin);univer.current.registerPlugin(UniverDocsUIPlugin);univer.current.registerPlugin(UniverSheetsPlugin);univer.current.registerPlugin(UniverSheetsUIPlugin);univer.current.registerPlugin(UniverSheetsFormulaPlugin);univer.current.createUnit(UniverInstanceType.UNIVER_SHEET, {});univerAPI.current = FUniver.newAPI(univer.current);return () => {univerAPI.current.disposeUnit(workbookConfig.id);};}, []);/** 获取表格数据 */const handleGetSheetData = () => {const data = univerAPI.current.getActiveWorkbook().save();console.log("%c [ data ]-68","font-size:13px; background:pink; color:#bf2c9f;",data);setExcelData(JSON.stringify(data));};/** 上传文件 */const handleChangeUploadExcel = async (fileData) => {const reader = new FileReader();reader.onload = (e) => {const data = e.target.result;const workbook = XLSX.read(data, { type: "binary" });const excelData = convertWorkbookToJson(workbook);console.log("%c [ excelData ]-87","font-size:13px; background:pink; color:#bf2c9f;",excelData);univerAPI.current.disposeUnit(workbookConfig.id);univer.current.createUnit(UniverInstanceType.UNIVER_SHEET, excelData);};reader.readAsBinaryString(fileData.file);};/** 将sheet数据转换为json */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 });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 + 50,columnCount: maxColumnCount + 50,zoomRatio: 1,cellData: cellData,showGridlines: 1,};sheetOrder.push(sheetId);});return {...workbookConfig,sheetOrder: sheetOrder,sheets: sheets,};};return (<div className="main-container"><div><Uploadaccept=".xls,.xlsx"onChange={handleChangeUploadExcel}beforeUpload={() => false}showUploadList={false}multiple={false}><Button type="primary" className="upload-btn">选择excel文件</Button></Upload></div><divid="univer-sheet-container-id"className="univer-sheet-container"style={{ height: "500px" }}/><div><Button type="primary" onClick={handleGetSheetData}>获取表格数据</Button></div>表格数据:<div>{excelData}</div></div>);
};
export default App;

源码在线demo:https://codesandbox.io/p/sandbox/univer-q87kqg?file=/src/Demo.jsx

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Docker 以外置数据库方式部署禅道
  • .config、Kconfig、***_defconfig之间的关系和工作原理
  • Hadoop里面MapReduce的序列化与Java序列化比较
  • Java知识点小结3:内存回收
  • 关于c#中异步async和await的理解
  • PyTorch 图像分割模型教程
  • csdn漏洞测试
  • 大数据处理技术:HBase的安装与基本操作
  • 二级C语言2023-9易错题
  • 数据结构与算法-Trie树添加与搜索
  • IDEA甚至前进后退跳转键
  • 【第十三章:Sentosa_DSML社区版-机器学习聚类】
  • 携手阿里云CEN:共创SD-WAN融合广域网
  • 吃透这本大语言模型入门指南,LLM就拿下了
  • python脚本编译为.so速度对比
  • docker python 配置
  • EOS是什么
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • KMP算法及优化
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • nodejs调试方法
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Shadow DOM 内部构造及如何构建独立组件
  • Spring Boot MyBatis配置多种数据库
  • windows下使用nginx调试简介
  • 初识 beanstalkd
  • 番外篇1:在Windows环境下安装JDK
  • 分布式熔断降级平台aegis
  • 看域名解析域名安全对SEO的影响
  • 通过npm或yarn自动生成vue组件
  • 做一名精致的JavaScripter 01:JavaScript简介
  • Spring Batch JSON 支持
  • Spring第一个helloWorld
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 通过调用文摘列表API获取文摘
  • (70min)字节暑假实习二面(已挂)
  • (C语言)字符分类函数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .ai域名是什么后缀?
  • .a文件和.so文件
  • .Net Core 中间件验签
  • .Net Remoting常用部署结构
  • .NET 分布式技术比较
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • [Algorithm][综合训练][kotori和n皇后][取金币][矩阵转置]详细讲解
  • [Android] Android ActivityManager