当前位置:   article > 正文

Vue-Luckysheet的使用方法

luckysheet

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

配置文档 · API · 教程:快速上手 | Luckysheet文档

现将分享我在使用该组件过程中遇到的问题及解决方法。

第一步:定义Luckysheet组件:组件系统是 Vue 的另一个重要概念,因为它是一种抽象,允许我们使用小型、独立和通常可复用的组件构建大型应用,因此,先定义好可重复使用的Luckysheet组件。代码如下:

  1. <template>
  2. <div class="hello">
  3. <div id="luckysheet" class="luckysheet-content"></div>
  4. </div>
  5. </template>
  6. <script>
  7. export default {
  8. name: "HelloWorld",
  9. data() {
  10. return {};
  11. },
  12. mounted() {
  13. // In some cases, you need to use $nextTick
  14. // this.$nextTick(() => {
  15. $(function () {
  16. luckysheet.create({
  17. container: "luckysheet", // 设定DOM容器的id
  18. title: "Luckysheet Demo", // 设定表格名称
  19. lang: "zh", // 设定表格语言
  20. plugins: ["chart"],
  21. data: [
  22. {
  23. name: "", //工作表名称
  24. color: "#eee333", //工作表(工作表名称底部边框线)颜色
  25. index: 0, //工作表索引(新增一个工作表时该值是一个随机字符串)
  26. status: 1, //激活状态
  27. order: 0, //工作表的下标
  28. hide: 0, //是否隐藏
  29. row: 36, //行数
  30. column: 10, //列数
  31. defaultRowHeight: 28, //自定义行高,单位px
  32. defaultColWidth: 100, //自定义列宽,单位px
  33. celldata: [], //初始化使用的单元格数据,r代表行,c代表列,v代表该单元格的值,最后展示的是value1,value2
  34. config: {
  35. merge: {}, //合并单元格
  36. rowlen: {}, //表格行高
  37. columnlen: {}, //表格列宽
  38. rowhidden: {}, //隐藏行
  39. colhidden: {}, //隐藏列
  40. borderInfo: {}, //边框
  41. authority: {}, //工作表保护
  42. },
  43. scrollLeft: 0, //左右滚动条位置
  44. scrollTop: 0, //上下滚动条位置
  45. luckysheet_select_save: [], //选中的区域
  46. calcChain: [], //公式链
  47. isPivotTable: false, //是否数据透视表
  48. pivotTable: {}, //数据透视表设置
  49. filter_select: {}, //筛选范围
  50. filter: null, //筛选配置
  51. luckysheet_alternateformat_save: [], //交替颜色
  52. luckysheet_alternateformat_save_modelCustom: [], //自定义交替颜色
  53. luckysheet_conditionformat_save: {}, //条件格式
  54. frozen: {}, //冻结行列配置
  55. chart: [], //图表配置
  56. zoomRatio: 1, // 缩放比例
  57. image: [], //图片
  58. showGridLines: 1, //是否显示网格线
  59. dataVerification: {}, //数据验证配置
  60. },
  61. ],
  62. showtoolbar: false,
  63. showtoolbarConfig: {
  64. undoRedo: false, //撤销重做,注意撤消重做是两个按钮,由这一个配置决定显示还是隐藏
  65. paintFormat: false, //格式刷
  66. currencyFormat: false, //货币格式
  67. percentageFormat: false, //百分比格式
  68. numberDecrease: false, // '减少小数位数'
  69. numberIncrease: false, // '增加小数位数
  70. moreFormats: false, // '更多格式'
  71. font: false, // '字体'
  72. fontSize: false, // '字号大小'
  73. bold: false, // '粗体 (Ctrl+B)'
  74. italic: false, // '斜体 (Ctrl+I)'
  75. strikethrough: false, // '删除线 (Alt+Shift+5)'
  76. underline: false, // '下划线 (Alt+Shift+6)'
  77. textColor: false, // '文本颜色'
  78. fillColor: false, // '单元格颜色'
  79. border: false, // '边框'
  80. mergeCell: false, // '合并单元格'
  81. horizontalAlignMode: false, // '水平对齐方式'
  82. verticalAlignMode: false, // '垂直对齐方式'
  83. textWrapMode: false, // '换行方式'
  84. textRotateMode: false, // '文本旋转方式'
  85. image: false, // '插入图片'
  86. link: false, // '插入链接'
  87. chart: false, // '图表'(图标隐藏,但是如果配置了chart插件,右击仍然可以新建图表)
  88. postil: false, //'批注'
  89. pivotTable: false, //'数据透视表'
  90. function: false, // '公式'
  91. frozenMode: false, // '冻结方式'
  92. sortAndFilter: false, // '排序和筛选'
  93. conditionalFormat: false, // '条件格式'
  94. dataVerification: false, // '数据验证'
  95. splitColumn: false, // '分列'
  96. screenshot: false, // '截图'
  97. findAndReplace: false, // '查找替换'
  98. protection: false, // '工作表保护'
  99. print: false, // '打印'
  100. },
  101. showsheetbar: false, //是否显示底部sheet页按钮
  102. showsheetbarConfig: {
  103. add: false, //新增sheet
  104. menu: false, //sheet管理菜单
  105. sheet: false, //sheet页显示
  106. },
  107. showinfobar: false, //是否显示顶部信息栏
  108. showstatisticBar: false, //是否显示底部计数栏
  109. showstatisticBarConfig: {
  110. count: false, // 计数栏
  111. view: false, // 打印视图
  112. zoom: false, // 缩放
  113. },
  114. sheetFormulaBar: false, //是否显示公式栏
  115. allowCopy: false, //是否允许拷贝
  116. enableAddRow: true, //允许添加行
  117. });
  118. });
  119. // });
  120. },
  121. };
  122. </script>
  123. <style lang="css" scoped>
  124. .luckysheet-content {
  125. margin: 0px;
  126. padding: 0px;
  127. position: absolute;
  128. width: 100%;
  129. height: 500px;
  130. left: 0px;
  131. top: 40px;
  132. bottom: 0px;
  133. }
  134. </style>

