当前位置:   article > 正文

基于Vue的Excel文件预览(使用LuckyExcel、LuckySheet实现)_luckexcel

luckexcel

目录

一、介绍 

二、基本思路

三、安装

Luckyexcel

Luckysheet

CDN引入:

本地引入:

四、具体实现:

1、首先需要一个页面,用于excel的预览展示。

2、编写Excel解析渲染函数:openExcel(url链接,文件名)。

3、最后在create函数里编写从某页面跳转此页面之后的渲染逻辑。

4、如果处理的数据量较大,可以使用Luckysheet配置参数中的loadUrl和loadSheetUrl来分Sheet页加载。


        excel文件位于文件资源服务器上,可以直接访问excel文件链接获取文件。基于这种情况将excel文件展示在网页上,只提供预览功能。

一、介绍 

Luckysheet:一款开源的、纯前端的、类似excel的在线表格。可以藉此实现在线excel预览、编辑、导入导出及其他各种excel表格相关操作。

LuckyexcelLuckysheet的一款适配插件的excel导入导出库,只支持.xlsx格式文件(不支持.xls)。

二、基本思路

1、使用LuckyExcel的transformExcelToLuckyByUrl=function (url, name, callBack) 方法将excel文件转换成LuckySheet需要的数据格式。

2、使用LuckySheet将上述数据渲染到页面上。

三、安装

Luckyexcel

npm下载:npm install luckyexcel --save

Luckysheet

  • 在/publiic/index.html文件里引入即可(可以本地引入,也可以CDN引入)。
CDN引入:
  1. <link rel='stylesheet' href='./static/luckysheet/plugins/css/pluginsCss.css' />
  2. <link rel='stylesheet' href='./static/luckysheet/plugins/plugins.css' />
  3. <link rel='stylesheet' href='./static/luckysheet/css/luckysheet.css' />
  4. <link rel='stylesheet' href='./static/luckysheet/assets/iconfont/iconfont.css' />
  5. <script src="./static/luckysheet/plugins/js/plugin.js"></script>
  6. <script src="./static/luckysheet/luckysheet.umd.js"></script>
本地引入:
  • npm下载luckysheet,然后将包内plugins、css、fonts、assets文件夹及luckysheet.umd.js放入public下的某目录,然后引入对应文件。

参考如下(/public/static/luckysheet)。

  1. <link rel='stylesheet' href='./static/luckysheet/plugins/css/pluginsCss.css' />
  2. <link rel='stylesheet' href='./static/luckysheet/plugins/plugins.css' />
  3. <link rel='stylesheet' href='./static/luckysheet/css/luckysheet.css' />
  4. <link rel='stylesheet' href='./static/luckysheet/assets/iconfont/iconfont.css' />
  5. <script src="./static/luckysheet/plugins/js/plugin.js"></script>
  6. <script src="./static/luckysheet/luckysheet.umd.js"></script>

四、具体实现:

1、首先需要一个页面,用于excel的预览展示。

页面中需要一个固定id的容器,用于承接Luckysheet的渲染,这里命名id为“luckysheet”。此外,容器需要设置好样式,尤其宽高。

  1. <template>
  2. <div>
  3. <div id="luckysheet" :style="{ margin: '0px',padding:'0px',width:'100%',height: '800px' }"/>
  4. </div>
  5. </template>
2、编写Excel解析渲染函数:openExcel(url链接,文件名)。

-- 使用LuckyExcel.transformExcelToLuckyByUrl(url, name,(exportJson, luckysheetfile) => {回调函数})。其中exportJson是Luckyexcel解析好的Excel文件数据,其中部分字段如下:

  1. {
  2. "info": {
  3. "appversion": "14.0300 ",
  4. "company": "",
  5. "createdTime": "2020-11-10T02:35:00Z",
  6. "creator": "Apache POI",
  7. "lastmodifiedby": "SSRS",
  8. "modifiedTime": "2023-07-11T02:54:58Z",
  9. "name": null
  10. },
  11. "sheets": [{ --sheet表集合
  12. "celldata": [{ --每个单元格数的数据
  13. "c": 0,
  14. "r": 0,
  15. "v": {
  16. "bg": "#FFFFFF",
  17. "bl": 1,
  18. "ct": {
  19. "fa": "General",
  20. "t": "s"
  21. },
  22. "ff": "微软雅黑",
  23. "fs": 18,
  24. "ht": 0,
  25. "qp": 1,
  26. "tb": 2,
  27. "v": "单元格内容",
  28. "vt": 0
  29. }
  30. }],
  31. "config": {}, --当前sheet表的配置格式
  32. "index": "3", --sheet表的index
  33. "name": "XXXXXX", --sheet表名
  34. "order": "0", --sheet表的次序
  35. "showGridLines": "1",
  36. "status": "1" --sheet表显示状态,哪个显示哪个是1
  37. }]
  38. }

