700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > vue中使用Luckysheet实现Excel的导入 编辑 导出等功能

vue中使用Luckysheet实现Excel的导入 编辑 导出等功能

时间:2021-11-05 16:02:29

相关推荐

vue中使用Luckysheet实现Excel的导入 编辑 导出等功能

一、准备阶段

1、在pubilic文件夹下的index.html文件中的head标签中引入Luckysheet的cdn文件

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

2、安装三个依赖(exceljs和 file-saver用来导出,luckyexcel用来处理导入数据 )

npm i -S exceljs file-saver luckyexcel

3、创建一个js文件export.js

import FileSaver from 'file-saver'const Excel = require('exceljs')var setMerge = function (luckyMerge = {}, worksheet) {const mergearr = Object.values(luckyMerge)mergearr.forEach(function (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)})}var setBorder = function (luckyBorderInfo, worksheet) {if (!Array.isArray(luckyBorderInfo)) return// console.log('luckyBorderInfo', luckyBorderInfo)luckyBorderInfo.forEach(function (elem) {// 现在只兼容到borderType 为range的情况// console.log('ele', elem)if (elem.rangeType === 'range') {const border = borderConvert(elem.borderType, elem.style, elem.color)const rang = elem.range[0]// console.log('range', rang)const row = rang.rowconst column = rang.columnfor (let i = row[0] + 1; i < row[1] + 2; i++) {for (let y = column[0] + 1; y < column[1] + 2; y++) {worksheet.getCell(i, y).border = border}}}if (elem.rangeType === 'cell') {// col_index: 2// row_index: 1// b: {// color: '#d0d4e3'// style: 1// }const {colIndex, rowIndex } = elem.valueconst borderData = Object.assign({}, elem.value)delete borderData.col_indexdelete borderData.row_indexconst border = addborderToCell(borderData, rowIndex, colIndex)// console.log('bordre', border, borderData)worksheet.getCell(rowIndex + 1, colIndex + 1).border = border}// console.log(rang.column_focus + 1, rang.row_focus + 1)// worksheet.getCell(rang.row_focus + 1, rang.column_focus + 1).border = border})}var setStyleAndValue = function (cellArr, worksheet) {if (!Array.isArray(cellArr)) returncellArr.forEach(function (row, rowid) {row.every(function (cell, columnid) {if (!cell) return trueconst fill = fillConvert(cell.bg)const font = fontConvert(cell.ff,cell.fc,cell.bl,cell.it,cell.fs,cell.cl,cell.ul)const alignment = alignmentConvert(cell.vt, cell.ht, cell.tb, cell.tr)let value = ''if (cell.f) {value = {formula: cell.f, result: cell.v }} else if (!cell.v && cell.ct && cell.ct.s) {// xls转为xlsx之后,内部存在不同的格式,都会进到富文本里,即值不存在与cell.v,而是存在于cell.ct.s之后// value = cell.ct.s[0].vcell.ct.s.forEach(arr => {value += arr.v})} else {value = cell.v}// style 填入到_value中可以实现填充色const letter = createCellPos(columnid)const target = worksheet.getCell(letter + (rowid + 1))// console.log('1233', letter + (rowid + 1))for (const key in fill) {target.fill = fillconsole.log(key)break}target.font = fonttarget.alignment = alignmenttarget.value = valuereturn true})})}var setImages = function (imagesArr, worksheet, workbook) {if (typeof imagesArr !== 'object') returnfor (const key in imagesArr) {// console.log(imagesArr[key]);// 通过 base64 将图像添加到工作簿const myBase64Image = imagesArr[key].src// 开始行 开始列 结束行 结束列const start = {col: imagesArr[key].fromCol, row: imagesArr[key].fromRow }const end = {col: imagesArr[key].toCol, row: imagesArr[key].toRow }const imageId = workbook.addImage({base64: myBase64Image,extension: 'png'})worksheet.addImage(imageId, {tl: start,br: end,editAs: 'oneCell'})}}var fillConvert = function (bg) {if (!bg) {return {}}// const bgc = bg.replace('#', '')const fill = {type: 'pattern',pattern: 'solid',fgColor: {argb: bg.replace('#', '') }}return fill}var fontConvert = function (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}}// 出现Bug,导入的时候ff为luckyToExcel的valconst font = {name: typeof ff === 'number' ? luckyToExcel[ff] : 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}var alignmentConvert = function (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}}const alignment = {vertical: luckyToExcel.vertical[vt],horizontal: luckyToExcel.horizontal[ht],wrapText: luckyToExcel.wrapText[tb],textRotation: luckyToExcel.textRotation[tr]}return alignment}var borderConvert = function (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'}}const template = {style: luckyToExcel.style[style],color: {argb: color.replace('#', '') }}const border = {}if (luckyToExcel.type[borderType] === 'all') {border['top'] = templateborder['right'] = templateborder['bottom'] = templateborder['left'] = template} else {border[luckyToExcel.type[borderType]] = template}// console.log('border', border)return border}function addborderToCell (borders, rowIndex, colIndex) {const border = {}const luckyExcel = {type: {l: 'left',r: 'right',b: 'bottom',t: 'top'},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'}}// console.log('borders', borders)for (const bor in borders) {// console.log(bor)if (borders[bor].color.indexOf('rgb') === -1) {border[luckyExcel.type[bor]] = {style: luckyExcel.style[borders[bor].style],color: {argb: borders[bor].color.replace('#', '') }}} else {border[luckyExcel.type[bor]] = {style: luckyExcel.style[borders[bor].style],color: {argb: borders[bor].color }}}}return border}function createCellPos (n) {const ordA = 'A'.charCodeAt(0)const ordZ = 'Z'.charCodeAt(0)const len = ordZ - ordA + 1let s = ''while (n >= 0) {s = String.fromCharCode((n % len) + ordA) + sn = Math.floor(n / len) - 1}return s}export var exportExcel = function (luckysheet, value) {// 1.创建工作簿,可以为工作簿添加属性const workbook = new Excel.Workbook()// 2.创建表格,第二个参数可以配置创建什么样的工作表luckysheet.forEach(function (table) {if (table.data.length === 0) return trueconst worksheet = workbook.addWorksheet(table.name)const merge = (table.config && table.config.merge) || {}const borderInfo = (table.config && table.config.borderInfo) || {}// 3.设置单元格合并,设置单元格边框,设置单元格样式,设置值,导出图片setStyleAndValue(table.data, worksheet)setMerge(merge, worksheet)setBorder(borderInfo, worksheet)setImages(table.images, worksheet, workbook)return true})// 4.写入 bufferconst buffer = workbook.xlsx.writeBuffer().then(data => {const blob = new Blob([data], {type: 'application/vnd.ms-excel;charset=utf-8'})console.log('导出成功!')FileSaver.saveAs(blob, `${value}.xlsx`)})return buffer}

二、创建一个初始Excel表格

0、引入依赖

import LuckyExcel from 'luckyexcel'import {exportExcel } from '@/utils/export'

1、需要一个容器

<!-- luckysheet容器 --><divid="luckysheet"style="margin: 0px; padding: 0px; position: absolute; width: 100%; left: 0px; top: 0px; bottom: 0px; z-index: 0"></div>

2、需要一个配置文件

options: {container: 'luckysheet', //容器id名title: '测试Excel', // 表 头名lang: 'zh', // 中文showtoolbar: true, // 是否显示工具栏showinfobar: false, // 是否显示顶部信息栏showsheetbar: true // 是否显示底部sheet按钮}

3、创建一个空白表格

window.luckysheet.create(this.options)

4、创建带数据的表格

const data = [{name: 'cell',color: '',index: 1,status: 0,order: 1,celldata: [{r: 0, // 行c: 0, // 列v: '姓名' // 值},{r: 1, // 行c: 0, // 列v: '张三' // 值},{r: 2, // 行c: 0, // 列v: '李四' // 值},{r: 3, // 行c: 0, // 列v: '王五' // 值},{r: 0,c: 1,v: '年龄'},{r: 1,c: 1,v: '1'},{r: 2,c: 1,v: '2'},{r: 3,c: 1,v: '3'}],config: {}},{name: 'Sheet2',color: '',index: 1,status: 0,order: 1,celldata: [],config: {}},{name: 'Sheet3',color: '',index: 2,status: 0,order: 2,celldata: [],config: {}}]window.luckysheet.destroy()this.options.data = datawindow.luckysheet.create(this.options)}

三、导入本地Excel创建

只需要拿到files数据源传入即可

LuckyExcel.transformExcelToLucky(files, (exportJson, luckysheetfile) => {if (exportJson.sheets === null || exportJson.sheets.length === 0) {this.$message.error('无法读取excel文件的内容,当前不支持xls文件!')return}window.luckysheet.destroy()this.options.data = exportJson.sheetsconsole.log('数据', this.options.data)window.luckysheet.create(this.options)})

四、导出

exportExcel(window.luckysheet.getAllSheets(), this.name)

五、git地址

/Aseoe/ant-design-vue-pro

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。