vue使用luckyexcel实现在线表格,实现导出导入

话不多说。
1.vue需要在public-index.html中在线导入以下这些东西,或者找到相应的资源下载到本地,本地导入更快。

 <link
      rel="stylesheet"
      href="https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/css/pluginsCss.css"
    />
    <link
      rel="stylesheet"
      href="https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/plugins.css"
    />
    <link
      rel="stylesheet"
      href="https://cdn.jsdelivr.net/npm/luckysheet/dist/css/luckysheet.css"
    />
    <link
      rel="stylesheet"
      href="https://cdn.jsdelivr.net/npm/luckysheet/dist/assets/iconfont/iconfont.css"
    />
    <script src="https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/js/plugin.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/luckysheet/dist/luckysheet.umd.js"></script>

2.引入

 npm i -S exceljs file-saver luckyexcel
import { excelOptions } from "@/common/common.js"
const ExcelJS = require("exceljs");
import FileSaver from "file-saver";
import LuckyExcel from 'luckyexcel';
import XLSX from 'xlsx'

注意:按照以上导入去下载相应的包,excelOptions 是表格功能的一一些配置,我只是放在外面了。
版本:
在这里插入图片描述

3.定义当前表格容器,我多加了一个表格名称

	<div class="allbtn">
      <button class="btn" @click="saveExcel">保存</button>
      <button class="btn" @click="outputExcel">导出表格</button>
      <input type="file" accept=".xlsx" @change="importExcel($event)" value="导入表格" />
    </div>
	<h2>当前表格名称</h2>
    <input class="inp" type="text" v-model="excelTitel">
    <div id="luckysheet"></div>

在这里插入图片描述
4.导入excel并展示

// 导入表格
    importExcel (event) {
      let file = event.target.files[0]
      let that = this;
      const types = file.name.split(".")[1];
      // 判断类型
      const fileType = ["xlsx"].some(
        item => item === types
      );
      console.log(file)
      if (!fileType) {
        alert("只支持上传xlsx后缀的表格!")
        return
      }
      LuckyExcel.transformExcelToLucky(file, (exportJson, luckysheetfile) => {
        if (exportJson.sheets === null || exportJson.sheets.length === 0) {
          this.$message.error('无法读取excel文件的内容,当前不支持xls文件!')
          return
        }
        window.luckysheet.destroy()
        this.changeExcelOption.data = exportJson.sheets
        window.luckysheet.create(this.changeExcelOption)
      })
    },

导出表格:
这里我做了一点处理,初次加载时获取表格名称,然后可编辑当前表格名称,点击保存按钮后进行导出,则会导出你编辑的表格名称
1.初始获取表格名称

// 初始化加载
    init () {
      let opt = excelOptions();
      // 检测本地库中是否有配置
      let excelValue = window.localStorage.getItem("excelValue");
      if (excelValue != null) {//有值
        let checkExcelValue = JSON.parse(excelValue)
        opt.data[0] = checkExcelValue;
      }
      this.changeExcelOption = opt;
      luckysheet.create(opt)
      // 保存初始表格名称
      this.excelTitel = this.changeExcelOption.title;
    },
