Vue2+Univer实现可编辑Excel

注:本文章仅限于参考借鉴,其中一些代码样例没有用到官方API。

内容简介:本文章可以完成使用Univer表格插件,对数据进行增删改查,以及基本样式修改

Univer官方:Univer

一、 安装插件(大部分插件版本均为 0.1.13)

pnpm add @univerjs/core@0.1.13 @univerjs/design@0.1.13 @univerjs/docs@0.1.13 @univerjs/engine-formula@0.1.13 @univerjs/engine-render@0.1.13 @univerjs/facade@0.1.15 @univerjs/sheets@0.1.13 @univerjs/sheets-formula@0.1.13 @univerjs/sheets-ui@0.1.13 

二、 创建一个容器

<div ref="container" class="univer-container" :data="data" style="height: 100vh"></div>

三、引入插件和样式

import {
  Univer,
  UniverInstanceType,
  LocaleType,
  IPermissionService,
} from "@univerjs/core";
import { defaultTheme } from "@univerjs/design";
import { UniverDocsPlugin } from "@univerjs/docs";
import { UniverDocsUIPlugin } from "@univerjs/docs-ui";
import { UniverFormulaEnginePlugin } from "@univerjs/engine-formula";
import { UniverRenderEnginePlugin } from "@univerjs/engine-render";
import {
  UniverSheetsPlugin,
  RangeProtectionPermissionEditPoint,
  WorkbookEditablePermission,
} from "@univerjs/sheets";
import { UniverSheetsFormulaPlugin } from "@univerjs/sheets-formula";
import { UniverSheetsUIPlugin } from "@univerjs/sheets-ui";
import { UniverUIPlugin } from "@univerjs/ui";
import { FUniver } from "@univerjs/facade";
import { BooleanNumber, SheetTypes } from "@univerjs/core";

import { zhCN, enUS } from "univer:locales";
// TODO:
import "@univerjs/sheets-ui/lib/index.css";

四、 初始化表格

  mounted() {
    this.init(this.data);
    this.dataUrl = this.$route.query.dataUrl;
    this.uploadUrl = this.$route.query.uploadUrl;
    this.getData();
  },
  methods: {
    /**
     * Initialize univer instance and workbook instance
     * @param data {IWorkbookData} document see https://univer.work/api/core/interfaces/IWorkbookData.html
     */

    init(data = {}) {
      const univer = new Univer({
        theme: defaultTheme,
        locale: LocaleType.zhCN,
        locales: {
          [LocaleType.ZH_CN]: zhCN,
          [LocaleType.EN_US]: enUS,
        },
      });
      this.univer = univer;

      // core plugins
      univer.registerPlugin(UniverRenderEnginePlugin);
      univer.registerPlugin(UniverFormulaEnginePlugin);
      univer.registerPlugin(UniverUIPlugin, {
        container: this.$refs.container,
      });

      // doc plugins
      univer.registerPlugin(UniverDocsPlugin, {
        hasScroll: false,
      });
      univer.registerPlugin(UniverDocsUIPlugin);

      // sheet plugins
      univer.registerPlugin(UniverSheetsPlugin);
      univer.registerPlugin(UniverSheetsUIPlugin);
      univer.registerPlugin(UniverSheetsFormulaPlugin);

      // create workbook instance
      this.workbook = univer.createUnit(UniverInstanceType.UNIVER_SHEET, data);
    },
}

五、 数据格式及加载