页面样式效果是这样子的,可实现复制粘贴,excel的单元格下拉等表格操作,重点在于创建luckysheet实例时对实例属性的配置。

 第二步:引用组件,在父组件中注册并引用组件。先import 组件,再components 中注册,最后在以标签的形式引用组件。代码如下:

  1. <template>
  2. <div id="app">
  3. <HelloWorld />
  4. </div>
  5. </template>
  6. <script>
  7. import HelloWorld from './components/HelloWorld.vue'
  8. export default {
  9. name: 'App',
  10. components: {
  11. HelloWorld
  12. }
  13. }
  14. </script>
  15. <style>
  16. #app {
  17. font-family: Avenir, Helvetica, Arial, sans-serif;
  18. -webkit-font-smoothing: antialiased;
  19. -moz-osx-font-smoothing: grayscale;
  20. text-align: center;
  21. color: #2c3e50;
  22. margin-top: 60px;
  23. }
  24. </style>

第三步:父组件将接口返回的数据传递给子组件,子组件获取数据渲染数据。代码如下:

父组件中获取数据并绑定参数传值。

  1. <template>
  2. <div id="app">
  3. <HelloWorld v-bind:sheetParams="sheetParams" />
  4. </div>
  5. </template>
  6. <script>
  7. import HelloWorld from "./components/HelloWorld.vue";
  8. export default {
  9. name: "App",
  10. components: {
  11. HelloWorld,
  12. },
  13. data() {
  14. return {
  15. sheetParams: {
  16. excelHeader: ["姓名", "年龄", "性别"],
  17. excelData: {
  18. 姓名: ["张三", "赵兰", "李四"],
  19. 年龄: ["18", "17", "20"],
  20. 性别: ["男", "女", "男"],
  21. },
  22. },
  23. };
  24. },
  25. };
  26. </script>
  27. <style>
  28. #app {
  29. font-family: Avenir, Helvetica, Arial, sans-serif;
  30. -webkit-font-smoothing: antialiased;
  31. -moz-osx-font-smoothing: grayscale;
  32. text-align: center;
  33. color: #2c3e50;
  34. margin-top: 60px;
  35. }
  36. </style>

