Vue Luckyexcel 将文件流转成file文件后使用Luckysheet回显数据 - 附完整示例

10 篇文章 0 订阅

Luckysheet :一款纯前端类似excel的在线表格,功能强大、配置简单、完全开源。 

官方文档:快速上手 | Luckysheet文档快速上手 | Luckysheet文档Luckysheet ,一款纯前端类似excel的在线表格,功能强大、配置简单、完全开源。本站包含官方配置文档,API,教程。icon-default.png?t=N7T8https://mengshukeji.gitee.io/luckysheetdocs/zh/guide/

效果

注:因为项目只需要以Excel的形式展示,所以去除了工具栏、顶部信息栏、底部计数栏等配置,更多配置详见官方文档

一、准备工作

 1、安装依赖包

npm install luckyexcel --save

  2、 示例版本 

"luckyexcel": "^1.0.1",

二、使用步骤

1、在index.html文件中引入依赖包

代码如下(示例):

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

2、单文件使用

代码如下(示例):

import LuckyExcel from 'luckyexcel';

3、调用

代码如下(示例):

loadExcel() {
      const token = '用户token'
      axios.get('你的接口地址', {
        headers: { 'Token': token },
        responseType: 'blob',
        params: {
          // 参数
        }
      }).then((response) => {
        // 将获取到的文件对象传递给 uploadExcel 方法
        const file = new File([response.data], 'XXX.xlsx', { type: response.data.type });
        console.log(file);
        var files = [];
        files.push(file);
        this.uploadExcel(files);
      })
      .catch((error) => {
        console.error('文件获取失败:', error);
      })
    },
    uploadExcel(files) {
      if (files == null || files.length == 0) return alert('没有文件等待导入');

      let name = files[0].name;
      let suffixArr = name.split('.'),
        suffix = suffixArr[suffixArr.length - 1];
      if (suffix != 'xlsx') return alert('目前只支持导入xlsx文件');
        
      LuckyExcel.transformExcelToLucky(files[0], function (exportJson, luckysheetfile) {
        if (exportJson.sheets == null || exportJson.sheets.length == 0) return alert('读取excel文件内容失败, 目前不支持XLS文件!');
        window.luckysheet.destroy();

        window.luckysheet.create({
          data: exportJson.sheets,
          title: exportJson.info.name,
          userInfo: exportJson.info.name.creator,
          container: 'luckysheet', // 设定DOM容器的id
          showtoolbar: false, // 是否显示工具栏
          showinfobar: false, // 是否显示顶部信息栏
          showstatisticBar: false, // 是否显示底部计数栏
          sheetBottomConfig: false, // sheet页下方的添加行按钮和回到顶部按钮配置
          allowEdit: false, // 是否允许前台编辑
          enableAddRow: false, // 是否允许增加行
          enableAddCol: false, // 是否允许增加列
          sheetFormulaBar: false, // 是否显示公式栏
          enableAddBackTop: false, // 返回头部按钮
          showsheetbar: false, // 是否显示底部sheet页按钮
          enableAddRow: false,//允许添加行
          // 自定义配置底部sheet页按钮
          showsheetbarConfig: {
            add: false,
            menu: false,
          },
        });
      });
    },

三、注意事项

1、一定要给容器设置宽高等样式

<div style="position: relative;height: 100vh;;">
  <div
    id="luckysheet"
    style="padding: 0px; position: absolute; width: 100%; left: 0px; top: 10px; bottom: 10px"
   >
   </div>
 </div>

2、请求接口的时候需要配置 responseType: 'blob',至少我的这个项目是这样的

responseType: 'blob',

3、接收接口响应回来的数据的处理 { type: response.data.type },至少我的这个项目是这样的

const file = new File([response.data], 'XXX.xlsx', { type: response.data.type });

tips2、3如果没有配置的话,能够正常请求接口并返回数据,但是不会正常显示excel表格,这是一个不太明显坑。

四、完整示例

index.html

<!DOCTYPE html>
<html lang="zh-cmn-Hans">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <title>XXX</title>
    <link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/plugins/css/pluginsCss.css' />
    <link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/plugins/plugins.css' />
    <link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/css/luckysheet.css' />
    <link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/assets/iconfont/iconfont.css' />
    <script src="https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/plugins/js/plugin.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/luckysheet.umd.js"></script>
  </head>
  <body>
    <div id="app"></div>
</html>

LuckyExcel.vue

<template>
  <div style="position: relative;height: 100vh;;">
    <div
      id="luckysheet"
      style="padding: 0px; position: absolute; width: 100%; left: 0px; top: 10px; bottom: 10px"
   >
    </div>
  </div>
</template>