1、数据加载:在容器内使用 :data=" 数据  "
2、数据格式:
data: {
        id: "workbook-01",
        locale: LocaleType.ZH_CN,
        name: "universheet",
        sheetOrder: ["sheet-01"],
        appVersion: "3.0.0-alpha",
        sheets: {
          "sheet-01": {
            type: SheetTypes.GRID,
            id: "sheet-01",
            cellData: {
              //数据
              0: {
                0: {
                  v: "Hellow Univer",
                },
              },
            },
            name: "sheet1", // 表名
            tabColor: "red",
            hidden: BooleanNumber.FALSE,
            rowCount: 6222, //表格行数
            columnCount: 10, //表格列数
            zoomRatio: 1,
            scrollTop: 200,
            scrollLeft: 100,
            defaultColumnWidth: 200, //单元格的宽度
            defaultRowHeight: 45, //单元格高度
            status: 1,
            showGridlines: 1,
            hideRow: [],
            hideColumn: [],
            rowHeader: {
              width: 46,
              hidden: BooleanNumber.FALSE,
            },
            columnHeader: {
              height: 20,
              hidden: BooleanNumber.FALSE,
            },
            selections: ["A2"],
            rightToLeft: BooleanNumber.FALSE,
            pluginMeta: {},
            mergeData: [],
          },
        },
      },
3、效果展示:

注:以下代码为部分代码,仅供参考,建议以官方API为准

六、 观察数据变化,并重新创建Univer实例

 watch: {
    // watch data change, and re-create univer instance
    data: {
      handler(val) {
        this.destroyUniver();
        this.init(val);
      },
      immediate: true,
    },
  },

destroyUniver() {
      this.univer?.dispose();
      this.univer = null;
      this.workbook = null;
    },

七、 获取cellData

const univerAPI = FUniver.newAPI(this.univer);
const activeSheet = univerAPI.getActiveWorkbook().getActiveSheet();
const savedData = univerAPI.getActiveWorkbook().getSnapshot();
let excel = savedData.sheets["sheet-01"].cellData;

八、 设置cellData

const univerAPI = FUniver.newAPI(this.univer);
const activeSheet = univerAPI.getActiveWorkbook().getActiveSheet();
const range1 = activeSheet.getRange();

range1.setValues(数据);

九、 设置表格样式

const univerAPI = FUniver.newAPI(this.univer);
const activeSheet = univerAPI.getActiveWorkbook().getActiveSheet();

// (startRow,startColumn,endRow,endColumn)
const headTitle = activeSheet.getRange(0, 0, 1, this.headerLength);
const sheetStyle = activeSheet.getRange(0, 0, rowCount, columnCount);
// 垂直居中(top/middle/bottom)
sheetStyle.setVerticalAlignment("middle");
// 左右居中(left/center/right)
sheetStyle.setHorizontalAlignment("center");
// 字体粗细(normal/bold)
headTitle.setFontWeight("bold");
// 字体大小(数字即可)
headTitle.setFontSize("13");

十、 合并单元格

this.data.sheets["sheet-01"].mergeData = [
        { startRow: 1, endRow: 2, startColumn: 0, endColumn: 0 },
        { startRow: 3, endRow: 9, startColumn: 0, endColumn: 0 },
        { startRow: 1, endRow: 2, startColumn: 1, endColumn: 1 },
        { startRow: 3, endRow: 5, startColumn: 1, endColumn: 1 },
        { startRow: 6, endRow: 7, startColumn: 1, endColumn: 1 },
        { startRow: 8, endRow: 9, startColumn: 1, endColumn: 1 },
      ];

十一、 冻结行列

this.data.sheets["sheet-01"].freeze= {
        startRow: -1,
        startColumn: 1,
        ySplit: 0,
        xSplit: 1,
    }

cellData : custom自定义字段(具体内容为作者使用,仅供参考!!!)

for (var out = 0; out < this.list.length; out++) {
        this.newObj[out + 1] = {};
        var values = Object.values(this.list[out]);
        var keys = Object.keys(this.list[out]);
        for (var inner = 0, i = 0; inner < values.length; inner++) {
          // console.log(keys[inner] + inner);
          if (
            (keys[inner] == "nodeName" && keys[inner + 1] == "nId") ||
            (keys[inner] == "psetName" && keys[inner + 1] == "psetId")
          ) {
            // console.log(keys[inner]);
            if (keys[inner + 1] == "nId") {
              this.newObj[out + 1][i] = {
                v: values[inner],
                custom: {
                  nId: values[inner + 1],
                },
              };
            } else {
              this.newObj[out + 1][i] = {
                v: values[inner],
                custom: {
                  psetId: values[inner + 1],
                },
              };
            }

            i++;
          } else {
            if (keys[inner] !== "nId" && keys[inner] !== "psetId")
              this.newObj[out + 1][inner - i] = { v: values[inner] };
            // console.log(keys[inner]);
          }
        }
      }