-- 使用window.luckysheet.create(options)函数预览excel表格。options参考如下:

整体配置 | Luckysheet文档

-- 其中在回调函数里将exportJson的sheets数据赋给options.data即可

 

  1. const openExcel = ({url:url,name:name}) => {
  2. nextTick(() => {
  3. LuckyExcel.transformExcelToLuckyByUrl(url, name,(exportJson, luckysheetfile) => {
  4. if (exportJson.sheets == null || exportJson.sheets.length === 0) {
  5. alert("Fail to read the content of the excel file")
  6. return;
  7. }
  8. console.log('exportJson',exportJson)
  9. // luckysheet生成网页excel
  10. window.luckysheet.destroy()
  11. window.luckysheet.create({
  12. container: 'luckysheet', // 设定DOM容器的id
  13. showtoolbar: false, // 是否显示工具栏
  14. showinfobar: false, // 是否显示顶部信息栏
  15. showsheetbarConfig: {
  16. add: false, //新增sheet
  17. menu: true, //sheet管理菜单
  18. sheet: true //sheet页显示
  19. },
  20. sheetRightClickConfig: {
  21. delete: false, // 删除
  22. copy: false, // 复制
  23. rename: false, //重命名
  24. color: false, //更改颜色
  25. hide: false, //隐藏,取消隐藏
  26. move: false, //向左移,向右移
  27. },
  28. showstatisticBar: false, // 是否显示底部计数栏
  29. sheetBottomConfig: false, // sheet页下方的添加行按钮和回到顶部按钮配置
  30. allowEdit: false, // 是否允许前台编辑
  31. enableAddRow: false, // 是否允许增加行
  32. enableAddCol: false, // 是否允许增加列
  33. sheetFormulaBar: false, // 是否显示公式栏
  34. enableAddBackTop: false, //返回头部按钮
  35. data: exportJson.sheets, //表格内容
  36. title: exportJson.info.name, //表格标题
  37. });
  38. })
  39. })
  40. };
3、最后在create函数里编写从某页面跳转此页面之后的渲染逻辑。
  1. created() {
  2. // 上一个页面采用router.push({name: "ExcelShow", query: {url: url,name: name}}) 方式跳转传参
  3. // 获取参数: excel文件链接url及其名称name
  4. const fileUrl= this.$route.query.url ? this.$route.query.url : null
  5. const fileName= this.$route.query.name ? this.$route.query.name : null
  6. if (fileUrl == null) {
  7. alert("error")
  8. } else {
  9. // 加载文件内容
  10. this.openExcel({url:fileUrl,name:fileName})
  11. }
  12. },
4、如果处理的数据量较大,可以使用Luckysheet配置参数中的loadUrl和loadSheetUrl来分Sheet页加载。

        loadUrl先加载默认sheet表的数据和所有sheet表的基本配置信息,随后切换到其它页的时候再请求loadSheetUrl将其数据补全。两个参数均为接口地址,使用post请求。具体数据格式见文档。

        由于excel文件是本身存在的,没有用后端生成,如果再使用后端构建数据集的话不太方便,所以我采用Luckyexcel加载文件所有数据,然后拆分exportJson,构建成两个数据集firstData和secondData。firstData是loadUrl配置的接口应该返回数据,secondData是loadSheetUrl配置的接口应该返回的数据。

  1. const firstData = [];
  2. const secondData = {};
  3. for (let i = 0; i < exportJson.sheets.length; i++) {
  4. firstData[i] = {
  5. name: exportJson.sheets[i].name,
  6. index: exportJson.sheets[i].index,
  7. order: exportJson.sheets[i].order,
  8. status: exportJson.sheets[i].status,
  9. config: exportJson.sheets[i].config
  10. }
  11. firstData[i].config.row = 10
  12. parseInt(exportJson.sheets[i].status) === 1 ? firstData[i].celldata = exportJson.sheets[i].celldata : 0 == 0
  13. secondData[exportJson.sheets[i].index] = exportJson.sheets[i].celldata
  14. }

         然后,修改Luckysheet的源码,全局搜索,将所有对应$.post(loadurl, {"gridKey" : server.gridKey}, function (d) {里面的内容})$.post(loadSheetUrl, {"gridKey" : server.gridKey, "index": sheetindex.join(",")}, function (d) {里面的内容})的post请求外皮注释掉,只留下post请求里面的回调函数function (d)里面的内容,并将里面的内容中的原参数d改为loadurl或loadSheetUrl。

        最后编译打包,将生成的文件替换掉在安装步骤“引入luckysheet”时引入的文件。

 此时,在原项目中注释掉options配置的data,将JSON.stringify(firstData)赋给loadUrl,JSON.stringify(secondData)赋给loadSheetUrl即可。