子组件获取父组件传递的数据,渲染数据。

  1. <template>
  2. <div class="hello">
  3. <div id="luckysheet" class="luckysheet-content"></div>
  4. </div>
  5. </template>
  6. <script>
  7. export default {
  8. name: "HelloWorld",
  9. props: {
  10. sheetParams: {},
  11. },
  12. data() {
  13. return {
  14. luckysheetOption: {
  15. container: "luckysheet", // 设定DOM容器的id
  16. title: "Luckysheet Demo", // 设定表格名称
  17. lang: "zh", // 设定表格语言
  18. plugins: ["chart"],
  19. data: [
  20. {
  21. name: "", //工作表名称
  22. color: "#eee333", //工作表(工作表名称底部边框线)颜色
  23. index: 0, //工作表索引(新增一个工作表时该值是一个随机字符串)
  24. status: 1, //激活状态
  25. order: 0, //工作表的下标
  26. hide: 0, //是否隐藏
  27. row: 36, //行数
  28. column: 10, //列数
  29. defaultRowHeight: 28, //自定义行高,单位px
  30. defaultColWidth: 100, //自定义列宽,单位px
  31. celldata: [], //初始化使用的单元格数据,r代表行,c代表列,v代表该单元格的值,最后展示的是value1,value2
  32. config: {
  33. merge: {}, //合并单元格
  34. rowlen: {}, //表格行高
  35. columnlen: {}, //表格列宽
  36. rowhidden: {}, //隐藏行
  37. colhidden: {}, //隐藏列
  38. borderInfo: {}, //边框
  39. authority: {}, //工作表保护
  40. },
  41. scrollLeft: 0, //左右滚动条位置
  42. scrollTop: 0, //上下滚动条位置
  43. luckysheet_select_save: [], //选中的区域
  44. calcChain: [], //公式链
  45. isPivotTable: false, //是否数据透视表
  46. pivotTable: {}, //数据透视表设置
  47. filter_select: {}, //筛选范围
  48. filter: null, //筛选配置
  49. luckysheet_alternateformat_save: [], //交替颜色
  50. luckysheet_alternateformat_save_modelCustom: [], //自定义交替颜色
  51. luckysheet_conditionformat_save: {}, //条件格式
  52. frozen: {}, //冻结行列配置
  53. chart: [], //图表配置
  54. zoomRatio: 1, // 缩放比例
  55. image: [], //图片
  56. showGridLines: 1, //是否显示网格线
  57. dataVerification: {}, //数据验证配置
  58. },
  59. ],
  60. showtoolbar: false,
  61. showtoolbarConfig: {
  62. undoRedo: false, //撤销重做,注意撤消重做是两个按钮,由这一个配置决定显示还是隐藏
  63. paintFormat: false, //格式刷
  64. currencyFormat: false, //货币格式
  65. percentageFormat: false, //百分比格式
  66. numberDecrease: false, // '减少小数位数'
  67. numberIncrease: false, // '增加小数位数
  68. moreFormats: false, // '更多格式'
  69. font: false, // '字体'
  70. fontSize: false, // '字号大小'
  71. bold: false, // '粗体 (Ctrl+B)'
  72. italic: false, // '斜体 (Ctrl+I)'
  73. strikethrough: false, // '删除线 (Alt+Shift+5)'
  74. underline: false, // '下划线 (Alt+Shift+6)'
  75. textColor: false, // '文本颜色'
  76. fillColor: false, // '单元格颜色'
  77. border: false, // '边框'
  78. mergeCell: false, // '合并单元格'
  79. horizontalAlignMode: false, // '水平对齐方式'
  80. verticalAlignMode: false, // '垂直对齐方式'
  81. textWrapMode: false, // '换行方式'
  82. textRotateMode: false, // '文本旋转方式'
  83. image: false, // '插入图片'
  84. link: false, // '插入链接'
  85. chart: false, // '图表'(图标隐藏,但是如果配置了chart插件,右击仍然可以新建图表)
  86. postil: false, //'批注'
  87. pivotTable: false, //'数据透视表'
  88. function: false, // '公式'
  89. frozenMode: false, // '冻结方式'
  90. sortAndFilter: false, // '排序和筛选'
  91. conditionalFormat: false, // '条件格式'
  92. dataVerification: false, // '数据验证'
  93. splitColumn: false, // '分列'
  94. screenshot: false, // '截图'
  95. findAndReplace: false, // '查找替换'
  96. protection: false, // '工作表保护'
  97. print: false, // '打印'
  98. },
  99. showsheetbar: false, //是否显示底部sheet页按钮
  100. showsheetbarConfig: {
  101. add: false, //新增sheet
  102. menu: false, //sheet管理菜单
  103. sheet: false, //sheet页显示
  104. },
  105. showinfobar: false, //是否显示顶部信息栏
  106. showstatisticBar: false, //是否显示底部计数栏
  107. showstatisticBarConfig: {
  108. count: false, // 计数栏
  109. view: false, // 打印视图
  110. zoom: false, // 缩放
  111. },
  112. sheetFormulaBar: false, //是否显示公式栏
  113. allowCopy: false, //是否允许拷贝
  114. enableAddRow: true, //允许添加行
  115. }
  116. };
  117. },
  118. created() {},
  119. mounted() {
  120. this.initLuckysheet(this.sheetParams);
  121. },
  122. methods: {
  123. initLuckysheet(data) {
  124. var _this = this;//注意这里要重新指定下this对象。
  125. // In some cases, you need to use $nextTick
  126. // this.$nextTick(() => {
  127. $(function () {
  128. if (data.excelHeader.length != 0 && JSON.stringify(data.excelData) != "{}") {
  129. _this.luckysheetOption.hook = {
  130. workbookCreateAfter: function () {
  131. _this.dataRendSheet(data.excelHeader, data.excelData);
  132. },
  133. };
  134. }
  135. luckysheet.create(_this.luckysheetOption);
  136. });
  137. // });
  138. },
  139. /**接口数据回显 */
  140. dataRendSheet(excelHeader, excelData) {
  141. //回显表格表头,第一行
  142. if (excelHeader.length > 0) {
  143. excelHeader.forEach((item1, index1) => {
  144. luckysheet.setCellValue(0, index1, item1);
  145. //普通回显数据
  146. if (JSON.stringify(excelData) != "{}") {
  147. excelData[item1].forEach((item2, index2) => {
  148. var row = index2 + 1;
  149. luckysheet.setCellValue(row, index1, item2);
  150. });
  151. }
  152. });
  153. }
  154. },
  155. },
  156. };
  157. </script>
  158. <style lang="css" scoped>
  159. .luckysheet-content {
  160. margin: 0px;
  161. padding: 0px;
  162. position: absolute;
  163. width: 100%;
  164. height: 500px;
  165. left: 0px;
  166. top: 40px;
  167. bottom: 0px;
  168. }
  169. </style>