// 保存excel数据
    saveExcel () {
      var objsheet = luckysheet.getAllSheets() // 得到表的数据
      // options = objsheet // 将表的数据保存本地
      // console.log(objsheet)

      // 获取标内容更新变化
      luckysheet.setWorkbookName(this.excelTitel)
      this.changeExcelOption.title = this.excelTitel;
    },
 // 导出表格
    outputExcel () {
      this.exportExcel(luckysheet.getluckysheetfile("修改"));
    },
    async exportExcel (luckysheet) {
      // 参数为luckysheet.getluckysheetfile()获取的对象
      // 1.创建工作簿,可以为工作簿添加属性
      const workbook = new ExcelJS.Workbook();
      // 2.创建表格,第二个参数可以配置创建什么样的工作表
      luckysheet.every((table) => {
        if (table.data.length === 0) return true;
        const worksheet = workbook.addWorksheet(table.name);
        // 3.设置单元格合并,设置单元格边框,设置单元格样式,设置值
        this.setStyleAndValue(table.data, worksheet);
        this.setMerge(table.config.merge, worksheet);
        this.setBorder(table.config.borderInfo, worksheet);
        return true;
      });
      // 4.写入 buffer
      const buffer = await workbook.xlsx.writeBuffer();
      //调用文件保存插件
      FileSaver.saveAs(
        new Blob([buffer], { type: "application/octet-stream" }),
        this.changeExcelOption.title + ".xlsx"
      );
      return buffer;
    },

    setMerge (luckyMerge = {}, worksheet) {
      const mergearr = Object.values(luckyMerge);
      mergearr.forEach((elem) => {
        // elem格式:{r: 0, c: 0, rs: 1, cs: 2}
        // 按开始行,开始列,结束行,结束列合并(相当于 K10:M12)
        worksheet.mergeCells(elem.r + 1, elem.c + 1, elem.r + elem.rs, elem.c + elem.cs);
      });
    },

    setBorder (luckyBorderInfo, worksheet) {
      if (!Array.isArray(luckyBorderInfo)) return;
      luckyBorderInfo.forEach(function (elem) {
        var val = elem.value;
        let border = {};
        const luckyToExcel = {
          type: {
            "border-all": "all",
            "border-top": "top",
            "border-right": "right",
            "border-bottom": "bottom",
            "border-left": "left",
          },
          style: {
            0: "none",
            1: "thin",
            2: "hair",
            3: "dotted",
            4: "dashDot", // 'Dashed',
            5: "dashDot",
            6: "dashDotDot",
            7: "double",
            8: "medium",
            9: "mediumDashed",
            10: "mediumDashDot",
            11: "mediumDashDotDot",
            12: "slantDashDot",
            13: "thick",
          },
        };

        if (val) {
          if (val.t != undefined) {
            border["top"] = {
              style: luckyToExcel.style[val.t.style],
              color: val.t.color,
            };
          }
          if (val.r != undefined) {
            border["right"] = {
              style: luckyToExcel.style[val.r.style],
              color: val.r.color,
            };
          }
          if (val.b != undefined) {
            border["bottom"] = {
              style: luckyToExcel.style[val.b.style],
              color: val.b.color,
            };
          }
          if (val.l != undefined) {
            border["left"] = {
              style: luckyToExcel.style[val.l.style],
              color: val.l.color,
            };
          }
          worksheet.getCell(val.row_index + 1, val.col_index + 1).border = border;
        }
      });
    },
    setStyleAndValue (cellArr, worksheet) {
      if (!Array.isArray(cellArr)) return;
      cellArr.forEach((row, rowid) => {
        row.every((cell, columnid) => {
          if (!cell) return true;
          let fill = this.fillConvert(cell.bg);
          let font = this.fontConvert(
            cell.ff,
            cell.fc,
            cell.bl,
            cell.it,
            cell.fs,
            cell.cl,
            cell.ul
          );
          let alignment = this.alignmentConvert(cell.vt, cell.ht, cell.tb, cell.tr);
          let value;
          if (cell.f) {
            value = { formula: cell.f, result: cell.v };
          } else {
            value = cell.v;
          }
          let target = worksheet.getCell(rowid + 1, columnid + 1);
          target.fill = fill;
          target.font = font;
          target.alignment = alignment;
          target.value = value;
          return true;
        });
      });
    },

    fillConvert (bg) {
      if (!bg) {
        return {
          type: "pattern",
          pattern: "solid",
          fgColor: { argb: "#ffffff".replace("#", "") },
        };
      }
      let fill = {
        type: "pattern",
        pattern: "solid",
        fgColor: { argb: this.colorHex(bg).replace("#", "") },
      };
      console.log(fill);
      return fill;
    },
    //将rgb()转成16进制
    colorHex (color) {
      // RGB颜色值的正则
      var reg = /^(rgb|RGB)/;
      if (reg.test(color)) {
        var strHex = "#";
        // 把RGB的3个数值变成数组
        var colorArr = color.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(",");
        // 转成16进制
        for (var i = 0; i < colorArr.length; i++) {
          var hex = Number(colorArr[i]).toString(16);
          if (hex === "0") {
            hex += hex;
          }
          strHex += hex;
        }
        return strHex;
      } else {
        return String(color);
      }
    },
    fontConvert (ff = 0, fc = "#000000", bl = 0, it = 0, fs = 10, cl = 0, ul = 0) {
      // luckysheet:ff(样式), fc(颜色), bl(粗体), it(斜体), fs(大小), cl(删除线), ul(下划线)
      const luckyToExcel = {
        0: "微软雅黑",
        1: "宋体(Song)",
        2: "黑体(ST Heiti)",
        3: "楷体(ST Kaiti)",
        4: "仿宋(ST FangSong)",
        5: "新宋体(ST Song)",
        6: "华文新魏",
        7: "华文行楷",
        8: "华文隶书",
        9: "Arial",
        10: "Times New Roman ",
        11: "Tahoma ",
        12: "Verdana",
        num2bl: function (num) {
          return num === 0 ? false : true;
        },
      };

      let font = {
        name: luckyToExcel[ff],
        family: 1,
        size: fs,
        color: { argb: fc.replace("#", "") },
        bold: luckyToExcel.num2bl(bl),
        italic: luckyToExcel.num2bl(it),
        underline: luckyToExcel.num2bl(ul),
        strike: luckyToExcel.num2bl(cl),
      };

      return font;
    },

    alignmentConvert (vt = "default", ht = "default", tb = "default", tr = "default") {
      // luckysheet:vt(垂直), ht(水平), tb(换行), tr(旋转)
      const luckyToExcel = {
        vertical: {
          0: "middle",
          1: "top",
          2: "bottom",
          default: "top",
        },
        horizontal: {
          0: "center",
          1: "left",
          2: "right",
          default: "left",
        },
        wrapText: {
          0: false,
          1: false,
          2: true,
          default: false,
        },
        textRotation: {
          0: 0,
          1: 45,
          2: -45,
          3: "vertical",
          4: 90,
          5: -90,
          default: 0,
        },
      };

      let alignment = {
        vertical: luckyToExcel.vertical[vt],
        horizontal: luckyToExcel.horizontal[ht],
        wrapText: luckyToExcel.wrapText[tb],
        textRotation: luckyToExcel.textRotation[tr],
      };
      return alignment;
    },

    borderConvert (borderType, style = 1, color = "#000") {
      // 对应luckysheet的config中borderinfo的的参数
      if (!borderType) {
        return {};
      }
      const luckyToExcel = {
        type: {
          "border-all": "all",
          "border-top": "top",
          "border-right": "right",
          "border-bottom": "bottom",
          "border-left": "left",
        },
        style: {
          0: "none",
          1: "thin",
          2: "hair",
          3: "dotted",
          4: "dashDot", // 'Dashed',
          5: "dashDot",
          6: "dashDotDot",
          7: "double",
          8: "medium",
          9: "mediumDashed",
          10: "mediumDashDot",
          11: "mediumDashDotDot",
          12: "slantDashDot",
          13: "thick",
        },
      };
      let template = {
        style: luckyToExcel.style[style],
        color: { argb: color.replace("#", "") },
      };
      let border = {};
      if (luckyToExcel.type[borderType] === "all") {
        border["top"] = template;
        border["right"] = template;
        border["bottom"] = template;
        border["left"] = template;
      } else {
        border[luckyToExcel.type[borderType]] = template;
      }
      return border;
    }