<script>
  import LuckyExcel from 'luckyexcel';
  import axios from 'axios';
  
  mounted() {
    this.loadExcel();
  },

  methods: {
    loadExcel() {
      const token = '用户token'
      axios.get('你的接口地址', {
        headers: { 'Token': token },
        responseType: 'blob',
        params: {
          // 参数
        }
      }).then((response) => {
        // 将获取到的文件对象传递给 uploadExcel 方法
        const file = new File([response.data], 'XXX.xlsx', { type: response.data.type });
        console.log(file);
        var files = [];
        files.push(file);
        this.uploadExcel(files);
      })
      .catch((error) => {
        console.error('文件获取失败:', error);
      })
    },
    uploadExcel(files) {
      if (files == null || files.length == 0) return alert('没有文件等待导入');

      let name = files[0].name;
      let suffixArr = name.split('.'),
        suffix = suffixArr[suffixArr.length - 1];
      if (suffix != 'xlsx') return alert('目前只支持导入xlsx文件');
        
      LuckyExcel.transformExcelToLucky(files[0], function (exportJson, luckysheetfile) {
        if (exportJson.sheets == null || exportJson.sheets.length == 0) return alert('读取excel文件内容失败, 目前不支持XLS文件!');
        window.luckysheet.destroy();

        window.luckysheet.create({
          data: exportJson.sheets,
          title: exportJson.info.name,
          userInfo: exportJson.info.name.creator,
          container: 'luckysheet', // 设定DOM容器的id
          showtoolbar: false, // 是否显示工具栏
          showinfobar: false, // 是否显示顶部信息栏
          showstatisticBar: false, // 是否显示底部计数栏
          sheetBottomConfig: false, // sheet页下方的添加行按钮和回到顶部按钮配置
          allowEdit: false, // 是否允许前台编辑
          enableAddRow: false, // 是否允许增加行
          enableAddCol: false, // 是否允许增加列
          sheetFormulaBar: false, // 是否显示公式栏
          enableAddBackTop: false, // 返回头部按钮
          showsheetbar: false, // 是否显示底部sheet页按钮
          enableAddRow: false,//允许添加行
          // 自定义配置底部sheet页按钮
          showsheetbarConfig: {
            add: false,
            menu: false,
          },
        });
      });
    },
  }

  欢迎扫码下方二维码关注VX公众号

  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 27
    评论
要将弹窗中选择的数据回显到 `el-table` 的单元格中,可以使用以下步骤: 1. 首先,需要在 `el-table` 中创建一个列,用于显示选择的数据。可以使用以下代码: ```html <el-table-column prop="selectedData" label="选择的数据"></el-table-column> ``` 其中 `prop` 属性表示要显示的数据数据源中的属性名,`label` 属性表示列标题。 2. 在 Vue 组件的 `data` 中,添加一个 `selectedData` 属性,用于存储选择的数据,例如: ```javascript data() { return { selectedData: null } } ``` 3. 在弹窗中,当用户选择数据时,将其存储到 `selectedData` 属性中。可以使用以下代码: ```javascript methods: { selectData(data) { this.selectedData = data; } } ``` 其中 `selectData` 方法用于处理用户选择数据的事件。在这个方法中,将用户选择的数据存储到 `selectedData` 属性中。 4. 最后,在 `el-table` 中的相应行中,使用 `selectedData` 属性来显示选择的数据。可以使用以下代码: ```html <el-table-column prop="selectedData" label="选择的数据"></el-table-column> <el-table-column prop="其他数据" label="其他数据"></el-table-column> <el-table-column> <template slot-scope="scope"> <el-button @click="showDialog(scope.row)">选择数据</el-button> </template> </el-table-column> ``` 其中 `prop` 属性表示要显示的数据数据源中的属性名,`label` 属性表示列标题。在第三列中,使用 `el-button` 组件来触发弹窗。 5. 在弹窗中,当用户选择数据时,将其回显到 `el-table` 中的相应单元格中。可以使用以下代码: ```javascript methods: { selectData(data) { this.selectedData = data; // 回显选择的数据 this.$emit('update:selectedData', this.selectedData); // 关闭弹窗 this.dialogVisible = false; } } ``` 其中 `update:selectedData` 事件用于将选择的数据回传给父组件。在子组件中,可以使用 `v-model` 指令来监听该事件,例如: ```html <my-dialog v-model="selectedData"></my-dialog> <el-table :data="tableData"> <el-table-column prop="selectedData" label="选择的数据"></el-table-column> <el-table-column prop="其他数据" label="其他数据"></el-table-column> <el-table-column> <template slot-scope="scope"> <el-button @click="showDialog(scope.row)">选择数据</el-button> </template> </el-table-column> </el-table> ``` 其中,`my-dialog` 是弹窗组件的名称,`v-model` 指令会自动将 `selectedData` 属性传递给弹窗组件,并监听 `update:selectedData` 事件。当用户在弹窗中选择数据时,`selectedData` 属性将被更新,然后将回显到 `el-table` 的单元格中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值