表格回显数据如图:

 注意两点,第一数据格式,就是对象数组的转换,没什么难度;第二用到了Luckysheet的钩子函数,钩子函数的用法是在配置对象加一个hook对象,并给hook对象添加一个workbookCreateAfter方法,在工作簿创建好之后就执行这个函数的渲染数据的逻辑。

第四步:父组件获取子组件修改后的数据。父组件的布局和样式有调整,以对话框的形式来引用组件,点击按钮,获取数据。代码如下:

  1. <template>
  2. <div id="app">
  3. <div>
  4. <el-dialog
  5. :title="luckysheetName"
  6. :visible.sync="centerDialogVisible"
  7. v-if="centerDialogVisible"
  8. width="50%"
  9. :fullscreen="fullscreen"
  10. :lock-scroll="lockScroll"
  11. :close-on-click-modal="closeOnClickModal"
  12. :close-on-press-escape="closeOnPressEscape"
  13. >
  14. <div style="width: 100%; height: 500px; position: relative">
  15. <!-- luckysheet 数据编辑组件引用 -->
  16. <HelloWorld
  17. ref="luckysheetRef"
  18. v-on:getLuckySheetData="receive"
  19. v-bind:sheetParams="sheetParams"
  20. />
  21. </div>
  22. <div slot="footer" class="dialog-footer">
  23. <el-button @click="handleToClose">取 消</el-button>
  24. <el-button type="primary" @click="saveSheetData">确 定</el-button>
  25. </div>
  26. </el-dialog>
  27. </div>
  28. </div>
  29. </template>
  30. <script>
  31. import HelloWorld from "./components/HelloWorld.vue";
  32. export default {
  33. name: "App",
  34. components: {
  35. HelloWorld,
  36. },
  37. data() {
  38. return {
  39. centerDialogVisible: true,
  40. closeOnClickModal: false,
  41. closeOnPressEscape: false,
  42. fullscreen: false,
  43. lockScroll: false,
  44. luckysheetName: "luckysheet数据编辑",
  45. sheetParams: {
  46. excelHeader: ["姓名", "年龄", "性别"],
  47. excelData: {
  48. 姓名: ["张三", "赵兰", "李四"],
  49. 年龄: ["18", "17", "20"],
  50. 性别: ["男", "女", "男"],
  51. },
  52. },
  53. luckySheetData: {
  54. excelHeader: [],
  55. excelData: {},
  56. },
  57. };
  58. },
  59. methods: {
  60. saveSheetData() {
  61. var _this = this;
  62. _this.$refs.luckysheetRef.getSheetData(); //调用子组件获取sheet数据
  63. console.log(JSON.stringify(_this.luckySheetData));
  64. // document.getElementById("luckysheet-input-box").style.zIndex = "-1";
  65. // document.getElementsByClassName("luckysheet-cell-input").innerHTML = "";
  66. // _this.dialogFormVisible = false; //关闭对话框
  67. },
  68. //luckySheet数据接收
  69. receive: function (sheetTitle, commonData) {
  70. var _this = this;
  71. _this.luckySheetData.excelHeader = sheetTitle;
  72. _this.luckySheetData.excelData = commonData;
  73. },
  74. handleToClose() {
  75. this.centerDialogVisible = false;
  76. }
  77. },
  78. };
  79. </script>
  80. <style>
  81. #app {
  82. font-family: Avenir, Helvetica, Arial, sans-serif;
  83. -webkit-font-smoothing: antialiased;
  84. -moz-osx-font-smoothing: grayscale;
  85. text-align: center;
  86. color: #2c3e50;
  87. margin-top: 60px;
  88. }
  89. </style>