总结:该开源表格确实很好用,但是更多功能可以深度挖掘,我只是简单玩了一下,体验可以,不过配合后端一起食用效果更佳。代码我放在资源里,免费的,大家自己看看,但是本地缓存的多人编辑代码不全,全的代码在我自己电脑上,懒得发了,这功能反正也是多余的,我就不删了,大家可以自己扩展。


题外话:写这个完全是被坑了,一天时间实现多人在线协同表格,我使用了本地缓存写了个简易版的,完事了又问我会不会pythonWeb…我应届生,也只会一点python语法,自然是挂了,虽然对这种外包公司印象一般,但是这样搞我确实头大。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
### 回答1: Luckysheet是一款在线表格软件,可以很方便地导入Excel文件。导入Excel文件有以下几个步骤: 1、打开Luckysheet,点击右下方的“导入”按钮,选择从本地导入。 2、选择需要导入Excel文件,可以直接拖拽文件进来,也可以点击“选择文件”按钮进行选择。 3、选择完文件后,Luckysheet会自动读取Excel文件中的数据,同时也会提示一些文件信息,如文件名、表格数量等等。 4、在数据读取完成后,可以选择要导入Excel表格Luckysheet会以标签页的形式展示表格,选择要导入表格即可。 5、导入完成后,Luckysheet会自动将Excel文件中的数据转换为Luckysheet支持的格式。这时,用户可以在Luckysheet中对数据进行编辑和处理。 需要注意的是,导入Excel文件时需要注意文件格式的兼容性。如果Excel文件中包含一些特殊格式的内容,可能会导致数据读取和转换的错误。此时需要手动对这些数据进行调整。 总的来说,Luckysheet导入Excel文件的过程十分简单,且能够保持数据的完整性和准确性,方便用户利用Luckysheet进行数据处理和分析。 ### 回答2: 要将Excel文件导入Luckysheet中,首先需要打开Luckysheet的网页应用,并登录账号。 在登录后,点击左上角的“文件”菜单,然后选择“导入Excel”选项。 接下来,会弹出一个对话框,我们可以选择本地计算机中的Excel文件进行导入。点击“选择文件”按钮,然后浏览本地文件夹,找到目标Excel文件并选择。 选择完文件后,还可以通过勾选“数据是否有标题”和“是否同时导入数据及样式”选项来进行相应的设置。 点击“确定”按钮后,Luckysheet会自动解析并导入Excel文件。导入后,我们就可以在Luckysheet中编辑和查看这个Excel文件的内容了。 值得注意的是,Luckysheet在导入Excel文件时,会根据文件的大小和结构,可能会需要一些时间进行解析和处理。在这个过程中,请耐心等待,不要中断或关闭网页。 另外,导入Excel文件在Luckysheet中会被转化为一个工作表,我们可以根据需要对工作表进行编辑和添加新的计算表达式。 总的来说,通过以上步骤,我们可以轻松地将Excel文件导入Luckysheet中,方便进行在线协作和编辑。 ### 回答3: 要将Excel文件导入Luckysheet中,可以按照以下步骤进行操作: 首先,打开Luckysheet软件,并点击页面上方的"文件"选项,然后选择"导入"。 接下来,选择要导入Excel文件所在的位置,并点击"打开"。Luckysheet会开始处理文件并将其导入。 在文件导入过程中,Luckysheet会解析Excel文件中的所有表格,并将其显示在Luckysheet页面的左侧栏中。 在左侧栏中,我们可以看到所有导入表格的名称和图标。点击表格的名称,可以在Luckysheet页面上显示该表格的内容。 此外,Luckysheet还提供了丰富的编辑工具和功能,可以对导入Excel数据进行修改和处理。比如,我们可以在表格中编辑单元格的内容、插入行列、设置数据格式等。 在修改完毕后,可以点击页面上方的"文件"选项,并选择"导出",将修改后的表格保存为Excel文件格式,以便在其他软件中使用或共享。 总结起来,通过上述步骤,我们可以将Excel文件方便地导入Luckysheet中,并利用Luckysheet提供的功能对导入数据进行操作和处理。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值