注:推荐使用Element UI 添加效果组件

### Univer 实现 Excel 文件的导入和导出功能 Univer 是一款基于 Web 的电子表格引擎,支持多种数据处理场景,包括 Excel 文件的导入和导出。以下是关于如何使用 Univer 实现这些功能的具体说明。 #### 1. 安装必要的依赖项 为了实现 Excel 文件的导入和导出功能,需要安装 `univer` 及其相关模块: ```bash npm install @univerjs/core @univerjs/sheets @universheet/excel-io ``` 上述命令会安装核心库以及与 Excel IO 相关的功能模块[^1]。 --- #### 2. 初始化 Univer 应用实例 创建一个基础的应用程序实例来加载和管理电子表格数据: ```javascript // 导入必要模块 import { Universe } from '@univerjs/core'; import { SheetsPlugin } from '@univerjs/sheets'; // 创建 Universe 实例并注册插件 const universe = new Universe(); universe.registerPlugin(SheetsPlugin); ``` 通过这段代码初始化了一个基本的 Univer 环境,并启用了电子表格插件以支持后续的数据操作[^2]。 --- #### 3. 配置 Excel IO 插件 为了让应用程序能够读取和写入 Excel 文件,需进一步配置 Excel IO 插件: ```javascript import { ExcelIOPlugin } from '@universheet/excel-io'; // 注册 Excel IO 插件 universe.registerPlugin(ExcelIOPlugin); // 获取当前工作簿对象 const workbookContext = universe.getWorkBookContext('defaultWorkbook'); if (!workbookContext) { throw new Error('无法获取默认的工作簿上下文'); } ``` 此部分代码完成了对 Excel IO 功能的支持,并准备好了用于存储数据的工作簿环境[^3]。 --- #### 4. 导入 Excel 数据 利用 Univer 提供的方法可以从本地文件或其他来源加载 Excel 数据到内存中: ```typescript async function importExcel(file: File): Promise<void> { const excelIoService = workbookContext.getCellMatrixController().getExcelIOService(); try { await excelIoService.importFromFile(file, (progress) => console.log(`Import progress: ${progress}%`)); console.log('Excel 文件成功导入'); } catch (error) { console.error('导入失败:', error); } } // 调用函数时传递用户上传的文件对象 ``` 该方法接收一个标准的 HTML5 `File` 对象作为参数,并将其解析为内部可使用的结构化数据形式[^4]。 --- #### 5. 导出 Excel 数据 当完成编辑或生成新的报表后,可以通过以下方式将数据保存回 Excel 文件: ```typescript function exportExcel(): void { const excelIoService = workbookContext.getCellMatrixController().getExcelIOService(); try { const blob = excelIoService.exportToFile({ fileName: 'output.xlsx', fileType: 'xlsx' }); saveAs(blob as Blob, 'output.xlsx'); // 使用 FileSaver.js 进行下载 console.log('Excel 文件成功导出'); } catch (error) { console.error('导出失败:', error); } } ``` 这里调用了 `exportToFile` 方法生成目标文件流,并借助第三方库(如 FileSaver.js)触发浏览器下载行为[^5]。 --- #### 6. 扩展功能 如果项目中有更复杂的需求,比如嵌入图片、自定义单元格样式等,则可以参考其他成熟的解决方案进行集成。例如,在 Vue 或 React 中结合 XLSX 和 ExcelJS 工具包可能是一个不错的选择[^6]。 --- ### 总结 以上展示了如何基于 Univer 构建一套完整的 Excel 文件导入/导出机制。它不仅提供了灵活的操作接口,还允许开发者轻松扩展更多高级特性。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值