最终代码如下:

  1. <template>
  2. <div>
  3. <a-page-header title="Title" sub-title="This is a subtitle" @back="() => $router.go(-1)">
  4. <template #extra>
  5. <a-button @click="() => this.$router.back()">返回</a-button>
  6. <a-button v-if="!state.err" type="primary" @click="downfile({url: state.fileUrl,name: state.fileName})">保存</a-button>
  7. </template>
  8. </a-page-header>
  9. <a-card :bordered="false" :style="{ background: '#fff', minHeight: '280px' }">
  10. <div id="luckysheet" :style="{ margin: '0px',padding:'0px',width:'100%',height: totalHeight+'px' }"/>
  11. </a-card>
  12. </div>
  13. </template>
  14. <script>
  15. import LuckyExcel from 'luckyexcel';
  16. import {defineComponent, nextTick} from "vue";
  17. import {reactive} from "vue";
  18. export default defineComponent({
  19. created() {
  20. const fileUrl= this.$route.query.url ? this.$route.query.url : null
  21. const fileName= this.$route.query.name ? this.$route.query.name : null
  22. this.state.fileUrl = fileUrl
  23. this.state.fileName = fileName
  24. if (fileUrl == null) {
  25. alert("error")
  26. } else {
  27. // 加载文件内容
  28. this.openExcel({url:fileUrl,name:fileName})
  29. }
  30. },
  31. setup() {
  32. const state = reactive({
  33. fileUrl: '',
  34. fileName: ''
  35. });
  36. const totalHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
  37. const openExcel = ({url:url,name:name}) => {
  38. nextTick(() => {
  39. LuckyExcel.transformExcelToLuckyByUrl(url, name,(exportJson, luckysheetfile) => {
  40. if (exportJson.sheets == null || exportJson.sheets.length === 0) {
  41. alert("Fail to read the content of the excel file")
  42. return;
  43. }
  44. // /public/statis/luckysheet文件夹下 是被修改的luckysheet源码
  45. // loadUrl、loadSheetUrl不再使用post接口请求,而是直接传递现成数据加载(数据格式与原post返回格式一致)
  46. // 构建loadUrl: firstData(包括所有sheet表的格式,和第一个sheet的数据)
  47. // loadSheetUrl:secondData (包括除第一个sheet表的其他所有表的数据)
  48. const firstData = [];
  49. const secondData = {};
  50. for (let i = 0; i < exportJson.sheets.length; i++) {
  51. firstData[i] = {
  52. name: exportJson.sheets[i].name,
  53. index: exportJson.sheets[i].index,
  54. order: exportJson.sheets[i].order,
  55. status: exportJson.sheets[i].status,
  56. config: exportJson.sheets[i].config
  57. }
  58. firstData[i].config.row = 10
  59. parseInt(exportJson.sheets[i].status) === 1 ? firstData[i].celldata = exportJson.sheets[i].celldata : 0 == 0
  60. secondData[exportJson.sheets[i].index] = exportJson.sheets[i].celldata
  61. }
  62. console.log('exportJson',exportJson)
  63. // luckysheet生成网页excel
  64. window.luckysheet.destroy()
  65. window.luckysheet.create({
  66. container: 'luckysheet', // 设定DOM容器的id
  67. showtoolbar: false, // 是否显示工具栏
  68. showinfobar: false, // 是否显示顶部信息栏
  69. showsheetbarConfig: {
  70. add: false, //新增sheet
  71. menu: true, //sheet管理菜单
  72. sheet: true //sheet页显示
  73. },
  74. sheetRightClickConfig: {
  75. delete: false, // 删除
  76. copy: false, // 复制
  77. rename: false, //重命名
  78. color: false, //更改颜色
  79. hide: false, //隐藏,取消隐藏
  80. move: false, //向左移,向右移
  81. },
  82. showstatisticBar: false, // 是否显示底部计数栏
  83. sheetBottomConfig: false, // sheet页下方的添加行按钮和回到顶部按钮配置
  84. allowEdit: false, // 是否允许前台编辑
  85. enableAddRow: false, // 是否允许增加行
  86. enableAddCol: false, // 是否允许增加列
  87. sheetFormulaBar: false, // 是否显示公式栏
  88. enableAddBackTop: false, //返回头部按钮
  89. // data: [exportJson.sheets[0]], //表格内容
  90. gridKey: url,
  91. loadUrl: JSON.stringify(firstData), //首先加载的数据,被修改后需要String类型
  92. loadSheetUrl: JSON.stringify(secondData), //随后加载的数据,被修改后需要String类型
  93. title: exportJson.info.name, //表格标题
  94. });
  95. })
  96. })
  97. };
  98. return {
  99. totalHeight,
  100. simpleImage: Empty.PRESENTED_IMAGE_SIMPLE,
  101. state,
  102. openExcel
  103. }
  104. }
  105. })
  106. </script>

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

闽ICP备14008679号