页面效果如图:

 点击确定按钮,获取的数据格式为:

{"excelHeader":["姓名","年龄","性别"],"excelData":[{"姓名":"张三","年龄":18,"性别":"男"},{"姓名":"赵兰","年龄":17,"性别":"女"},{"姓名":"李四","年龄":20,"性别":"男"}]}

注意一:如果想每次打开对话框都重新加载数据和渲染画布,则在对话框加上两行代码:     :visible.sync="centerDialogVisible";v-if="centerDialogVisible"

注意二:文件的引用放在public目录下的index.html文件中,luckysheet文件的引用路径一定要对,

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width,initial-scale=1.0">
  7. <link rel="icon" href="<%= BASE_URL %>favicon.ico">
  8. <title><%= htmlWebpackPlugin.options.title %></title>
  9. <link rel='stylesheet' href='./plugins/css/pluginsCss.css' />
  10. <link rel='stylesheet' href='./plugins/plugins.css' />
  11. <link rel='stylesheet' href='./css/luckysheet.css' />
  12. <link rel='stylesheet' href='./assets/iconfont/iconfont.css' />
  13. <script src="./plugins/js/plugin.js"></script>
  14. <script src="./luckysheet.umd.js"></script>
  15. </head>
  16. <body>
  17. <noscript>
  18. <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
  19. </noscript>
  20. <div id="app"></div>
  21. <!-- built files will be auto injected -->
  22. </body>
  23. </html>

如图:

好了,今天分享的关于Luckysheet组件在vue中使用的方法,就到这里了,希望能够帮助到大家。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/396079
推荐阅读
相关标签
  

闽ICP备14008679号